Compare commits
2 Commits
master
...
tempo-map-
Author | SHA1 | Date |
---|---|---|
Robin Gareus | 991ab1f8f8 | |
Robin Gareus | c437d6f886 |
|
@ -44,7 +44,6 @@ tags
|
|||
.waf3-*
|
||||
.lock-waf*
|
||||
/build/
|
||||
/.cache
|
||||
/doc/html/
|
||||
/doc/latex/
|
||||
/doc/ardourapi.json.gz
|
||||
|
@ -59,8 +58,6 @@ tags
|
|||
/libs/ardour/libardour.pot
|
||||
/libs/gtkmm2ext/po/*.mo
|
||||
/libs/gtkmm2ext/libgtkmm2ext.pot
|
||||
/libs/tk/ytk/po/*.mo
|
||||
/libs/tk/ytk/*.pot
|
||||
/gtk2_ardour/appdata/po/*.mo
|
||||
/gtk2_ardour/appdata/*.pot
|
||||
/gtk2_ardour/ardour.appdata.xml.in
|
||||
|
|
22
COPYING
22
COPYING
|
@ -6,28 +6,6 @@
|
|||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Plugin Clarification
|
||||
|
||||
The following states the Ardour developers understanding of the
|
||||
relationship between Ardour's license (GPL v2.0 or later) and plugins.
|
||||
|
||||
For the purposes of this understanding, "plugins" refer to software
|
||||
dynamically loaded by another program, where the interaction between the
|
||||
plugin and the loading program (typically called "the host") is defined by
|
||||
a 3rd party API. Such APIs include (but are not limited to) VST,
|
||||
AudioUnits, LV2, LADSPA and CLAP.
|
||||
|
||||
Since (a) any such plugin may be loaded by any host that supports the API
|
||||
and (b) any host may load any plugin that supports the API, we consider it
|
||||
self-evident that there can be no "derivative" relationship (in the sense
|
||||
of the GPL's use of this term) between the host and plugin.
|
||||
|
||||
Consequently, Ardour may load arbitrarily licensed plugins, so as to cause
|
||||
interactions between Ardour and the plugin via a 3rd party API, without any
|
||||
implications for either Ardour or the plugin. In our understanding, Using
|
||||
such plugins with Ardour is not impacted in any way by Ardour's GPL licensing.
|
||||
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
|
|
|
@ -2009,6 +2009,10 @@
|
|||
RelativePath="..\gtk2_ardour\midi_region_view.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\gtk2_ardour\midi_scroomer.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\gtk2_ardour\midi_selection.h"
|
||||
>
|
||||
|
|
|
@ -9,4 +9,4 @@ on `git describe` (a full git clone is needed for this) or alternatively a
|
|||
version-file in the release-dist. Github cannot provide the latter and also
|
||||
does not allow to inject a version-file during export archiving.
|
||||
|
||||
For further information see https://tracker.ardour.org/view.php?id=7328
|
||||
For further information see http://tracker.ardour.org/view.php?id=7328
|
||||
|
|
|
@ -34,8 +34,7 @@ table for details.
|
|||
|
||||
Here is the best workflow for existing translations.
|
||||
|
||||
1. Configure Ardour build with the './waf configure' command.
|
||||
1a. Build Ardour using './waf' command (this step is actually optional).
|
||||
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
|
||||
|
@ -90,7 +89,7 @@ master branch. That should generate a file called something like
|
|||
|
||||
3. Run 'bzip2 0001-Update-German-translation.patch' to compress the file.
|
||||
|
||||
4. File a new bug report at https://tracker.ardour.org and attach the resulted
|
||||
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.
|
||||
|
||||
|
@ -131,7 +130,7 @@ Not every PO editor can calculate the equation for the plural forms in your
|
|||
language, but you can look it up in headers of PO files from some application
|
||||
such a GIMP or Inkscape. Here is an example for Russian:
|
||||
|
||||
https://git.gnome.org/browse/gimp/plain/po/ru.po
|
||||
http://git.gnome.org/browse/gimp/plain/po/ru.po
|
||||
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
||||
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); 10<=4 && (n%100<10 || n"
|
||||
|
|
4
ardour.1
4
ardour.1
|
@ -60,6 +60,6 @@ Use given template for new session
|
|||
\fB\-v\fR, \fB\-\-version\fR
|
||||
Print version and exit
|
||||
.SH "REPORTING BUGS"
|
||||
Report bugs to https://tracker.ardour.org
|
||||
Report bugs to http://tracker.ardour.org
|
||||
.br
|
||||
Website https://ardour.org
|
||||
Website http://ardour.org
|
||||
|
|
|
@ -778,11 +778,7 @@ INPUT = ../libs/ardour \
|
|||
../libs/widgets \
|
||||
../libs/zita-convolver \
|
||||
../libs/zita-resampler \
|
||||
../libs/zita-resampler \
|
||||
../gtk2_ardour \
|
||||
../libs/tk/ytkmm/ytkmm/gtkmm \
|
||||
../libs/tk/ydkmm/ydkmm/gdkmm \
|
||||
../libs/tk/ydk/ydk/gdk \
|
||||
mainpage.txt
|
||||
|
||||
## audiographer assumes it's documented separately (has it's own @mainpage)
|
||||
|
|
|
@ -1,71 +0,0 @@
|
|||
What's going on with drawing sharp, odd-pixel-width lines in Cairo?
|
||||
-------------------------------------------------------------------
|
||||
|
||||
First read the Cairo FAQ entry:
|
||||
|
||||
https://www.cairographics.org/FAQ/#sharp_lines
|
||||
|
||||
Here is a slightly different explanation, based on our
|
||||
understanding as of July 2023:
|
||||
|
||||
There are no pixels on integer positions; if you draw a
|
||||
single pixel line on any such integer position, it will
|
||||
(half) shade the row/col of pixels on either side of that
|
||||
position. The pixels are actually at N.5.
|
||||
|
||||
If the line width is a multiple of two, then the row/col of
|
||||
pixels on either side of the integer coordinate will both be
|
||||
full shaded. So if you draw a 2-pixel wide line at 1.0, the
|
||||
pixel rows/cols at 0.5 and 1.5 will both be fully shaded and
|
||||
you get what you asked for: 2 rows/cols of pixels that are
|
||||
visible as intended.
|
||||
|
||||
However, if you want to shade just a single (sharp) row/col
|
||||
of pixels, you must do so at N.5, which is where the pixels
|
||||
actually "are". The first such row/col is at 0.5. the
|
||||
second row/col is at 1.5 etc. etc.
|
||||
|
||||
So ... to draw a single pixel line on the first row/col, the
|
||||
relevant x/y coordinate is 0.5.
|
||||
|
||||
Consequently, if you are drawing lines that can ever be an
|
||||
odd number of pixels in width, you MUST shift the
|
||||
coordinates by + (line_width * 0.5) in order to shade only
|
||||
the pixels at that position (and adjacent ones, if the line
|
||||
is 3, 5, 7 etc. pixels wide).
|
||||
|
||||
|
||||
Below is a tiny test program that will allow you to
|
||||
experiment with 0.5 offset to see its effect (it generates
|
||||
/tmp/out.png which you should look at with a tool that can
|
||||
zoom in to view pixels easily)
|
||||
|
||||
// gcc -o cairo-test cairo-test.c `pkg-config --cflags --libs cairo`
|
||||
#include <stdio.h>
|
||||
#include <cairo/cairo.h>
|
||||
|
||||
int main (int argc, char **argv) {
|
||||
char* fn = "/tmp/out.png";
|
||||
|
||||
cairo_surface_t* cs = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 100, 100);
|
||||
cairo_t* cr = cairo_create (cs);
|
||||
|
||||
cairo_set_source_rgba (cr, 1, 1, 1, 1);
|
||||
|
||||
cairo_set_line_width (cr, 1);
|
||||
|
||||
/* Experiment with using 0., 0.5, -0.5 and more for the value
|
||||
* of y, and check which rows of pixels are shaded as a result.
|
||||
*/
|
||||
|
||||
double y = 0.5;
|
||||
|
||||
cairo_move_to (cr, 0, y);
|
||||
cairo_line_to (cr, 100.5, y);
|
||||
cairo_stroke (cr);
|
||||
|
||||
cairo_surface_write_to_png (cs, fn);
|
||||
cairo_destroy (cr);
|
||||
cairo_surface_destroy (cs);
|
||||
return 0;
|
||||
}
|
|
@ -114,7 +114,7 @@ libs/
|
|||
- libs/backends/
|
||||
(uses libpdb, ardouralsautil | appleutility, implements libardour interface)
|
||||
Interaction with Operating System's Audio/MIDI API:
|
||||
ALSA, CoreAudio, JACK, PortAudio/ASIO, PulseAudio
|
||||
ALSA, CoreAudio, JACK, PortAudio/ASIO, Pulseaudio
|
||||
|
||||
- libs/surfaces/
|
||||
(uses libpbd, libevoral, libtimecode, libardour ;; libgtkmm2ext, libcanvas)
|
||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,217 @@
|
|||
; ardour-2.2 GtkAccelMap rc-file -*- scheme -*-
|
||||
; this file is a hand-edited map that is processed by scons
|
||||
; to produce a real accelmap.
|
||||
;
|
||||
|
||||
;; punctuation
|
||||
(gtk_accel_path "<Actions>/Editor/center-playhead" "Escape")
|
||||
(gtk_accel_path "<Actions>/Transport/ToggleRoll" "space")
|
||||
(gtk_accel_path "<Actions>/Transport/ToggleRollForgetCapture" "<@PRIMARY@>period")
|
||||
(gtk_accel_path "<Actions>/Transport/record-roll" "<@PRIMARY@>space")
|
||||
(gtk_accel_path "<Actions>/Editor/play-from-edit-point-and-return" "<@LEVEL4@>space")
|
||||
|
||||
(gtk_accel_path "<Actions>/Common/ToggleOptionsEditor" "<@PRIMARY@>comma")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/align-regions-end" "<@PRIMARY@><@SECONDARY@>less")
|
||||
(gtk_accel_path "<Actions>/Editor/align-regions-end-relative" "<@PRIMARY@>less")
|
||||
(gtk_accel_path "<Actions>/Editor/align-regions-start" "<@LEVEL4@><@SECONDARY@>less")
|
||||
(gtk_accel_path "<Actions>/Editor/align-regions-start-relative" "<@LEVEL4@>less")
|
||||
(gtk_accel_path "<Actions>/Editor/align-regions-sync" "<@SECONDARY@>less")
|
||||
(gtk_accel_path "<Actions>/Editor/align-regions-sync-relative" "less")
|
||||
|
||||
; (gtk_accel_path "<Actions>/Editor/edit-cursor-to-next-region-sync" "semicolon")
|
||||
; (gtk_accel_path "<Actions>/Editor/edit-cursor-to-previous-region-sync" "apostrophe")
|
||||
(gtk_accel_path "<Actions>/Editor/cycle-edit-point" "asciicircum")
|
||||
(gtk_accel_path "<Actions>/Editor/cycle-edit-point-with-marker" "<@SECONDARY@>asciicircum")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/extend-range-to-end-of-region" "rightanglebracket")
|
||||
(gtk_accel_path "<Actions>/Editor/extend-range-to-start-of-region" "leftanglebracket")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/trim-from-start" "<@TERTIARY@>braceleft")
|
||||
(gtk_accel_path "<Actions>/Editor/trim-to-end" "<@TERTIARY@>braceright")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/play-from-edit-point-and-return" "<@LEVEL4@>space")
|
||||
(gtk_accel_path "<Actions>/Editor/play-edit-range" "<@SECONDARY@>space")
|
||||
|
||||
;; letters
|
||||
|
||||
;; OBERE ZEILE
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/set-fade-in-length" "q")
|
||||
(gtk_accel_path "<Actions>/Common/Quit" "<@PRIMARY@>q")
|
||||
(gtk_accel_path "<Actions>/Editor/toggle-region-fade-in" "<@SECONDARY@>q")
|
||||
(gtk_accel_path "<Actions>/Editor/set-playhead" "w")
|
||||
;; note that ctrl-w is special and consumed by the keyboard snooper
|
||||
|
||||
|
||||
(gtk_accel_path "<Actions>/Main/Close" "<@PRIMARY@>w")
|
||||
(gtk_accel_path "<Actions>/Editor/set-fade-out-length" "e")
|
||||
(gtk_accel_path "<Actions>/Main/ExportSession" "<@PRIMARY@>e")
|
||||
(gtk_accel_path "<Actions>/Editor/toggle-region-fade-out" "<@SECONDARY@>e")
|
||||
(gtk_accel_path "<Actions>/Editor/export-region" "<@PRIMARY@><@TERTIARY@>e")
|
||||
(gtk_accel_path "<Actions>/Editor/show-editor-mixer" "<@TERTIARY@>e")
|
||||
; (gtk_accel_path "<Actions>/Common/goto-editor" "<@SECONDARY@>e")
|
||||
(gtk_accel_path "<Actions>/Editor/redo" "<@PRIMARY@><@TERTIARY@>z")
|
||||
(gtk_accel_path "<Actions>/Transport/Record" "<@TERTIARY@>r")
|
||||
(gtk_accel_path "<Actions>/Editor/temporal-zoom-out" "r")
|
||||
(gtk_accel_path "<Actions>/Transport/Record" "<@TERTIARY@>r")
|
||||
(gtk_accel_path "<Actions>/Editor/reverse-region" "<@LEVEL4@>r")
|
||||
(gtk_accel_path "<Actions>/Editor/temporal-zoom-in" "t")
|
||||
(gtk_accel_path "<Actions>/Common/ToggleThemeManager" "<@WINDOW@>t")
|
||||
(gtk_accel_path "<Actions>/Editor/pitch-shift-region" "<@LEVEL4@>t")
|
||||
(gtk_accel_path "<Actions>/Editor/split-region" "y")
|
||||
(gtk_accel_path "<Actions>/Editor/set-region-sync-position" "u")
|
||||
(gtk_accel_path "<Actions>/Editor/insert-region-from-region-list" "i")
|
||||
(gtk_accel_path "<Actions>/Editor/addExistingAudioFiles" "<@PRIMARY@>i")
|
||||
(gtk_accel_path "<Actions>/Common/invert-selection" "<@TERTIARY@>i")
|
||||
(gtk_accel_path "<Actions>/Main/Open" "<@PRIMARY@>o")
|
||||
(gtk_accel_path "<Actions>/Main/Recent" "<@PRIMARY@><@TERTIARY@>o")
|
||||
(gtk_accel_path "<Actions>/Editor/naturalize-region" "<@LEVEL4@>o")
|
||||
(gtk_accel_path "<Actions>/Transport/TogglePunch" "p")
|
||||
(gtk_accel_path "<Actions>/Editor/select-all-in-punch-range" "<@TERTIARY@>p")
|
||||
|
||||
;; MITTELZEILE
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/trim-front" "a")
|
||||
(gtk_accel_path "<Actions>/Editor/select-all" "<@PRIMARY@>a")
|
||||
(gtk_accel_path "<Actions>/Editor/select-all-between-cursors" "<@TERTIARY@>a")
|
||||
(gtk_accel_path "<Actions>/Editor/select-all-between-cursors" "<@TERTIARY@><@SECONDARY@>a")
|
||||
(gtk_accel_path "<Actions>/Editor/play-selected-regions" "s")
|
||||
(gtk_accel_path "<Actions>/Common/Save" "<@PRIMARY@>s")
|
||||
(gtk_accel_path "<Actions>/Main/Snapshot" "<@PRIMARY@><@TERTIARY@>s")
|
||||
(gtk_accel_path "<Actions>/Editor/trim-back" "d")
|
||||
(gtk_accel_path "<Actions>/Editor/duplicate-region" "<@PRIMARY@>d")
|
||||
(gtk_accel_path "<Actions>/Editor/multi-duplicate-region" "<@PRIMARY@><@TERTIARY@>d")
|
||||
(gtk_accel_path "<Actions>/Editor/toggle-follow-playhead" "f")
|
||||
(gtk_accel_path "<Actions>/Editor/show-rhythm-ferret" "<@WINDOW@>f")
|
||||
; (gtk_accel_path "<Actions>/Editor/set-edit-point" "g")
|
||||
; (gtk_accel_path "<Actions>/MouseMode/set-mouse-mode-gain" "g")
|
||||
(gtk_accel_path "<Actions>/Editor/nudge-backward" "g")
|
||||
(gtk_accel_path "<Actions>/Editor/nudge-forward" "h")
|
||||
(gtk_accel_path "<Actions>/Common/ToggleKeyEditor" "<@SECONDARY@>k")
|
||||
(gtk_accel_path "<Actions>/Common/ToggleLocations" "<@SECONDARY@>l")
|
||||
(gtk_accel_path "<Actions>/Transport/Loop" "l")
|
||||
(gtk_accel_path "<Actions>/Editor/toggle-region-lock" "<@LEVEL4@>l")
|
||||
(gtk_accel_path "<Actions>/Editor/select-all-in-loop-range" "<@TERTIARY@>l")
|
||||
|
||||
;; UNTERE ZEILE
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/zoom-to-region" "z")
|
||||
(gtk_accel_path "<Actions>/Editor/undo" "<@PRIMARY@>z")
|
||||
(gtk_accel_path "<Actions>/Editor/zoom-to-session" "<@SECONDARY@>z")
|
||||
(gtk_accel_path "<Actions>/Editor/toggle-zoom" "<@TERTIARY@>z")
|
||||
(gtk_accel_path "<Actions>/Editor/editor-separate" "x")
|
||||
(gtk_accel_path "<Actions>/Editor/editor-cut" "<@PRIMARY@>x")
|
||||
(gtk_accel_path "<Actions>/Editor/crop" "c")
|
||||
(gtk_accel_path "<Actions>/Editor/editor-copy" "<@PRIMARY@>c")
|
||||
(gtk_accel_path "<Actions>/Common/ToggleColorManager" "<@SECONDARY@>c")
|
||||
(gtk_accel_path "<Actions>/Editor/editor-paste" "<@PRIMARY@>v")
|
||||
(gtk_accel_path "<Actions>/Editor/add-location-from-playhead" "b")
|
||||
(gtk_accel_path "<Actions>/Common/ToggleBigClock" "<@SECONDARY@>b")
|
||||
(gtk_accel_path "<Actions>/Editor/normalize-region" "n")
|
||||
(gtk_accel_path "<Actions>/Main/New" "<@PRIMARY@>n")
|
||||
(gtk_accel_path "<Actions>/Main/AddTrackBus" "<@PRIMARY@><@TERTIARY@>n")
|
||||
(gtk_accel_path "<Actions>/Common/toggle-editor-mixer-on-top" "<@SECONDARY@>m")
|
||||
(gtk_accel_path "<Actions>/Editor/add-location-from-playhead" "KP_Enter")
|
||||
(gtk_accel_path "<Actions>/Editor/toggle-region-mute" "m")
|
||||
|
||||
;; arrow keys, navigation etc.
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/playhead-to-edit" "Return")
|
||||
(gtk_accel_path "<Actions>/Editor/edit-to-playhead" "<@SECONDARY@>Return")
|
||||
(gtk_accel_path "<Actions>/Editor/editor-delete" "BackSpace")
|
||||
(gtk_accel_path "<Actions>/Editor/remove-last-capture" "<@PRIMARY@>Delete")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/playhead-to-previous-region-boundary-noselection" "<@LEVEL4@>leftarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/playhead-to-previous-region-boundary" "leftarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/playhead-backward-to-grid" "<@TERTIARY@><@LEVEL4@>leftarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/edit-cursor-to-previous-region-sync" "<@TERTIARY@><@SECONDARY@>leftarrow")
|
||||
(gtk_accel_path "<Actions>/Transport/Rewind" "<@PRIMARY@>leftarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/tab-to-transient-backwards" "<@SECONDARY@>leftarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/nudge-playhead-backward" "<@TERTIARY@>leftarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/jump-backward-to-mark" "<@PRIMARY@><@SECONDARY@>leftarrow")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/selected-marker-to-previous-region-boundary" "<@PRIMARY@><@TERTIARY@>leftarrow")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/playhead-to-next-region-boundary-noselection" "<@LEVEL4@>rightarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/playhead-to-next-region-boundary" "rightarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/playhead-forward-to-grid" "<@TERTIARY@><@LEVEL4@>rightarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/edit-cursor-to-next-region-sync" "<@TERTIARY@><@SECONDARY@>leftarrow")
|
||||
(gtk_accel_path "<Actions>/Transport/Forward" "<@PRIMARY@>rightarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/tab-to-transient-forwards" "<@SECONDARY@>rightarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/nudge-playhead-forward" "<@TERTIARY@>rightarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/jump-forward-to-mark" "<@PRIMARY@><@SECONDARY@>rightarrow")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/selected-marker-to-next-region-boundary" "<@PRIMARY@><@TERTIARY@>rightarrow")
|
||||
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/scroll-tracks-down" "Page_Down")
|
||||
(gtk_accel_path "<Actions>/Editor/scroll-tracks-up" "Page_Up")
|
||||
|
||||
(gtk_accel_path "<Actions>/Transport/GotoEnd" "End")
|
||||
(gtk_accel_path "<Actions>/Editor/select-all-after-edit-cursor" "<@PRIMARY@><@TERTIARY@>End")
|
||||
(gtk_accel_path "<Actions>/Editor/select-all-after-playhead" "<@TERTIARY@>End")
|
||||
|
||||
(gtk_accel_path "<Actions>/Transport/GotoStart" "Home")
|
||||
(gtk_accel_path "<Actions>/Editor/select-all-before-edit-cursor" "<@PRIMARY@><@TERTIARY@>Home")
|
||||
(gtk_accel_path "<Actions>/Editor/select-all-before-playhead" "<@TERTIARY@>Home")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/select-prev-route" "uparrow")
|
||||
(gtk_accel_path "<Actions>/Transport/TransitionToRoll" "<@PRIMARY@>uparrow")
|
||||
(gtk_accel_path "<Actions>/Editor/move-selected-tracks-up" "<@TERTIARY@>uparrow")
|
||||
(gtk_accel_path "<Actions>/Editor/select-next-route" "downarrow")
|
||||
(gtk_accel_path "<Actions>/Transport/TransitionToReverse" "<@PRIMARY@>downarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/move-selected-tracks-down" "<@TERTIARY@>downarrow")
|
||||
|
||||
;; keypad
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/finish-add-range" "<@TERTIARY@><@PRIMARY@>KP_Up")
|
||||
(gtk_accel_path "<Actions>/Editor/goto-mark-1" "KP_1")
|
||||
(gtk_accel_path "<Actions>/Editor/goto-mark-2" "KP_2")
|
||||
(gtk_accel_path "<Actions>/Editor/goto-mark-3" "KP_3")
|
||||
(gtk_accel_path "<Actions>/Editor/goto-mark-4" "KP_4")
|
||||
(gtk_accel_path "<Actions>/Editor/goto-mark-5" "KP_5")
|
||||
(gtk_accel_path "<Actions>/Editor/goto-mark-6" "KP_6")
|
||||
(gtk_accel_path "<Actions>/Editor/goto-mark-7" "KP_7")
|
||||
(gtk_accel_path "<Actions>/Editor/goto-mark-8" "KP_8")
|
||||
(gtk_accel_path "<Actions>/Editor/goto-mark-9" "KP_9")
|
||||
(gtk_accel_path "<Actions>/Editor/nudge-next-backward" "<@PRIMARY@>KP_Subtract")
|
||||
(gtk_accel_path "<Actions>/Editor/cut-region-gain" "KP_Subtract")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/nudge-next-forward" "<@PRIMARY@>KP_Add")
|
||||
(gtk_accel_path "<Actions>/Editor/boost-region-gain" "KP_Add")
|
||||
|
||||
(gtk_accel_path "<Actions>/Transport/GotoZero" "KP_Insert")
|
||||
|
||||
;; F-N keys
|
||||
|
||||
; (gtk_accel_path "<Actions>/Editor/start-range" "F1")
|
||||
; (gtk_accel_path "<Actions>/Editor/edit-cursor-to-range-start" "<@TERTIARY@>F1")
|
||||
; (gtk_accel_path "<Actions>/Editor/finish-range" "F2")
|
||||
; (gtk_accel_path "<Actions>/Editor/edit-cursor-to-range-end" "<@TERTIARY@>F2")
|
||||
; (gtk_accel_path "<Actions>/Editor/brush-at-mouse" "F3")
|
||||
(gtk_accel_path "<Actions>/Editor/step-mouse-mode" "F1")
|
||||
(gtk_accel_path "<Actions>/Common/ToggleMaximalEditor" "F2")
|
||||
|
||||
|
||||
|
||||
|
||||
;; numbers
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/toggle-edit-mode" "1")
|
||||
(gtk_accel_path "<Actions>/Editor/cycle-snap-mode" "2")
|
||||
(gtk_accel_path "<Actions>/Editor/cycle-snap-choice" "3")
|
||||
(gtk_accel_path "<Actions>/Transport/ToggleAutoPlay" "4")
|
||||
(gtk_accel_path "<Actions>/Transport/ToggleAutoReturn" "5")
|
||||
(gtk_accel_path "<Actions>/Transport/ToggleAutoInput" "6")
|
||||
(gtk_accel_path "<Actions>/Transport/ToggleClick" "7")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/set-loop-from-edit-range" "8")
|
||||
(gtk_accel_path "<Actions>/Editor/set-loop-from-region" "<@LEVEL4@>8")
|
||||
; (gtk_accel_path "<Actions>/Editor/loop-region" "<@PRIMARY@>8")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/set-punch-from-edit-range" "9")
|
||||
(gtk_accel_path "<Actions>/Editor/set-punch-from-region" "<@LEVEL4@>9")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/set-tempo-from-region" "<@LEVEL4@>0")
|
||||
(gtk_accel_path "<Actions>/Editor/set-tempo-from-edit-range" "0")
|
|
@ -0,0 +1,217 @@
|
|||
; ardour-2.2 GtkAccelMap rc-file -*- scheme -*-
|
||||
; this file is a hand-edited map that is processed by scons
|
||||
; to produce a real accelmap.
|
||||
;
|
||||
|
||||
;; punctuation
|
||||
(gtk_accel_path "<Actions>/Editor/center-playhead" "Escape")
|
||||
(gtk_accel_path "<Actions>/Transport/ToggleRoll" "space")
|
||||
(gtk_accel_path "<Actions>/Transport/ToggleRollForgetCapture" "<@PRIMARY@>period")
|
||||
(gtk_accel_path "<Actions>/Transport/record-roll" "<@PRIMARY@>space")
|
||||
(gtk_accel_path "<Actions>/Editor/play-from-edit-point-and-return" "<@LEVEL4@>space")
|
||||
|
||||
(gtk_accel_path "<Actions>/Common/ToggleOptionsEditor" "<@PRIMARY@>comma")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/align-regions-end" "<@PRIMARY@><@SECONDARY@>less")
|
||||
(gtk_accel_path "<Actions>/Editor/align-regions-end-relative" "<@PRIMARY@>less")
|
||||
(gtk_accel_path "<Actions>/Editor/align-regions-start" "<@LEVEL4@><@SECONDARY@>less")
|
||||
(gtk_accel_path "<Actions>/Editor/align-regions-start-relative" "<@LEVEL4@>less")
|
||||
(gtk_accel_path "<Actions>/Editor/align-regions-sync" "<@SECONDARY@>less")
|
||||
(gtk_accel_path "<Actions>/Editor/align-regions-sync-relative" "less")
|
||||
|
||||
; (gtk_accel_path "<Actions>/Editor/edit-cursor-to-next-region-sync" "semicolon")
|
||||
; (gtk_accel_path "<Actions>/Editor/edit-cursor-to-previous-region-sync" "apostrophe")
|
||||
(gtk_accel_path "<Actions>/Editor/cycle-edit-point" "asciicircum")
|
||||
(gtk_accel_path "<Actions>/Editor/cycle-edit-point-with-marker" "<@SECONDARY@>asciicircum")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/extend-range-to-end-of-region" "rightanglebracket")
|
||||
(gtk_accel_path "<Actions>/Editor/extend-range-to-start-of-region" "leftanglebracket")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/trim-from-start" "<@TERTIARY@>braceleft")
|
||||
(gtk_accel_path "<Actions>/Editor/trim-to-end" "<@TERTIARY@>braceright")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/play-from-edit-point-and-return" "<@LEVEL4@>space")
|
||||
(gtk_accel_path "<Actions>/Editor/play-edit-range" "<@SECONDARY@>space")
|
||||
|
||||
;; letters
|
||||
|
||||
;; OBERE ZEILE
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/set-fade-in-length" "q")
|
||||
(gtk_accel_path "<Actions>/Common/Quit" "<@PRIMARY@>q")
|
||||
(gtk_accel_path "<Actions>/Editor/toggle-region-fade-in" "<@SECONDARY@>q")
|
||||
(gtk_accel_path "<Actions>/Editor/set-playhead" "w")
|
||||
;; note that ctrl-w is special and consumed by the keyboard snooper
|
||||
|
||||
|
||||
(gtk_accel_path "<Actions>/Main/Close" "<@PRIMARY@>w")
|
||||
(gtk_accel_path "<Actions>/Editor/set-fade-out-length" "e")
|
||||
(gtk_accel_path "<Actions>/Main/ExportSession" "<@PRIMARY@>e")
|
||||
(gtk_accel_path "<Actions>/Editor/toggle-region-fade-out" "<@SECONDARY@>e")
|
||||
(gtk_accel_path "<Actions>/Editor/export-region" "<@PRIMARY@><@TERTIARY@>e")
|
||||
(gtk_accel_path "<Actions>/Editor/show-editor-mixer" "<@TERTIARY@>e")
|
||||
; (gtk_accel_path "<Actions>/Common/goto-editor" "<@SECONDARY@>e")
|
||||
(gtk_accel_path "<Actions>/Editor/redo" "<@PRIMARY@><@TERTIARY@>z")
|
||||
(gtk_accel_path "<Actions>/Transport/Record" "<@TERTIARY@>r")
|
||||
(gtk_accel_path "<Actions>/Editor/temporal-zoom-out" "r")
|
||||
(gtk_accel_path "<Actions>/Transport/Record" "<@TERTIARY@>r")
|
||||
(gtk_accel_path "<Actions>/Editor/reverse-region" "<@LEVEL4@>r")
|
||||
(gtk_accel_path "<Actions>/Editor/temporal-zoom-in" "t")
|
||||
(gtk_accel_path "<Actions>/Common/ToggleThemeManager" "<@SECONDARY@>t")
|
||||
(gtk_accel_path "<Actions>/Editor/pitch-shift-region" "<@LEVEL4@>t")
|
||||
(gtk_accel_path "<Actions>/Editor/split-region" "y")
|
||||
(gtk_accel_path "<Actions>/Editor/set-region-sync-position" "u")
|
||||
(gtk_accel_path "<Actions>/Editor/insert-region-from-region-list" "i")
|
||||
(gtk_accel_path "<Actions>/Editor/addExistingAudioFiles" "<@PRIMARY@>i")
|
||||
(gtk_accel_path "<Actions>/Common/invert-selection" "<@TERTIARY@>i")
|
||||
(gtk_accel_path "<Actions>/Main/Open" "<@PRIMARY@>o")
|
||||
(gtk_accel_path "<Actions>/Main/Recent" "<@PRIMARY@><@TERTIARY@>o")
|
||||
(gtk_accel_path "<Actions>/Editor/naturalize-region" "<@LEVEL4@>o")
|
||||
(gtk_accel_path "<Actions>/Transport/TogglePunch" "p")
|
||||
(gtk_accel_path "<Actions>/Editor/select-all-in-punch-range" "<@TERTIARY@>p")
|
||||
|
||||
;; MITTELZEILE
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/trim-front" "a")
|
||||
(gtk_accel_path "<Actions>/Editor/select-all" "<@PRIMARY@>a")
|
||||
(gtk_accel_path "<Actions>/Editor/select-all-between-cursors" "<@TERTIARY@>a")
|
||||
(gtk_accel_path "<Actions>/Editor/select-all-between-cursors" "<@TERTIARY@><@SECONDARY@>a")
|
||||
(gtk_accel_path "<Actions>/Editor/play-selected-regions" "s")
|
||||
(gtk_accel_path "<Actions>/Common/Save" "<@PRIMARY@>s")
|
||||
(gtk_accel_path "<Actions>/Main/Snapshot" "<@PRIMARY@><@TERTIARY@>s")
|
||||
(gtk_accel_path "<Actions>/Editor/trim-back" "d")
|
||||
(gtk_accel_path "<Actions>/Editor/duplicate-region" "<@PRIMARY@>d")
|
||||
(gtk_accel_path "<Actions>/Editor/multi-duplicate-region" "<@PRIMARY@><@TERTIARY@>d")
|
||||
(gtk_accel_path "<Actions>/Editor/toggle-follow-playhead" "f")
|
||||
(gtk_accel_path "<Actions>/Editor/show-rhythm-ferret" "<@SECONDARY@>f")
|
||||
; (gtk_accel_path "<Actions>/Editor/set-edit-point" "g")
|
||||
; (gtk_accel_path "<Actions>/MouseMode/set-mouse-mode-gain" "g")
|
||||
(gtk_accel_path "<Actions>/Editor/nudge-backward" "g")
|
||||
(gtk_accel_path "<Actions>/Editor/nudge-forward" "h")
|
||||
(gtk_accel_path "<Actions>/Common/ToggleKeyEditor" "<@SECONDARY@>k")
|
||||
(gtk_accel_path "<Actions>/Common/ToggleLocations" "<@SECONDARY@>l")
|
||||
(gtk_accel_path "<Actions>/Transport/Loop" "l")
|
||||
(gtk_accel_path "<Actions>/Editor/toggle-region-lock" "<@LEVEL4@>l")
|
||||
(gtk_accel_path "<Actions>/Editor/select-all-in-loop-range" "<@TERTIARY@>l")
|
||||
|
||||
;; UNTERE ZEILE
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/zoom-to-region" "z")
|
||||
(gtk_accel_path "<Actions>/Editor/undo" "<@PRIMARY@>z")
|
||||
(gtk_accel_path "<Actions>/Editor/zoom-to-session" "<@SECONDARY@>z")
|
||||
(gtk_accel_path "<Actions>/Editor/toggle-zoom" "<@TERTIARY@>z")
|
||||
(gtk_accel_path "<Actions>/Editor/editor-separate" "x")
|
||||
(gtk_accel_path "<Actions>/Editor/editor-cut" "<@PRIMARY@>x")
|
||||
(gtk_accel_path "<Actions>/Editor/crop" "c")
|
||||
(gtk_accel_path "<Actions>/Editor/editor-copy" "<@PRIMARY@>c")
|
||||
(gtk_accel_path "<Actions>/Common/ToggleColorManager" "<@SECONDARY@>c")
|
||||
(gtk_accel_path "<Actions>/Editor/editor-paste" "<@PRIMARY@>v")
|
||||
(gtk_accel_path "<Actions>/Editor/add-location-from-playhead" "b")
|
||||
(gtk_accel_path "<Actions>/Common/ToggleBigClock" "<@SECONDARY@>b")
|
||||
(gtk_accel_path "<Actions>/Editor/normalize-region" "n")
|
||||
(gtk_accel_path "<Actions>/Main/New" "<@PRIMARY@>n")
|
||||
(gtk_accel_path "<Actions>/Main/AddTrackBus" "<@PRIMARY@><@TERTIARY@>n")
|
||||
(gtk_accel_path "<Actions>/Common/toggle-editor-mixer-on-top" "<@SECONDARY@>m")
|
||||
(gtk_accel_path "<Actions>/Editor/toggle-region-mute" "m")
|
||||
|
||||
;; arrow keys, navigation etc.
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/playhead-to-edit" "Return")
|
||||
(gtk_accel_path "<Actions>/Editor/edit-to-playhead" "<@SECONDARY@>Return")
|
||||
(gtk_accel_path "<Actions>/Editor/editor-delete" "BackSpace")
|
||||
(gtk_accel_path "<Actions>/Editor/remove-last-capture" "<@PRIMARY@>BackSpace")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/playhead-to-previous-region-boundary-noselection" "<@LEVEL4@>leftarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/playhead-to-previous-region-boundary" "leftarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/playhead-backward-to-grid" "<@TERTIARY@><@LEVEL4@>leftarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/edit-cursor-to-previous-region-sync" "<@TERTIARY@><@SECONDARY@>leftarrow")
|
||||
(gtk_accel_path "<Actions>/Transport/Rewind" "<@PRIMARY@>leftarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/tab-to-transient-backwards" "<@SECONDARY@>leftarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/nudge-playhead-backward" "<@TERTIARY@>leftarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/jump-backward-to-mark" "<@PRIMARY@><@SECONDARY@>leftarrow")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/selected-marker-to-previous-region-boundary" "<@PRIMARY@><@TERTIARY@>leftarrow")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/playhead-to-next-region-boundary-noselection" "<@LEVEL4@>rightarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/playhead-to-next-region-boundary" "rightarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/playhead-forward-to-grid" "<@TERTIARY@><@LEVEL4@>rightarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/edit-cursor-to-next-region-sync" "<@TERTIARY@><@SECONDARY@>leftarrow")
|
||||
(gtk_accel_path "<Actions>/Transport/Forward" "<@PRIMARY@>rightarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/tab-to-transient-forwards" "<@SECONDARY@>rightarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/nudge-playhead-forward" "<@TERTIARY@>rightarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/jump-forward-to-mark" "<@PRIMARY@><@SECONDARY@>rightarrow")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/selected-marker-to-next-region-boundary" "<@PRIMARY@><@TERTIARY@>rightarrow")
|
||||
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/scroll-tracks-down" "Page_Down")
|
||||
(gtk_accel_path "<Actions>/Editor/scroll-tracks-up" "Page_Up")
|
||||
|
||||
(gtk_accel_path "<Actions>/Transport/GotoEnd" "End")
|
||||
(gtk_accel_path "<Actions>/Editor/select-all-after-edit-cursor" "<@PRIMARY@><@TERTIARY@>End")
|
||||
(gtk_accel_path "<Actions>/Editor/select-all-after-playhead" "<@TERTIARY@>End")
|
||||
|
||||
(gtk_accel_path "<Actions>/Transport/GotoStart" "Home")
|
||||
(gtk_accel_path "<Actions>/Editor/select-all-before-edit-cursor" "<@PRIMARY@><@TERTIARY@>Home")
|
||||
(gtk_accel_path "<Actions>/Editor/select-all-before-playhead" "<@TERTIARY@>Home")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/select-prev-route" "uparrow")
|
||||
(gtk_accel_path "<Actions>/Transport/TransitionToRoll" "<@PRIMARY@>uparrow")
|
||||
(gtk_accel_path "<Actions>/Editor/move-selected-tracks-up" "<@TERTIARY@>uparrow")
|
||||
(gtk_accel_path "<Actions>/Editor/select-next-route" "downarrow")
|
||||
(gtk_accel_path "<Actions>/Transport/TransitionToReverse" "<@PRIMARY@>downarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/move-selected-tracks-down" "<@TERTIARY@>downarrow")
|
||||
|
||||
;; keypad
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/finish-add-range" "<@TERTIARY@><@PRIMARY@>KP_Up")
|
||||
(gtk_accel_path "<Actions>/Editor/goto-mark-1" "KP_1")
|
||||
(gtk_accel_path "<Actions>/Editor/goto-mark-2" "KP_2")
|
||||
(gtk_accel_path "<Actions>/Editor/goto-mark-3" "KP_3")
|
||||
(gtk_accel_path "<Actions>/Editor/goto-mark-4" "KP_4")
|
||||
(gtk_accel_path "<Actions>/Editor/goto-mark-5" "KP_5")
|
||||
(gtk_accel_path "<Actions>/Editor/goto-mark-6" "KP_6")
|
||||
(gtk_accel_path "<Actions>/Editor/goto-mark-7" "KP_7")
|
||||
(gtk_accel_path "<Actions>/Editor/goto-mark-8" "KP_8")
|
||||
(gtk_accel_path "<Actions>/Editor/goto-mark-9" "KP_9")
|
||||
; (gtk_accel_path "<Actions>/Editor/nudge-next-backward" "<@PRIMARY@>KP_Subtract")
|
||||
(gtk_accel_path "<Actions>/Editor/cut-region-gain" "j")
|
||||
|
||||
; (gtk_accel_path "<Actions>/Editor/nudge-next-forward" "<@PRIMARY@>KP_Add")
|
||||
(gtk_accel_path "<Actions>/Editor/boost-region-gain" "k")
|
||||
|
||||
(gtk_accel_path "<Actions>/Transport/GotoZero" "KP_Insert")
|
||||
|
||||
;; F-N keys
|
||||
|
||||
; (gtk_accel_path "<Actions>/Editor/start-range" "F1")
|
||||
; (gtk_accel_path "<Actions>/Editor/edit-cursor-to-range-start" "<@TERTIARY@>F1")
|
||||
; (gtk_accel_path "<Actions>/Editor/finish-range" "F2")
|
||||
; (gtk_accel_path "<Actions>/Editor/edit-cursor-to-range-end" "<@TERTIARY@>F2")
|
||||
; (gtk_accel_path "<Actions>/Editor/brush-at-mouse" "F3")
|
||||
(gtk_accel_path "<Actions>/Editor/step-mouse-mode" "F1")
|
||||
(gtk_accel_path "<Actions>/Common/ToggleMaximalEditor" "F2")
|
||||
|
||||
|
||||
|
||||
|
||||
;; numbers
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/toggle-edit-mode" "1")
|
||||
(gtk_accel_path "<Actions>/Editor/cycle-snap-mode" "2")
|
||||
(gtk_accel_path "<Actions>/Editor/cycle-snap-choice" "3")
|
||||
(gtk_accel_path "<Actions>/Transport/ToggleAutoPlay" "4")
|
||||
(gtk_accel_path "<Actions>/Transport/ToggleAutoReturn" "5")
|
||||
(gtk_accel_path "<Actions>/Transport/ToggleAutoInput" "6")
|
||||
(gtk_accel_path "<Actions>/Transport/ToggleClick" "7")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/set-loop-from-edit-range" "8")
|
||||
(gtk_accel_path "<Actions>/Editor/set-loop-from-region" "<@LEVEL4@>8")
|
||||
; (gtk_accel_path "<Actions>/Editor/loop-region" "<@PRIMARY@>8")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/set-punch-from-edit-range" "9")
|
||||
(gtk_accel_path "<Actions>/Editor/set-punch-from-region" "<@LEVEL4@>9")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/set-tempo-from-region" "<@LEVEL4@>0")
|
||||
(gtk_accel_path "<Actions>/Editor/set-tempo-from-edit-range" "0")
|
||||
|
|
@ -0,0 +1,431 @@
|
|||
; ardour-2.2 GtkAccelMap rc-file -*- scheme -*-
|
||||
; this file is a hand-edited map that is processed by scons
|
||||
; to produce a real accelmap.
|
||||
;
|
||||
|
||||
;; punctuation
|
||||
(gtk_accel_path "<Actions>/Editor/center-playhead" "Escape")
|
||||
(gtk_accel_path "<Actions>/Transport/ToggleRoll" "space")
|
||||
(gtk_accel_path "<Actions>/Transport/ToggleRollForgetCapture" "<@PRIMARY@>period")
|
||||
(gtk_accel_path "<Actions>/Transport/record-roll" "<@PRIMARY@>space")
|
||||
(gtk_accel_path "<Actions>/Editor/play-from-edit-point-and-return" "<@LEVEL4@>space")
|
||||
(gtk_accel_path "<Actions>/Common/ToggleOptionsEditor" "<@PRIMARY@>comma")
|
||||
(gtk_accel_path "<Actions>/Editor/align-regions-end" "<@PRIMARY@><@SECONDARY@>less")
|
||||
(gtk_accel_path "<Actions>/Editor/align-regions-end-relative" "<@PRIMARY@>less")
|
||||
(gtk_accel_path "<Actions>/Editor/align-regions-start" "<@LEVEL4@><@SECONDARY@>less")
|
||||
(gtk_accel_path "<Actions>/Editor/align-regions-start-relative" "<@LEVEL4@>less")
|
||||
(gtk_accel_path "<Actions>/Editor/align-regions-sync" "<@SECONDARY@>less")
|
||||
(gtk_accel_path "<Actions>/Editor/align-regions-sync-relative" "less")
|
||||
|
||||
; (gtk_accel_path "<Actions>/Editor/edit-cursor-to-next-region-sync" "semicolon")
|
||||
; (gtk_accel_path "<Actions>/Editor/edit-cursor-to-previous-region-sync" "apostrophe")
|
||||
(gtk_accel_path "<Actions>/Editor/cycle-edit-point" "asciicircum")
|
||||
(gtk_accel_path "<Actions>/Editor/cycle-edit-point-with-marker" "<@SECONDARY@>asciicircum")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/extend-range-to-end-of-region" "rightanglebracket")
|
||||
(gtk_accel_path "<Actions>/Editor/extend-range-to-start-of-region" "leftanglebracket")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/trim-from-start" "<@TERTIARY@>braceleft")
|
||||
(gtk_accel_path "<Actions>/Editor/trim-to-end" "<@TERTIARY@>braceright")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/play-from-edit-point-and-return" "<@LEVEL4@>space")
|
||||
(gtk_accel_path "<Actions>/Editor/play-edit-range" "<@SECONDARY@>space")
|
||||
|
||||
;; letters
|
||||
|
||||
;; OBERE ZEILE
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/set-fade-in-length" "q")
|
||||
(gtk_accel_path "<Actions>/Common/Quit" "<@PRIMARY@>q")
|
||||
(gtk_accel_path "<Actions>/Editor/toggle-region-fade-in" "<@SECONDARY@>q")
|
||||
(gtk_accel_path "<Actions>/Editor/set-playhead" "w")
|
||||
;; note that ctrl-w is special and consumed by the keyboard snooper
|
||||
|
||||
|
||||
(gtk_accel_path "<Actions>/Main/Close" "<@PRIMARY@>w")
|
||||
(gtk_accel_path "<Actions>/Editor/set-fade-out-length" "e")
|
||||
(gtk_accel_path "<Actions>/Main/ExportSession" "<@PRIMARY@>e")
|
||||
(gtk_accel_path "<Actions>/Editor/toggle-region-fade-out" "<@SECONDARY@>e")
|
||||
(gtk_accel_path "<Actions>/Editor/export-region" "<@PRIMARY@><@TERTIARY@>e")
|
||||
(gtk_accel_path "<Actions>/Editor/show-editor-mixer" "<@TERTIARY@>e")
|
||||
; (gtk_accel_path "<Actions>/Common/goto-editor" "<@SECONDARY@>e")
|
||||
(gtk_accel_path "<Actions>/Editor/redo" "<@PRIMARY@><@TERTIARY@>z")
|
||||
(gtk_accel_path "<Actions>/Transport/Record" "<@TERTIARY@>r")
|
||||
(gtk_accel_path "<Actions>/Editor/temporal-zoom-out" "r")
|
||||
(gtk_accel_path "<Actions>/Transport/Record" "<@TERTIARY@>r")
|
||||
(gtk_accel_path "<Actions>/Editor/reverse-region" "<@LEVEL4@>r")
|
||||
(gtk_accel_path "<Actions>/Editor/temporal-zoom-in" "t")
|
||||
(gtk_accel_path "<Actions>/Common/ToggleThemeManager" "<@WINDOW@>t")
|
||||
(gtk_accel_path "<Actions>/Editor/pitch-shift-region" "<@LEVEL4@>t")
|
||||
(gtk_accel_path "<Actions>/Editor/split-region" "z")
|
||||
(gtk_accel_path "<Actions>/Editor/set-region-sync-position" "u")
|
||||
(gtk_accel_path "<Actions>/Editor/insert-region-from-region-list" "i")
|
||||
(gtk_accel_path "<Actions>/Editor/addExistingAudioFiles" "<@PRIMARY@>i")
|
||||
(gtk_accel_path "<Actions>/Common/invert-selection" "<@TERTIARY@>i")
|
||||
(gtk_accel_path "<Actions>/Main/Open" "<@PRIMARY@>o")
|
||||
(gtk_accel_path "<Actions>/Main/Recent" "<@PRIMARY@><@TERTIARY@>o")
|
||||
(gtk_accel_path "<Actions>/Editor/naturalize-region" "<@LEVEL4@>o")
|
||||
(gtk_accel_path "<Actions>/Transport/TogglePunch" "p")
|
||||
(gtk_accel_path "<Actions>/Editor/select-all-in-punch-range" "<@TERTIARY@>p")
|
||||
|
||||
;; MITTELZEILE
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/trim-front" "a")
|
||||
(gtk_accel_path "<Actions>/Editor/select-all" "<@PRIMARY@>a")
|
||||
(gtk_accel_path "<Actions>/Editor/select-all-between-cursors" "<@TERTIARY@>a")
|
||||
(gtk_accel_path "<Actions>/Editor/select-all-between-cursors" "<@TERTIARY@><@SECONDARY@>a")
|
||||
(gtk_accel_path "<Actions>/Editor/play-selected-regions" "s")
|
||||
(gtk_accel_path "<Actions>/Common/Save" "<@PRIMARY@>s")
|
||||
(gtk_accel_path "<Actions>/Main/Snapshot" "<@PRIMARY@><@TERTIARY@>s")
|
||||
(gtk_accel_path "<Actions>/Editor/trim-back" "d")
|
||||
(gtk_accel_path "<Actions>/Editor/duplicate-region" "<@PRIMARY@>d")
|
||||
(gtk_accel_path "<Actions>/Editor/multi-duplicate-region" "<@PRIMARY@><@TERTIARY@>d")
|
||||
(gtk_accel_path "<Actions>/Editor/toggle-follow-playhead" "f")
|
||||
(gtk_accel_path "<Actions>/Editor/show-rhythm-ferret" "<@WINDOW@>f")
|
||||
; (gtk_accel_path "<Actions>/Editor/set-edit-point" "g")
|
||||
; (gtk_accel_path "<Actions>/MouseMode/set-mouse-mode-gain" "g")
|
||||
(gtk_accel_path "<Actions>/Editor/nudge-backward" "g")
|
||||
(gtk_accel_path "<Actions>/Editor/nudge-forward" "h")
|
||||
(gtk_accel_path "<Actions>/Common/ToggleKeyEditor" "<@SECONDARY@>k")
|
||||
(gtk_accel_path "<Actions>/Common/ToggleLocations" "<@SECONDARY@>l")
|
||||
(gtk_accel_path "<Actions>/Transport/Loop" "l")
|
||||
(gtk_accel_path "<Actions>/Editor/toggle-region-lock" "<@LEVEL4@>l")
|
||||
(gtk_accel_path "<Actions>/Editor/select-all-in-loop-range" "<@TERTIARY@>l")
|
||||
|
||||
;; UNTERE ZEILE
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/zoom-to-region" "y")
|
||||
(gtk_accel_path "<Actions>/Editor/undo" "<@PRIMARY@>z")
|
||||
(gtk_accel_path "<Actions>/Editor/zoom-to-session" "<@SECONDARY@>y")
|
||||
(gtk_accel_path "<Actions>/Editor/toggle-zoom" "<@TERTIARY@>y")
|
||||
(gtk_accel_path "<Actions>/Editor/editor-separate" "x")
|
||||
(gtk_accel_path "<Actions>/Editor/editor-cut" "<@PRIMARY@>x")
|
||||
(gtk_accel_path "<Actions>/Editor/crop" "c")
|
||||
(gtk_accel_path "<Actions>/Editor/editor-copy" "<@PRIMARY@>c")
|
||||
(gtk_accel_path "<Actions>/Common/ToggleColorManager" "<@SECONDARY@>c")
|
||||
(gtk_accel_path "<Actions>/Editor/editor-paste" "<@PRIMARY@>v")
|
||||
(gtk_accel_path "<Actions>/Editor/add-location-from-playhead" "b")
|
||||
(gtk_accel_path "<Actions>/Common/ToggleBigClock" "<@SECONDARY@>b")
|
||||
(gtk_accel_path "<Actions>/Editor/normalize-region" "n")
|
||||
(gtk_accel_path "<Actions>/Main/New" "<@PRIMARY@>n")
|
||||
(gtk_accel_path "<Actions>/Main/AddTrackBus" "<@PRIMARY@><@TERTIARY@>n")
|
||||
(gtk_accel_path "<Actions>/Common/toggle-editor-mixer-on-top" "<@SECONDARY@>m")
|
||||
(gtk_accel_path "<Actions>/Editor/add-location-from-playhead" "KP_Enter")
|
||||
(gtk_accel_path "<Actions>/Editor/toggle-region-mute" "m")
|
||||
|
||||
;; arrow keys, navigation etc.
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/playhead-to-edit" "Return")
|
||||
(gtk_accel_path "<Actions>/Editor/edit-to-playhead" "<@SECONDARY@>Return")
|
||||
(gtk_accel_path "<Actions>/Editor/editor-delete" "BackSpace")
|
||||
(gtk_accel_path "<Actions>/Editor/remove-last-capture" "<@PRIMARY@>Delete")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/playhead-to-previous-region-boundary-noselection" "<@LEVEL4@>leftarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/playhead-to-previous-region-boundary" "leftarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/playhead-backward-to-grid" "<@TERTIARY@><@LEVEL4@>leftarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/edit-cursor-to-previous-region-sync" "<@TERTIARY@><@SECONDARY@>leftarrow")
|
||||
(gtk_accel_path "<Actions>/Transport/Rewind" "<@PRIMARY@>leftarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/tab-to-transient-backwards" "<@SECONDARY@>leftarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/nudge-playhead-backward" "<@TERTIARY@>leftarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/jump-backward-to-mark" "<@PRIMARY@><@SECONDARY@>leftarrow")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/selected-marker-to-previous-region-boundary" "<@PRIMARY@><@TERTIARY@>leftarrow")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/playhead-to-next-region-boundary-noselection" "<@LEVEL4@>rightarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/playhead-to-next-region-boundary" "rightarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/playhead-forward-to-grid" "<@TERTIARY@><@LEVEL4@>rightarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/edit-cursor-to-next-region-sync" "<@TERTIARY@><@SECONDARY@>leftarrow")
|
||||
(gtk_accel_path "<Actions>/Transport/Forward" "<@PRIMARY@>rightarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/tab-to-transient-forwards" "<@SECONDARY@>rightarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/nudge-playhead-forward" "<@TERTIARY@>rightarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/jump-forward-to-mark" "<@PRIMARY@><@SECONDARY@>rightarrow")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/selected-marker-to-next-region-boundary" "<@PRIMARY@><@TERTIARY@>rightarrow")
|
||||
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/scroll-tracks-down" "Page_Down")
|
||||
(gtk_accel_path "<Actions>/Editor/scroll-tracks-up" "Page_Up")
|
||||
|
||||
(gtk_accel_path "<Actions>/Transport/GotoEnd" "End")
|
||||
(gtk_accel_path "<Actions>/Editor/select-all-after-edit-cursor" "<@PRIMARY@><@TERTIARY@>End")
|
||||
(gtk_accel_path "<Actions>/Editor/select-all-after-playhead" "<@TERTIARY@>End")
|
||||
|
||||
(gtk_accel_path "<Actions>/Transport/GotoStart" "Home")
|
||||
(gtk_accel_path "<Actions>/Editor/select-all-before-edit-cursor" "<@PRIMARY@><@TERTIARY@>Home")
|
||||
(gtk_accel_path "<Actions>/Editor/select-all-before-playhead" "<@TERTIARY@>Home")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/select-prev-route" "uparrow")
|
||||
(gtk_accel_path "<Actions>/Transport/TransitionToRoll" "<@PRIMARY@>uparrow")
|
||||
(gtk_accel_path "<Actions>/Editor/move-selected-tracks-up" "<@TERTIARY@>uparrow")
|
||||
(gtk_accel_path "<Actions>/Editor/select-next-route" "downarrow")
|
||||
(gtk_accel_path "<Actions>/Transport/TransitionToReverse" "<@PRIMARY@>downarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/move-selected-tracks-down" "<@TERTIARY@>downarrow")
|
||||
|
||||
;; keypad
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/finish-add-range" "<@TERTIARY@><@PRIMARY@>KP_Up")
|
||||
(gtk_accel_path "<Actions>/Editor/goto-mark-1" "KP_1")
|
||||
(gtk_accel_path "<Actions>/Editor/goto-mark-2" "KP_2")
|
||||
(gtk_accel_path "<Actions>/Editor/goto-mark-3" "KP_3")
|
||||
(gtk_accel_path "<Actions>/Editor/goto-mark-4" "KP_4")
|
||||
(gtk_accel_path "<Actions>/Editor/goto-mark-5" "KP_5")
|
||||
(gtk_accel_path "<Actions>/Editor/goto-mark-6" "KP_6")
|
||||
(gtk_accel_path "<Actions>/Editor/goto-mark-7" "KP_7")
|
||||
(gtk_accel_path "<Actions>/Editor/goto-mark-8" "KP_8")
|
||||
(gtk_accel_path "<Actions>/Editor/goto-mark-9" "KP_9")
|
||||
(gtk_accel_path "<Actions>/Editor/nudge-next-backward" "<@PRIMARY@>KP_Subtract")
|
||||
(gtk_accel_path "<Actions>/Editor/cut-region-gain" "KP_Subtract")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/nudge-next-forward" "<@PRIMARY@>KP_Add")
|
||||
(gtk_accel_path "<Actions>/Editor/boost-region-gain" "KP_Add")
|
||||
|
||||
(gtk_accel_path "<Actions>/Transport/GotoZero" "KP_Insert")
|
||||
|
||||
;; F-N keys
|
||||
|
||||
; (gtk_accel_path "<Actions>/Editor/start-range" "F1")
|
||||
; (gtk_accel_path "<Actions>/Editor/edit-cursor-to-range-start" "<@TERTIARY@>F1")
|
||||
; (gtk_accel_path "<Actions>/Editor/finish-range" "F2")
|
||||
; (gtk_accel_path "<Actions>/Editor/edit-cursor-to-range-end" "<@TERTIARY@>F2")
|
||||
; (gtk_accel_path "<Actions>/Editor/brush-at-mouse" "F3")
|
||||
(gtk_accel_path "<Actions>/Editor/step-mouse-mode" "F1")
|
||||
(gtk_accel_path "<Actions>/Common/ToggleMaximalEditor" "F2")
|
||||
|
||||
|
||||
|
||||
|
||||
;; numbers
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/toggle-edit-mode" "1")
|
||||
(gtk_accel_path "<Actions>/Editor/cycle-snap-mode" "2")
|
||||
(gtk_accel_path "<Actions>/Editor/cycle-snap-choice" "3")
|
||||
(gtk_accel_path "<Actions>/Transport/ToggleAutoPlay" "4")
|
||||
(gtk_accel_path "<Actions>/Transport/ToggleAutoReturn" "5")
|
||||
(gtk_accel_path "<Actions>/Transport/ToggleAutoInput" "6")
|
||||
(gtk_accel_path "<Actions>/Transport/ToggleClick" "7")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/set-loop-from-edit-range" "8")
|
||||
(gtk_accel_path "<Actions>/Editor/set-loop-from-region" "<@LEVEL4@>8")
|
||||
; (gtk_accel_path "<Actions>/Editor/loop-region" "<@PRIMARY@>8")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/set-punch-from-edit-range" "9")
|
||||
(gtk_accel_path "<Actions>/Editor/set-punch-from-region" "<@LEVEL4@>9")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/set-tempo-from-region" "<@LEVEL4@>0")
|
||||
(gtk_accel_path "<Actions>/Editor/set-tempo-from-edit-range" "0")
|
||||
|
||||
;;
|
||||
;; unbound actions
|
||||
;;
|
||||
|
||||
|
||||
|
||||
|
||||
; (gtk_accel_path "<Actions>/Common/About" "")
|
||||
; (gtk_accel_path "<Actions>/Common/ToggleInspector" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/Autoconnect" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/Crossfades" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/CrossfadesFull" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/CrossfadesShort" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/Edit" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/EditCursorMovementOptions" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/EditSelectRangeOptions" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/EditSelectRegionOptions" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/LayerAddHigher" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/LayerLaterHigher" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/LayerMoveAddHigher" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/Layering" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/MeterFalloff" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/MeterHold" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/Monitoring" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/Pullup" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/PullupMinus1" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/PullupMinus4" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/PullupMinus4Minus1" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/PullupMinus4Plus1" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/PullupNone" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/PullupPlus1" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/PullupPlus4" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/PullupPlus4Minus1" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/PullupPlus4Plus1" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/RegionEditOps" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/Smpte23976" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/Smpte24" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/Smpte24976" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/Smpte25" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/Smpte2997" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/Smpte2997drop" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/Smpte30" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/Smpte30drop" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/Smpte5994" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/Smpte60" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/SnapMode" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/SnapTo" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/Solo" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/Subframes" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/Subframes100" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/Subframes80" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/Timecode" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/ToggleGeneric MIDISurface" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/ToggleGeneric MIDISurfaceFeedback" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/ToggleGeneric MIDISurfaceSubMenu" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/ToggleMeasureVisibility" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/ToggleWaveformVisibility" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/ToggleWaveformsWhileRecording" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/View" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/ZoomFocus" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/center-edit-cursor" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/playhead-to-next-region-sync" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/playhead-to-previous-region-sync" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/playhead-to-range-end" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/playhead-to-range-start" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/snap-magnetic" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/snap-normal" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/toggle-auto-xfades" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/toggle-xfades-active" "")
|
||||
; (gtk_accel_path "<Actions>/Editor/toggle-xfades-visible" "")
|
||||
; (gtk_accel_path "<Actions>/JACK/JACK" "")
|
||||
; (gtk_accel_path "<Actions>/JACK/JACKDisconnect" "")
|
||||
; (gtk_accel_path "<Actions>/JACK/JACKLatency1024" "")
|
||||
; (gtk_accel_path "<Actions>/JACK/JACKLatency128" "")
|
||||
; (gtk_accel_path "<Actions>/JACK/JACKLatency2048" "")
|
||||
; (gtk_accel_path "<Actions>/JACK/JACKLatency256" "")
|
||||
; (gtk_accel_path "<Actions>/JACK/JACKLatency32" "")
|
||||
; (gtk_accel_path "<Actions>/JACK/JACKLatency4096" "")
|
||||
; (gtk_accel_path "<Actions>/JACK/JACKLatency512" "")
|
||||
; (gtk_accel_path "<Actions>/JACK/JACKLatency64" "")
|
||||
; (gtk_accel_path "<Actions>/JACK/JACKLatency8192" "")
|
||||
; (gtk_accel_path "<Actions>/JACK/JACKReconnect" "")
|
||||
; (gtk_accel_path "<Actions>/JACK/Latency" "")
|
||||
; (gtk_accel_path "<Actions>/Main/AudioFileFormat" "")
|
||||
; (gtk_accel_path "<Actions>/Main/AudioFileFormatData" "")
|
||||
; (gtk_accel_path "<Actions>/Main/AudioFileFormatHeader" "")
|
||||
; (gtk_accel_path "<Actions>/Main/Cleanup" "")
|
||||
; (gtk_accel_path "<Actions>/Main/CleanupUnused" "")
|
||||
; (gtk_accel_path "<Actions>/Main/ControlSurfaces" "")
|
||||
; (gtk_accel_path "<Actions>/Main/Export" "<@PRIMARY@>e")
|
||||
; (gtk_accel_path "<Actions>/Main/ExportRangeMarkers" "")
|
||||
; (gtk_accel_path "<Actions>/Main/ExportSelection" "")
|
||||
; (gtk_accel_path "<Actions>/Main/FlushWastebasket" "")
|
||||
; (gtk_accel_path "<Actions>/Main/Help" "")
|
||||
; (gtk_accel_path "<Actions>/Main/KeyMouse Actions" "")
|
||||
; (gtk_accel_path "<Actions>/Main/Metering" "")
|
||||
; (gtk_accel_path "<Actions>/Main/MeteringFallOffRate" "")
|
||||
; (gtk_accel_path "<Actions>/Main/MeteringHoldTime" "")
|
||||
; (gtk_accel_path "<Actions>/Main/Options" "")
|
||||
; (gtk_accel_path "<Actions>/Main/SaveTemplate" "")
|
||||
; (gtk_accel_path "<Actions>/Main/Session" "")
|
||||
; (gtk_accel_path "<Actions>/Main/TransportOptions" "")
|
||||
; (gtk_accel_path "<Actions>/Main/Windows" "")
|
||||
; (gtk_accel_path "<Actions>/MouseMode/set-mouse-mode-timefx" "t")
|
||||
; (gtk_accel_path "<Actions>/RegionList/RegionListSort" "")
|
||||
; (gtk_accel_path "<Actions>/RegionList/SortAscending" "")
|
||||
; (gtk_accel_path "<Actions>/RegionList/SortByRegionEndinFile" "")
|
||||
; (gtk_accel_path "<Actions>/RegionList/SortByRegionLength" "")
|
||||
; (gtk_accel_path "<Actions>/RegionList/SortByRegionName" "")
|
||||
; (gtk_accel_path "<Actions>/RegionList/SortByRegionPosition" "")
|
||||
; (gtk_accel_path "<Actions>/RegionList/SortByRegionStartinFile" "")
|
||||
; (gtk_accel_path "<Actions>/RegionList/SortByRegionTimestamp" "")
|
||||
; (gtk_accel_path "<Actions>/RegionList/SortBySourceFileCreationDate" "")
|
||||
; (gtk_accel_path "<Actions>/RegionList/SortBySourceFileLength" "")
|
||||
; (gtk_accel_path "<Actions>/RegionList/SortBySourceFileName" "")
|
||||
; (gtk_accel_path "<Actions>/RegionList/SortBySourceFilesystem" "")
|
||||
; (gtk_accel_path "<Actions>/RegionList/SortDescending" "")
|
||||
; (gtk_accel_path "<Actions>/RegionList/rlAudition" "")
|
||||
; (gtk_accel_path "<Actions>/RegionList/rlHide" "")
|
||||
; (gtk_accel_path "<Actions>/RegionList/rlRemove" "")
|
||||
; (gtk_accel_path "<Actions>/RegionList/rlShowAll" "")
|
||||
; (gtk_accel_path "<Actions>/RegionList/rlShowAuto" "")
|
||||
; (gtk_accel_path "<Actions>/ShuttleActions/SetShuttleUnitsPercentage" "")
|
||||
; (gtk_accel_path "<Actions>/ShuttleActions/SetShuttleUnitsSemitones" "")
|
||||
; (gtk_accel_path "<Actions>/Snap/snap-to-asixteenthbeat" "")
|
||||
; (gtk_accel_path "<Actions>/Snap/snap-to-bar" "")
|
||||
; (gtk_accel_path "<Actions>/Snap/snap-to-beat" "")
|
||||
; (gtk_accel_path "<Actions>/Snap/snap-to-cd-frame" "")
|
||||
; (gtk_accel_path "<Actions>/Snap/snap-to-edit-cursor" "")
|
||||
; (gtk_accel_path "<Actions>/Snap/snap-to-eighths" "")
|
||||
; (gtk_accel_path "<Actions>/Snap/snap-to-frame" "")
|
||||
; (gtk_accel_path "<Actions>/Snap/snap-to-mark" "")
|
||||
; (gtk_accel_path "<Actions>/Snap/snap-to-minutes" "")
|
||||
; (gtk_accel_path "<Actions>/Snap/snap-to-quarters" "")
|
||||
; (gtk_accel_path "<Actions>/Snap/snap-to-region-boundary" "")
|
||||
; (gtk_accel_path "<Actions>/Snap/snap-to-region-end" "")
|
||||
; (gtk_accel_path "<Actions>/Snap/snap-to-region-start" "")
|
||||
; (gtk_accel_path "<Actions>/Snap/snap-to-region-sync" "")
|
||||
; (gtk_accel_path "<Actions>/Snap/snap-to-seconds" "")
|
||||
; (gtk_accel_path "<Actions>/Snap/snap-to-smpte-frame" "")
|
||||
; (gtk_accel_path "<Actions>/Snap/snap-to-smpte-minutes" "")
|
||||
; (gtk_accel_path "<Actions>/Snap/snap-to-smpte-seconds" "")
|
||||
; (gtk_accel_path "<Actions>/Snap/snap-to-thirds" "")
|
||||
; (gtk_accel_path "<Actions>/Snap/snap-to-thirtyseconds" "")
|
||||
; (gtk_accel_path "<Actions>/Transport/Playwion" "")
|
||||
|
||||
|
||||
; (gtk_accel_path "<Actions>/Transport/ToggleAutoReturn" "")
|
||||
; (gtk_accel_path "<Actions>/Transport/TogglePunchIn" "")
|
||||
; (gtk_accel_path "<Actions>/Transport/TogglePunchOut" "")
|
||||
; (gtk_accel_path "<Actions>/Transport/ToggleTimeMaster" "")
|
||||
; (gtk_accel_path "<Actions>/Transport/ToggleVideoSync" "")
|
||||
; (gtk_accel_path "<Actions>/Transport/Transport" "")
|
||||
; (gtk_accel_path "<Actions>/Zoom/zoom-focus-center" "")
|
||||
; (gtk_accel_path "<Actions>/Zoom/zoom-focus-edit" "")
|
||||
; (gtk_accel_path "<Actions>/Zoom/zoom-focus-left" "")
|
||||
; (gtk_accel_path "<Actions>/Zoom/zoom-focus-playhead" "")
|
||||
; (gtk_accel_path "<Actions>/Zoom/zoom-focus-right" "")
|
||||
; (gtk_accel_path "<Actions>/options/DoNotRunPluginsWhileRecording" "")
|
||||
; (gtk_accel_path "<Actions>/options/FileDataFormat24bit" "")
|
||||
; (gtk_accel_path "<Actions>/options/FileDataFormatFloat" "")
|
||||
; (gtk_accel_path "<Actions>/options/FileHeaderFormatBWF" "")
|
||||
; (gtk_accel_path "<Actions>/options/FileHeaderFormatCAF" "")
|
||||
; (gtk_accel_path "<Actions>/options/FileHeaderFormatWAVE" "")
|
||||
; (gtk_accel_path "<Actions>/options/FileHeaderFormatWAVE64" "")
|
||||
; (gtk_accel_path "<Actions>/options/GainReduceFastTransport" "")
|
||||
; (gtk_accel_path "<Actions>/options/InputAutoConnectManual" "")
|
||||
; (gtk_accel_path "<Actions>/options/InputAutoConnectPhysical" "")
|
||||
; (gtk_accel_path "<Actions>/options/LatchedRecordEnable" "")
|
||||
; (gtk_accel_path "<Actions>/options/LatchedSolo" "")
|
||||
; (gtk_accel_path "<Actions>/options/MeterFalloffFast" "")
|
||||
; (gtk_accel_path "<Actions>/options/MeterFalloffFaster" "")
|
||||
; (gtk_accel_path "<Actions>/options/MeterFalloffFastest" "")
|
||||
; (gtk_accel_path "<Actions>/options/MeterFalloffMedium" "")
|
||||
; (gtk_accel_path "<Actions>/options/MeterFalloffOff" "")
|
||||
; (gtk_accel_path "<Actions>/options/MeterFalloffSlow" "")
|
||||
; (gtk_accel_path "<Actions>/options/MeterFalloffSlowest" "")
|
||||
; (gtk_accel_path "<Actions>/options/MeterHoldLong" "")
|
||||
; (gtk_accel_path "<Actions>/options/MeterHoldMedium" "")
|
||||
; (gtk_accel_path "<Actions>/options/MeterHoldOff" "")
|
||||
; (gtk_accel_path "<Actions>/options/MeterHoldShort" "")
|
||||
; (gtk_accel_path "<Actions>/options/OutputAutoConnectManual" "")
|
||||
; (gtk_accel_path "<Actions>/options/OutputAutoConnectMaster" "")
|
||||
; (gtk_accel_path "<Actions>/options/OutputAutoConnectPhysical" "")
|
||||
; (gtk_accel_path "<Actions>/options/RegionEquivalentsOverlap" "")
|
||||
; (gtk_accel_path "<Actions>/options/SendMMC" "")
|
||||
; (gtk_accel_path "<Actions>/options/SendMTC" "")
|
||||
; (gtk_accel_path "<Actions>/options/ShowSoloMutes" "")
|
||||
; (gtk_accel_path "<Actions>/options/SoloInPlace" "")
|
||||
; (gtk_accel_path "<Actions>/options/SoloViaBus" "")
|
||||
; (gtk_accel_path "<Actions>/options/StopPluginsWithTransport" "")
|
||||
; (gtk_accel_path "<Actions>/options/StopRecordingOnXrun" "")
|
||||
; (gtk_accel_path "<Actions>/options/StopTransportAtEndOfSession" "")
|
||||
; (gtk_accel_path "<Actions>/options/UseExternalMonitoring" "")
|
||||
; (gtk_accel_path "<Actions>/options/UseHardwareMonitoring" "")
|
||||
; (gtk_accel_path "<Actions>/options/UseMMC" "")
|
||||
; (gtk_accel_path "<Actions>/options/UseSoftwareMonitoring" "")
|
||||
; (gtk_accel_path "<Actions>/options/VerifyRemoveLastCapture" "")
|
||||
; (gtk_accel_path "<Actions>/redirectmenu/activate" "")
|
||||
; (gtk_accel_path "<Actions>/redirectmenu/activate_all" "")
|
||||
; (gtk_accel_path "<Actions>/redirectmenu/clear" "")
|
||||
; (gtk_accel_path "<Actions>/redirectmenu/copy" "")
|
||||
; (gtk_accel_path "<Actions>/redirectmenu/cut" "")
|
||||
; (gtk_accel_path "<Actions>/redirectmenu/deactivate" "")
|
||||
; (gtk_accel_path "<Actions>/redirectmenu/deactivate_all" "")
|
||||
; (gtk_accel_path "<Actions>/redirectmenu/deselectall" "<@PRIMARY@><@TERTIARY@>a")
|
||||
; (gtk_accel_path "<Actions>/redirectmenu/edit" "")
|
||||
; (gtk_accel_path "<Actions>/redirectmenu/newinsert" "")
|
||||
; (gtk_accel_path "<Actions>/redirectmenu/newplugin" "")
|
||||
; (gtk_accel_path "<Actions>/redirectmenu/newsend" "")
|
||||
; (gtk_accel_path "<Actions>/redirectmenu/newreturn" "")
|
||||
; (gtk_accel_path "<Actions>/redirectmenu/paste" "")
|
||||
; (gtk_accel_path "<Actions>/redirectmenu/rename" "")
|
||||
; (gtk_accel_path "<Actions>/redirectmenu/selectall" "")
|
||||
;(gtk_accel_path "<Actions>/MouseMode/set-mouse-mode-object" "o")
|
|
@ -0,0 +1,215 @@
|
|||
; ardour-2.2 GtkAccelMap rc-file -*- scheme -*-
|
||||
; this file is a hand-edited map that is processed by scons
|
||||
; to produce a real accelmap.
|
||||
;
|
||||
|
||||
;; punctuation
|
||||
(gtk_accel_path "<Actions>/Editor/center-playhead" "Escape")
|
||||
(gtk_accel_path "<Actions>/Transport/ToggleRoll" "space")
|
||||
(gtk_accel_path "<Actions>/Transport/ToggleRollForgetCapture" "<@PRIMARY@>period")
|
||||
(gtk_accel_path "<Actions>/Transport/record-roll" "<@PRIMARY@>space")
|
||||
(gtk_accel_path "<Actions>/Editor/play-from-edit-point-and-return" "<@LEVEL4@>space")
|
||||
(gtk_accel_path "<Actions>/Common/ToggleOptionsEditor" "<@PRIMARY@>comma")
|
||||
(gtk_accel_path "<Actions>/Editor/align-regions-end" "<@PRIMARY@><@SECONDARY@>less")
|
||||
(gtk_accel_path "<Actions>/Editor/align-regions-end-relative" "<@PRIMARY@>less")
|
||||
(gtk_accel_path "<Actions>/Editor/align-regions-start" "<@LEVEL4@><@SECONDARY@>less")
|
||||
(gtk_accel_path "<Actions>/Editor/align-regions-start-relative" "<@LEVEL4@>less")
|
||||
(gtk_accel_path "<Actions>/Editor/align-regions-sync" "<@SECONDARY@>less")
|
||||
(gtk_accel_path "<Actions>/Editor/align-regions-sync-relative" "less")
|
||||
|
||||
; (gtk_accel_path "<Actions>/Editor/edit-cursor-to-next-region-sync" "semicolon")
|
||||
; (gtk_accel_path "<Actions>/Editor/edit-cursor-to-previous-region-sync" "apostrophe")
|
||||
(gtk_accel_path "<Actions>/Editor/cycle-edit-point" "asciicircum")
|
||||
(gtk_accel_path "<Actions>/Editor/cycle-edit-point-with-marker" "<@SECONDARY@>asciicircum")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/extend-range-to-end-of-region" "rightanglebracket")
|
||||
(gtk_accel_path "<Actions>/Editor/extend-range-to-start-of-region" "leftanglebracket")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/trim-from-start" "<@TERTIARY@>braceleft")
|
||||
(gtk_accel_path "<Actions>/Editor/trim-to-end" "<@TERTIARY@>braceright")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/play-from-edit-point-and-return" "<@LEVEL4@>space")
|
||||
(gtk_accel_path "<Actions>/Editor/play-edit-range" "<@SECONDARY@>space")
|
||||
|
||||
;; letters
|
||||
|
||||
;; OBERE ZEILE
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/set-fade-in-length" "q")
|
||||
(gtk_accel_path "<Actions>/Common/Quit" "<@PRIMARY@>q")
|
||||
(gtk_accel_path "<Actions>/Editor/toggle-region-fade-in" "<@SECONDARY@>q")
|
||||
(gtk_accel_path "<Actions>/Editor/set-playhead" "w")
|
||||
;; note that ctrl-w is special and consumed by the keyboard snooper
|
||||
|
||||
|
||||
(gtk_accel_path "<Actions>/Main/Close" "<@PRIMARY@>w")
|
||||
(gtk_accel_path "<Actions>/Editor/set-fade-out-length" "e")
|
||||
(gtk_accel_path "<Actions>/Main/ExportSession" "<@PRIMARY@>e")
|
||||
(gtk_accel_path "<Actions>/Editor/toggle-region-fade-out" "<@SECONDARY@>e")
|
||||
(gtk_accel_path "<Actions>/Editor/export-region" "<@PRIMARY@><@TERTIARY@>e")
|
||||
(gtk_accel_path "<Actions>/Editor/show-editor-mixer" "<@TERTIARY@>e")
|
||||
; (gtk_accel_path "<Actions>/Common/goto-editor" "<@SECONDARY@>e")
|
||||
(gtk_accel_path "<Actions>/Editor/redo" "<@PRIMARY@><@TERTIARY@>z")
|
||||
(gtk_accel_path "<Actions>/Transport/Record" "<@TERTIARY@>r")
|
||||
(gtk_accel_path "<Actions>/Editor/temporal-zoom-out" "r")
|
||||
(gtk_accel_path "<Actions>/Transport/Record" "<@TERTIARY@>r")
|
||||
(gtk_accel_path "<Actions>/Editor/reverse-region" "<@LEVEL4@>r")
|
||||
(gtk_accel_path "<Actions>/Editor/temporal-zoom-in" "t")
|
||||
(gtk_accel_path "<Actions>/Common/ToggleThemeManager" "<@SECONDARY@>t")
|
||||
(gtk_accel_path "<Actions>/Editor/pitch-shift-region" "<@LEVEL4@>t")
|
||||
(gtk_accel_path "<Actions>/Editor/split-region" "z")
|
||||
(gtk_accel_path "<Actions>/Editor/set-region-sync-position" "u")
|
||||
(gtk_accel_path "<Actions>/Editor/insert-region-from-region-list" "i")
|
||||
(gtk_accel_path "<Actions>/Editor/addExistingAudioFiles" "<@PRIMARY@>i")
|
||||
(gtk_accel_path "<Actions>/Editor/invert-selection" "<@TERTIARY@>i")
|
||||
(gtk_accel_path "<Actions>/Main/Open" "<@PRIMARY@>o")
|
||||
(gtk_accel_path "<Actions>/Main/Recent" "<@PRIMARY@><@TERTIARY@>o")
|
||||
(gtk_accel_path "<Actions>/Editor/naturalize-region" "<@LEVEL4@>o")
|
||||
(gtk_accel_path "<Actions>/Transport/TogglePunch" "p")
|
||||
(gtk_accel_path "<Actions>/Editor/select-all-in-punch-range" "<@TERTIARY@>p")
|
||||
|
||||
;; MITTELZEILE
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/trim-front" "a")
|
||||
(gtk_accel_path "<Actions>/Editor/select-all" "<@PRIMARY@>a")
|
||||
(gtk_accel_path "<Actions>/Editor/select-all-between-cursors" "<@TERTIARY@>a")
|
||||
(gtk_accel_path "<Actions>/Editor/select-all-between-cursors" "<@TERTIARY@><@SECONDARY@>a")
|
||||
(gtk_accel_path "<Actions>/Editor/play-selected-regions" "s")
|
||||
(gtk_accel_path "<Actions>/Common/Save" "<@PRIMARY@>s")
|
||||
(gtk_accel_path "<Actions>/Main/Snapshot" "<@PRIMARY@><@TERTIARY@>s")
|
||||
(gtk_accel_path "<Actions>/Editor/trim-back" "d")
|
||||
(gtk_accel_path "<Actions>/Editor/duplicate-region" "<@PRIMARY@>d")
|
||||
(gtk_accel_path "<Actions>/Editor/multi-duplicate-region" "<@PRIMARY@><@TERTIARY@>d")
|
||||
(gtk_accel_path "<Actions>/Editor/toggle-follow-playhead" "f")
|
||||
(gtk_accel_path "<Actions>/Editor/show-rhythm-ferret" "<@SECONDARY@>f")
|
||||
; (gtk_accel_path "<Actions>/Editor/set-edit-point" "g")
|
||||
; (gtk_accel_path "<Actions>/MouseMode/set-mouse-mode-gain" "g")
|
||||
(gtk_accel_path "<Actions>/Editor/nudge-backward" "g")
|
||||
(gtk_accel_path "<Actions>/Editor/nudge-forward" "h")
|
||||
(gtk_accel_path "<Actions>/Common/ToggleKeyEditor" "<@SECONDARY@>k")
|
||||
(gtk_accel_path "<Actions>/Common/ToggleLocations" "<@SECONDARY@>l")
|
||||
(gtk_accel_path "<Actions>/Transport/Loop" "l")
|
||||
(gtk_accel_path "<Actions>/Editor/toggle-region-lock" "<@LEVEL4@>l")
|
||||
(gtk_accel_path "<Actions>/Editor/select-all-in-loop-range" "<@TERTIARY@>l")
|
||||
|
||||
;; UNTERE ZEILE
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/zoom-to-region" "y")
|
||||
(gtk_accel_path "<Actions>/Editor/undo" "<@PRIMARY@>z")
|
||||
(gtk_accel_path "<Actions>/Editor/zoom-to-session" "<@SECONDARY@>y")
|
||||
(gtk_accel_path "<Actions>/Editor/toggle-zoom" "<@TERTIARY@>y")
|
||||
(gtk_accel_path "<Actions>/Editor/editor-separate" "x")
|
||||
(gtk_accel_path "<Actions>/Editor/editor-cut" "<@PRIMARY@>x")
|
||||
(gtk_accel_path "<Actions>/Editor/crop" "c")
|
||||
(gtk_accel_path "<Actions>/Editor/editor-copy" "<@PRIMARY@>c")
|
||||
(gtk_accel_path "<Actions>/Common/ToggleColorManager" "<@SECONDARY@>c")
|
||||
(gtk_accel_path "<Actions>/Editor/editor-paste" "<@PRIMARY@>v")
|
||||
(gtk_accel_path "<Actions>/Editor/add-location-from-playhead" "b")
|
||||
(gtk_accel_path "<Actions>/Common/ToggleBigClock" "<@SECONDARY@>b")
|
||||
(gtk_accel_path "<Actions>/Editor/normalize-region" "n")
|
||||
(gtk_accel_path "<Actions>/Main/New" "<@PRIMARY@>n")
|
||||
(gtk_accel_path "<Actions>/Main/AddTrackBus" "<@PRIMARY@><@TERTIARY@>n")
|
||||
(gtk_accel_path "<Actions>/Common/toggle-editor-mixer-on-top" "<@SECONDARY@>m")
|
||||
(gtk_accel_path "<Actions>/Editor/toggle-region-mute" "m")
|
||||
|
||||
;; arrow keys, navigation etc.
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/playhead-to-edit" "Return")
|
||||
(gtk_accel_path "<Actions>/Editor/edit-to-playhead" "<@SECONDARY@>Return")
|
||||
(gtk_accel_path "<Actions>/Editor/editor-delete" "BackSpace")
|
||||
(gtk_accel_path "<Actions>/Editor/remove-last-capture" "<@PRIMARY@>BackSpace")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/playhead-to-previous-region-boundary-noselection" "<@LEVEL4@>leftarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/playhead-to-previous-region-boundary" "leftarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/playhead-backward-to-grid" "<@TERTIARY@><@LEVEL4@>leftarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/edit-cursor-to-previous-region-sync" "<@TERTIARY@><@SECONDARY@>leftarrow")
|
||||
(gtk_accel_path "<Actions>/Transport/Rewind" "<@PRIMARY@>leftarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/tab-to-transient-backwards" "<@SECONDARY@>leftarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/nudge-playhead-backward" "<@TERTIARY@>leftarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/jump-backward-to-mark" "<@PRIMARY@><@SECONDARY@>leftarrow")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/selected-marker-to-previous-region-boundary" "<@PRIMARY@><@TERTIARY@>leftarrow")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/playhead-to-next-region-boundary-noselection" "<@LEVEL4@>rightarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/playhead-to-next-region-boundary" "rightarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/playhead-forward-to-grid" "<@TERTIARY@><@LEVEL4@>rightarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/edit-cursor-to-next-region-sync" "<@TERTIARY@><@SECONDARY@>leftarrow")
|
||||
(gtk_accel_path "<Actions>/Transport/Forward" "<@PRIMARY@>rightarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/tab-to-transient-forwards" "<@SECONDARY@>rightarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/nudge-playhead-forward" "<@TERTIARY@>rightarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/jump-forward-to-mark" "<@PRIMARY@><@SECONDARY@>rightarrow")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/selected-marker-to-next-region-boundary" "<@PRIMARY@><@TERTIARY@>rightarrow")
|
||||
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/scroll-tracks-down" "Page_Down")
|
||||
(gtk_accel_path "<Actions>/Editor/scroll-tracks-up" "Page_Up")
|
||||
|
||||
(gtk_accel_path "<Actions>/Transport/GotoEnd" "End")
|
||||
(gtk_accel_path "<Actions>/Editor/select-all-after-edit-cursor" "<@PRIMARY@><@TERTIARY@>End")
|
||||
(gtk_accel_path "<Actions>/Editor/select-all-after-playhead" "<@TERTIARY@>End")
|
||||
|
||||
(gtk_accel_path "<Actions>/Transport/GotoStart" "Home")
|
||||
(gtk_accel_path "<Actions>/Editor/select-all-before-edit-cursor" "<@PRIMARY@><@TERTIARY@>Home")
|
||||
(gtk_accel_path "<Actions>/Editor/select-all-before-playhead" "<@TERTIARY@>Home")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/select-prev-route" "uparrow")
|
||||
(gtk_accel_path "<Actions>/Transport/TransitionToRoll" "<@PRIMARY@>uparrow")
|
||||
(gtk_accel_path "<Actions>/Editor/move-selected-tracks-up" "<@TERTIARY@>uparrow")
|
||||
(gtk_accel_path "<Actions>/Editor/select-next-route" "downarrow")
|
||||
(gtk_accel_path "<Actions>/Transport/TransitionToReverse" "<@PRIMARY@>downarrow")
|
||||
(gtk_accel_path "<Actions>/Editor/move-selected-tracks-down" "<@TERTIARY@>downarrow")
|
||||
|
||||
;; keypad
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/finish-add-range" "<@TERTIARY@><@PRIMARY@>KP_Up")
|
||||
(gtk_accel_path "<Actions>/Editor/goto-mark-1" "KP_1")
|
||||
(gtk_accel_path "<Actions>/Editor/goto-mark-2" "KP_2")
|
||||
(gtk_accel_path "<Actions>/Editor/goto-mark-3" "KP_3")
|
||||
(gtk_accel_path "<Actions>/Editor/goto-mark-4" "KP_4")
|
||||
(gtk_accel_path "<Actions>/Editor/goto-mark-5" "KP_5")
|
||||
(gtk_accel_path "<Actions>/Editor/goto-mark-6" "KP_6")
|
||||
(gtk_accel_path "<Actions>/Editor/goto-mark-7" "KP_7")
|
||||
(gtk_accel_path "<Actions>/Editor/goto-mark-8" "KP_8")
|
||||
(gtk_accel_path "<Actions>/Editor/goto-mark-9" "KP_9")
|
||||
; (gtk_accel_path "<Actions>/Editor/nudge-next-backward" "<@PRIMARY@>KP_Subtract")
|
||||
(gtk_accel_path "<Actions>/Editor/cut-region-gain" "j")
|
||||
|
||||
; (gtk_accel_path "<Actions>/Editor/nudge-next-forward" "<@PRIMARY@>KP_Add")
|
||||
(gtk_accel_path "<Actions>/Editor/boost-region-gain" "k")
|
||||
|
||||
(gtk_accel_path "<Actions>/Transport/GotoZero" "KP_Insert")
|
||||
|
||||
;; F-N keys
|
||||
|
||||
; (gtk_accel_path "<Actions>/Editor/start-range" "F1")
|
||||
; (gtk_accel_path "<Actions>/Editor/edit-cursor-to-range-start" "<@TERTIARY@>F1")
|
||||
; (gtk_accel_path "<Actions>/Editor/finish-range" "F2")
|
||||
; (gtk_accel_path "<Actions>/Editor/edit-cursor-to-range-end" "<@TERTIARY@>F2")
|
||||
; (gtk_accel_path "<Actions>/Editor/brush-at-mouse" "F3")
|
||||
(gtk_accel_path "<Actions>/Editor/step-mouse-mode" "F1")
|
||||
(gtk_accel_path "<Actions>/Common/ToggleMaximalEditor" "F2")
|
||||
|
||||
|
||||
|
||||
|
||||
;; numbers
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/toggle-edit-mode" "1")
|
||||
(gtk_accel_path "<Actions>/Editor/cycle-snap-mode" "2")
|
||||
(gtk_accel_path "<Actions>/Editor/cycle-snap-choice" "3")
|
||||
(gtk_accel_path "<Actions>/Transport/ToggleAutoPlay" "4")
|
||||
(gtk_accel_path "<Actions>/Transport/ToggleAutoReturn" "5")
|
||||
(gtk_accel_path "<Actions>/Transport/ToggleAutoInput" "6")
|
||||
(gtk_accel_path "<Actions>/Transport/ToggleClick" "7")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/set-loop-from-edit-range" "8")
|
||||
(gtk_accel_path "<Actions>/Editor/set-loop-from-region" "<@LEVEL4@>8")
|
||||
; (gtk_accel_path "<Actions>/Editor/loop-region" "<@PRIMARY@>8")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/set-punch-from-edit-range" "9")
|
||||
(gtk_accel_path "<Actions>/Editor/set-punch-from-region" "<@LEVEL4@>9")
|
||||
|
||||
(gtk_accel_path "<Actions>/Editor/set-tempo-from-region" "<@LEVEL4@>0")
|
||||
(gtk_accel_path "<Actions>/Editor/set-tempo-from-edit-range" "0")
|
||||
|
|
@ -164,6 +164,7 @@ static const char* authors[] = {
|
|||
N_("Jeremy Hall"),
|
||||
N_("Audun Halland"),
|
||||
N_("David Halter"),
|
||||
N_("Christopher Hampson"),
|
||||
N_("Steve Harris"),
|
||||
N_("Melvin Ray Herr"),
|
||||
N_("Carl Hetherington"),
|
||||
|
@ -186,7 +187,6 @@ static const char* authors[] = {
|
|||
N_("Nick Mainsbridge"),
|
||||
N_("Tim Mayberry"),
|
||||
N_("Doug Mclain"),
|
||||
N_("Alexander Mitchell"),
|
||||
N_("Johannes Mueller"),
|
||||
N_("Edward Tomasz Napierała"),
|
||||
N_("Todd Naugle"),
|
||||
|
@ -233,15 +233,7 @@ static const char* authors[] = {
|
|||
};
|
||||
|
||||
static const char* translators[] = {
|
||||
N_("Catalan:\n\tAlbert Homs <alberthoms@gmail.com>\n"),
|
||||
N_("French:\n\tAlain Fréhel <alain.frehel@free.fr>\
|
||||
\n\tChristophe Combelles <ccomb@free.fr>\
|
||||
\n\tMartin Blanchard\
|
||||
\n\tRomain Arnaud <roming22@gmail.com>\
|
||||
\n\tOlivier Humbert <trebmuh@tuxfamily.org>\
|
||||
\n\tFrédéric Rech <fred_rech@laposte.net>\
|
||||
\n\tJulien Taverna <jujudusud@gmail.com>\
|
||||
\n\tNicolas Faure <sub26nico@laposte.net>\n"),
|
||||
N_("French:\n\tAlain Fréhel <alain.frehel@free.fr>\n\tChristophe Combelles <ccomb@free.fr>\n\tMartin Blanchard\n\tRomain Arnaud <roming22@gmail.com>\n\tOlivier Humbert <trebmuh@tuxfamily.org>\n\tFrédéric Rech <fred_rech@laposte.net>\n"),
|
||||
N_("German:\n\tKarsten Petersen <kapet@kapet.de>\
|
||||
\n\tSebastian Arnold <mail@sebastian-arnold.net>\
|
||||
\n\tRobert Schwede <schwede@ironshark.com>\
|
||||
|
@ -249,22 +241,17 @@ static const char* translators[] = {
|
|||
\n\tEdgar Aichinger <edogawa@aon.at>\
|
||||
\n\tRichard Oax <richard@pagliacciempire.de>\
|
||||
\n\tRobin Gloster <robin@loc-com.de>\n"),
|
||||
N_("Italian:\n\tVincenzo Reale <smart2128@baslug.org>\
|
||||
\n\tFilippo Pappalardo <filippo@email.it>\
|
||||
\n\tRaffaele Morelli <raffaele.morelli@gmail.com>\n"),
|
||||
N_("Italian:\n\tVincenzo Reale <smart2128@baslug.org>\n\tFilippo Pappalardo <filippo@email.it>\n\tRaffaele Morelli <raffaele.morelli@gmail.com>\n"),
|
||||
N_("Portuguese:\n\tRui Nuno Capela <rncbc@rncbc.org>\n"),
|
||||
N_("Brazilian Portuguese:\n\tAlexander da Franca Fernandes <alexander@nautae.eti.br>\
|
||||
\n\tChris Ross <chris@tebibyte.org>\n"),
|
||||
N_("Spanish:\n\t Alex Krohn <alexkrohn@fastmail.fm>\
|
||||
\n\tPablo Fernández <pablo.fbus@gmail.com>\n"),
|
||||
N_("Spanish:\n\t Alex Krohn <alexkrohn@fastmail.fm>\n\tPablo Fernández <pablo.fbus@gmail.com>\n"),
|
||||
N_("Russian:\n\t Igor Blinov <pitstop@nm.ru>\
|
||||
\n\tAleksandr Koltsov <ag1455@mail.ru>\
|
||||
\n\tPetr Semiletov <tea@list.ru>\
|
||||
\n\tAlexandre Prokoudine <alexandre.prokoudine@gmail.com>\n"),
|
||||
N_("Greek:\n\t Klearchos Gourgourinis <muadib@in.gr>\n"),
|
||||
N_("Swedish:\n\t Petter Sundlöf <petter.sundlof@gmail.com>\n"),
|
||||
N_("Polish:\n\t Piotr Zaryk <pzaryk@gmail.com>\n"),
|
||||
N_("Czech:\n\t Pavel Fric <pavelfric@seznam.cz>\n\t Martin Vlk <martin@vlkk.cz>\n"),
|
||||
N_("Czech:\n\t Pavel Fric <pavelfric@seznam.cz>\n"),
|
||||
N_("Norwegian:\n\t Eivind Ødegård\n"),
|
||||
N_("Chinese:\n\t Rui-huai Zhang <zrhzrh@mail.ustc.edu.cn>\n"),
|
||||
N_("Japanese:\n\t Hiroki Inagaki <hiroki.ingk@gmail.com>\n"),
|
||||
|
@ -272,31 +259,9 @@ static const char* translators[] = {
|
|||
0
|
||||
};
|
||||
|
||||
static char const* gpl = X_("\n\
|
||||
static const char* gpl = X_("\n\
|
||||
Ardour comes with NO WARRANTY. It is free software, and you are welcome to redistribute it\n\
|
||||
under the terms of the GNU General Public License (GPL) v2.0 or any later version, shown below.\n\
|
||||
\n\
|
||||
Plugin Clarification\n\
|
||||
\n\
|
||||
The following states the Ardour developers understanding of the\n\
|
||||
relationship between Ardour's license (GPL v2.0 or later) and plugins.\n\
|
||||
\n\
|
||||
For the purposes of this understanding, \"plugins\" refer to software\n\
|
||||
dynamically loaded by another program, where the interaction between the\n\
|
||||
plugin and the loading program (typically called \"the host\") is defined by\n\
|
||||
a 3rd party API. Such APIs include (but are not limited to) VST,\n\
|
||||
AudioUnits, LV2, LADSPA and CLAP.\n\
|
||||
\n\
|
||||
Since (a) any such plugin may be loaded by any host that supports the API\n\
|
||||
and (b) any host may load any plugin that supports the API, we consider it\n\
|
||||
self-evident that there can be no \"derivative\" relationship (in the sense\n\
|
||||
of the GPL's use of this term) between the host and plugin.\n\
|
||||
\n\
|
||||
Consequently, Ardour may load arbitrarily licensed plugins, so as to cause\n\
|
||||
interactions between Ardour and the plugin via a 3rd party API, without any\n\
|
||||
implications for either Ardour or the plugin. In our understanding, Using\n\
|
||||
such plugins with Ardour is not impacted in any way by Ardour's GPL licensing.\n\
|
||||
\n\
|
||||
under the terms of the GNU General Public License, shown below.\n\
|
||||
\n\
|
||||
GNU GENERAL PUBLIC LICENSE\n\
|
||||
Version 2, June 1991\n\
|
||||
|
@ -641,10 +606,10 @@ About::About ()
|
|||
#endif
|
||||
|
||||
set_translator_credits (t);
|
||||
set_copyright (_("Copyright (C) 1999-2024 Paul Davis\n"));
|
||||
set_copyright (_("Copyright (C) 1999-2022 Paul Davis\n"));
|
||||
set_license (gpl);
|
||||
set_name (X_("Ardour"));
|
||||
set_website (X_("https://ardour.org/"));
|
||||
set_website (X_("http://ardour.org/"));
|
||||
set_website_label (_("http://ardour.org/"));
|
||||
set_version ((string_compose(_("%1%2\n(rev %3)\n%4%5"),
|
||||
VERSIONSTRING,
|
||||
|
|
|
@ -243,8 +243,8 @@ AnalysisWindow::analyze_data (Gtk::Button * /*button*/)
|
|||
TimeSelection ts = s.time;
|
||||
|
||||
for (TrackSelection::iterator i = s.tracks.begin(); i != s.tracks.end(); ++i) {
|
||||
std::shared_ptr<AudioPlaylist> pl
|
||||
= std::dynamic_pointer_cast<AudioPlaylist>((*i)->playlist());
|
||||
boost::shared_ptr<AudioPlaylist> pl
|
||||
= boost::dynamic_pointer_cast<AudioPlaylist>((*i)->playlist());
|
||||
|
||||
if (!pl)
|
||||
continue;
|
||||
|
|
|
@ -1,60 +0,0 @@
|
|||
# Catalan translation of appdata.
|
||||
# This file is distributed under the same license as the ardour package.
|
||||
#
|
||||
# Albert Homs <alberthoms@gmail.com>
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"POT-Creation-Date: 2021-03-17 15:41+0200\n"
|
||||
"PO-Revision-Date: 2023-03-20 13:03+0100\n"
|
||||
"Last-Translator: Olivier Humbert <trebmuh@tuxfamily.org>\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 2.4.2\n"
|
||||
|
||||
# Intentionally left untranslated.
|
||||
#. (itstool) path: component/name
|
||||
#: gtk2_ardour/ardour.appdata.xml.in.in:6
|
||||
msgid "Ardour"
|
||||
msgstr "Ardour"
|
||||
|
||||
#. (itstool) path: component/summary
|
||||
#: gtk2_ardour/ardour.appdata.xml.in.in:10
|
||||
msgid "Digital Audio Workstation"
|
||||
msgstr "Estació de treball d'àudio digital"
|
||||
|
||||
#. (itstool) path: description/p
|
||||
#: gtk2_ardour/ardour.appdata.xml.in.in:12
|
||||
msgid ""
|
||||
"Ardour is a multi-channel digital audio workstation, allowing you to "
|
||||
"record, edit, mix and master audio and MIDI projects."
|
||||
msgstr ""
|
||||
"Ardour és una estació de treball d'àudio digital multicanal que us permet "
|
||||
"enregistrar, editar, mesclar i barrejar projectes d'àudio i MIDI."
|
||||
|
||||
#. (itstool) path: description/p
|
||||
#: gtk2_ardour/ardour.appdata.xml.in.in:16
|
||||
msgid ""
|
||||
"It is targeted at audio engineers, musicians, soundtrack editors and "
|
||||
"composers."
|
||||
msgstr ""
|
||||
"Està dirigit a enginyers d'àudio, músics, editors de bandes sonores i "
|
||||
"compositors."
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: gtk2_ardour/ardour.appdata.xml.in.in:25
|
||||
msgid ""
|
||||
"The Editor window where you can arrange audio and MIDI data along a timeline"
|
||||
msgstr ""
|
||||
"La finestra Editor on podeu organitzar les dades d'àudio i MIDI al llarg "
|
||||
"d'una línia de temps"
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: gtk2_ardour/ardour.appdata.xml.in.in:29
|
||||
msgid "The Mixer window which includes channel strips for each track and bus"
|
||||
msgstr ""
|
||||
"La finestra del mesclador que inclou bandes de canals per a cada pista i bus"
|
|
@ -1,55 +0,0 @@
|
|||
# Martin Vlk <martin@vlkk.cz>, 2023.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"POT-Creation-Date: 2015-11-06 11:59+0100\n"
|
||||
"PO-Revision-Date: 2023-09-24 17:48+0200\n"
|
||||
"Last-Translator: Martin Vlk <martin@vlkk.cz>\n"
|
||||
"Language-Team: Czech <translation-team-cs@lists.sourceforge.net>\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 21.12.3\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 "Ardour"
|
||||
|
||||
# Intentionally left untranslated.
|
||||
#. (itstool) path: component/summary
|
||||
#: /home/nils/src/ardour/gtk2_ardour/ardour.appdata.xml.in.in:8
|
||||
msgid "Digital Audio Workstation"
|
||||
msgstr "Digital Audio Workstation"
|
||||
|
||||
#. (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 je vícekanálová zvuková digitální pracovní stanice, umožňující"
|
||||
" nahrávat, upravovat a masterovat zvukové a MIDI projekty."
|
||||
|
||||
#. (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 ""
|
||||
"Je cílený na zvukové techniky, hudebníky, tvůrce soudtracků a skladatele."
|
||||
|
||||
#. (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 "Okno editoru, kde můžete aranžovat zvuková a MIDI data na časové ose"
|
||||
|
||||
#. (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 "Okno směšovače, které obsahuje pruh kanálu pro každou stopu a sběrnici"
|
|
@ -10,7 +10,7 @@ fi
|
|||
|
||||
libs=$TOP/@LIBS@
|
||||
|
||||
# https://tracker.ardour.org/view.php?id=5605#c18109
|
||||
# http://tracker.ardour.org/view.php?id=5605#c18109
|
||||
export GTK2_RC_FILES=/nonexistent
|
||||
|
||||
#
|
||||
|
@ -19,11 +19,10 @@ export GTK2_RC_FILES=/nonexistent
|
|||
# can find all the components.
|
||||
#
|
||||
|
||||
export ARDOUR_SURFACES_PATH=$libs/surfaces/osc:$libs/surfaces/faderport8:$libs/surfaces/faderport:$libs/surfaces/generic_midi:$libs/surfaces/tranzport:$libs/surfaces/powermate:$libs/surfaces/mackie:$libs/surfaces/us2400:$libs/surfaces/wiimote:$libs/surfaces/push2:$libs/surfaces/maschine2:$libs/surfaces/cc121:$libs/surfaces/launch_control_xl:$libs/surfaces/contourdesign:$libs/surfaces/websockets:$libs/surfaces/console1:$libs/surfaces/launchpad_pro:$libs/surfaces/launchpad_x
|
||||
export ARDOUR_SURFACES_PATH=$libs/surfaces/osc:$libs/surfaces/faderport8:$libs/surfaces/faderport:$libs/surfaces/generic_midi:$libs/surfaces/tranzport:$libs/surfaces/powermate:$libs/surfaces/mackie:$libs/surfaces/us2400:$libs/surfaces/wiimote:$libs/surfaces/push2:$libs/surfaces/maschine2:$libs/surfaces/cc121:$libs/surfaces/launch_control_xl:$libs/surfaces/contourdesign:$libs/surfaces/websockets
|
||||
export ARDOUR_PANNER_PATH=$libs/panners
|
||||
export ARDOUR_DATA_PATH=$TOP/share:$TOP/build:$TOP/gtk2_ardour:$TOP/build/gtk2_ardour
|
||||
export ARDOUR_MIDIMAPS_PATH=$TOP/share/midi_maps
|
||||
export ARDOUR_MIDI_PATCH_PATH=$TOP/share/patchfiles
|
||||
export ARDOUR_EXPORT_FORMATS_PATH=$TOP/share/export
|
||||
export ARDOUR_THEMES_PATH=$TOP/gtk2_ardour/themes
|
||||
export ARDOUR_BACKEND_PATH=$libs/backends/jack:$libs/backends/dummy:$libs/backends/alsa:$libs/backends/coreaudio:$libs/backends/portaudio:$libs/backends/pulseaudio
|
||||
|
@ -32,10 +31,6 @@ export PBD_TEST_PATH=$TOP/libs/pbd/test
|
|||
export EVORAL_TEST_PATH=$TOP/libs/evoral/test/testdata
|
||||
export MIDIPP_TEST_PATH=$TOP/share/patchfiles
|
||||
|
||||
if test -d $libs/tk/suil; then
|
||||
export SUIL_MODULE_DIR=$libs/tk/suil
|
||||
fi
|
||||
|
||||
#
|
||||
# even though we set the above variables, ardour requires that these
|
||||
# two also be set. the above settings will override them.
|
||||
|
@ -47,23 +42,10 @@ export ARDOUR_DLL_PATH=$libs
|
|||
export GTK_PATH=~/.ardour3:$libs/clearlooks-newer
|
||||
export VAMP_PATH=$libs/vamp-plugins:$libs/vamp-pyin${VAMP_PATH:+:$VAMP_PATH}
|
||||
|
||||
export LD_LIBRARY_PATH=$libs/tk/ydk-pixbuf:$libs/tk/ztk::$libs/tk/ydk:$libs/tk/ytk:$libs/tk/ztkmm:$libs/tk/ydkmm:$libs/tk/ytkmm:$libs/tk/suil:$libs/ptformat:$libs/qm-dsp:$libs/vamp-sdk:$libs/surfaces:$libs/ctrl-interface/control_protocol:$libs/ctrl-interface/midi_surface:$libs/ardour:$libs/midi++2:$libs/pbd:$libs/rubberband:$libs/soundtouch:$libs/aaf:$libs/gtkmm2ext:$libs/widgets:$libs/appleutility:$libs/taglib:$libs/evoral:$libs/evoral/src/libsmf:$libs/audiographer:$libs/temporal:$libs/libltc:$libs/canvas:$libs/waveview:$libs/ardouralsautil${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
|
||||
export LD_LIBRARY_PATH=$libs/ptformat:$libs/qm-dsp:$libs/vamp-sdk:$libs/surfaces:$libs/surfaces/control_protocol:$libs/ardour:$libs/midi++2:$libs/pbd:$libs/rubberband:$libs/soundtouch:$libs/gtkmm2ext:$libs/widgets:$libs/appleutility:$libs/taglib:$libs/evoral:$libs/evoral/src/libsmf:$libs/audiographer:$libs/temporal:$libs/libltc:$libs/canvas:$libs/waveview:$libs/ardouralsautil${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
|
||||
|
||||
# DYLD_LIBRARY_PATH is for darwin.
|
||||
export DYLD_FALLBACK_LIBRARY_PATH=$LD_LIBRARY_PATH
|
||||
|
||||
# allow Ardour to run when configured with --address-sanitizer
|
||||
# - halt_on_error=0 - why would we?
|
||||
# Note, static zita-resampler is used by libardour and libalsa_audiobackend
|
||||
# causing a [false positive] odr-violation at start.
|
||||
# - new_delete_type_mismatch=0 - because caps plugins do that
|
||||
# - leak_check_at_exit=0 - without ARDOUR_RUNNING_UNDER_VALGRIND=TRUE there are many false-positives
|
||||
# besides, instant.xml leaks somewhat intentionally
|
||||
if [ x$ASAN_COREDUMP != x ] ; then
|
||||
export ASAN_OPTIONS=abort_on_error=1:disable_coredump=0:unmap_shadow_on_exit=1:detect_odr_violation=0:leak_check_at_exit=0:new_delete_type_mismatch=0${ASAN_OPTIONS:+:$ASAN_OPTIONS}
|
||||
else
|
||||
export ASAN_OPTIONS=halt_on_error=0:detect_odr_violation=0:leak_check_at_exit=0:new_delete_type_mismatch=0${ASAN_OPTIONS:+:$ASAN_OPTIONS}
|
||||
fi
|
||||
|
||||
ARDOURVERSION=@VERSION@
|
||||
EXECUTABLE=@EXECUTABLE@
|
||||
|
|
|
@ -18,24 +18,15 @@
|
|||
composers.
|
||||
</p>
|
||||
</description>
|
||||
<url type="bugtracker">https://tracker.ardour.org/</url>
|
||||
<url type="contribute">https://ardour.org/development</url>
|
||||
<url type="homepage">https://ardour.org</url>
|
||||
<url type="homepage">http://ardour.org</url>
|
||||
<screenshots>
|
||||
<screenshot type="default">
|
||||
<image>https://community.ardour.org/files/images/ardour-editor-window-1600x900.png</image>
|
||||
<image>http://community.ardour.org/files/images/ardour-editor-window-1600x900.png</image>
|
||||
<caption>The Editor window where you can arrange audio and MIDI data along a timeline</caption>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<image>https://community.ardour.org/files/images/ardour-mixer-window-1600x900.png</image>
|
||||
<image>http://community.ardour.org/files/images/ardour-mixer-window-1600x900.png</image>
|
||||
<caption>The Mixer window which includes channel strips for each track and bus</caption>
|
||||
</screenshot>
|
||||
</screenshots>
|
||||
<keywords>
|
||||
<keyword>Ardour</keyword>
|
||||
<keyword>DAW</keyword>
|
||||
<keyword>Digital Audio Workstation</keyword>
|
||||
<keyword>Mixing</keyword>
|
||||
<keyword>Mastering</keyword>
|
||||
</keywords>
|
||||
</component>
|
||||
|
|
|
@ -7,4 +7,3 @@ Terminal=false
|
|||
MimeType=application/x-ardour;
|
||||
Type=Application
|
||||
Categories=AudioVideo;Audio;AudioEditing;X-Recorders;X-Multitrack;X-Jack;
|
||||
StartupWMClass=Ardour
|
||||
|
|
|
@ -158,7 +158,7 @@ This mode provides many different operations on both regions and control points,
|
|||
@sess|Common/Quit| <@PRIMARY@>q|quit
|
||||
@gmark|Common/jump-forward-to-mark| w|to next mark
|
||||
@mmode|MouseMode/set-mouse-mode-content| e|content mode
|
||||
@sess|Main/QuickExport| <@PRIMARY@>e|quick export session
|
||||
@select|Editor/select-all-before-edit-cursor| <@PRIMARY@>e|select all before EP
|
||||
@rop|Region/export-region| <@PRIMARY@><@SECONDARY@>e|export selected region(s)
|
||||
@sess|Main/ExportAudio| <@SECONDARY@>e|export session
|
||||
@sess|Main/StemExport| <@SECONDARY@><@TERTIARY@>e|stem export selected tracks
|
||||
|
@ -168,11 +168,10 @@ This mode provides many different operations on both regions and control points,
|
|||
@wvis|Common/show-recorder| <@SECONDARY@>r|show recorder page
|
||||
@edit|Editor/redo| <@PRIMARY@>r|redo
|
||||
@edit|Editor/select-from-regions| <@PRIMARY@><@TERTIARY@>r|set Range to selected regions
|
||||
@edit|Editor/add-range-marker-from-selection| <@SECONDARY@><@TERTIARY@>r|Add single Range marker from selection
|
||||
@rop|Region/add-range-marker-from-region| <@SECONDARY@><@TERTIARY@>r|Add single Range marker from selection
|
||||
@trans|Transport/Record| <@TERTIARY@>r|engage record
|
||||
@mmode|MouseMode/set-mouse-mode-timefx| t|timefx mode
|
||||
@gselect|Common/select-all-visible-lanes| <@PRIMARY@>t|select all visible lanes
|
||||
@mmode|MouseMode/set-mouse-mode-grid| y|grid mode
|
||||
@edit|Editor/alternate-redo| <@PRIMARY@>y|redo
|
||||
@select|Editor/select-all-between-cursors| <@PRIMARY@>u|select all regions enclosed by Range
|
||||
@select|Editor/select-all-within-cursors| u|select all regions touched by Range
|
||||
|
@ -201,9 +200,9 @@ This mode provides many different operations on both regions and control points,
|
|||
@edtrk|Editor/track-solo-toggle| <@SECONDARY@>s|toggle track solo status
|
||||
@edit|Editor/ToggleSummary| <@TERTIARY@>s|toggle summary
|
||||
@mmode|MouseMode/set-mouse-mode-draw| d|note-draw mode
|
||||
@edit|Editor/duplicate| <@PRIMARY@>d|duplicate (once)
|
||||
@edit|Editor/multi-duplicate| <@SECONDARY@>d|duplicate (multi)
|
||||
@select|Editor/select-all-in-punch-range| <@TERTIARY@>d|select all in punch range
|
||||
@edit|Editor/duplicate| <@SECONDARY@>d|duplicate (once)
|
||||
@edit|Editor/multi-duplicate| <@TERTIARY@>d|duplicate (multi)
|
||||
@select|Editor/select-all-in-punch-range| <@PRIMARY@>d|select all in punch range
|
||||
@vis|Editor/fit-selection| f|fit selection vertically
|
||||
@edit|Editor/toggle-follow-playhead| <@PRIMARY@>f|toggle playhead tracking
|
||||
@edit|Editor/toggle-stationary-playhead| <@TERTIARY@>f|toggle stationary playhead
|
||||
|
@ -211,16 +210,14 @@ This mode provides many different operations on both regions and control points,
|
|||
@wvis|Common/ToggleMaximalEditor| <@PRIMARY@><@SECONDARY@>f|maximise editor space
|
||||
@wvis|Common/ToggleMaximalMixer| <@PRIMARY@><@TERTIARY@>f|maximise mixer space
|
||||
@mmode|MouseMode/set-mouse-mode-object| g|object mode
|
||||
@edit|Editor/group-selected-regions| <@PRIMARY@>g|group selected regions
|
||||
@edit|Editor/ungroup-selected-regions| <@PRIMARY@><@TERTIARY@>g|ungroup selected regions
|
||||
@edit|Region/play-selected-regions| h|play selected region(s)
|
||||
@eep|Region/trim-front| j|trim front
|
||||
@eep|Region/trim-back| k|trim back
|
||||
@wvis|Window/toggle-virtual-keyboard| <@SECONDARY@>k|show virtual MIDI keyboard
|
||||
@trans|Transport/Loop| l|loop play (the loop range)
|
||||
@select|Editor/select-all-in-loop-range| <@PRIMARY@>l|select all in loop range
|
||||
@wvis|Window/toggle-locations| <@SECONDARY@>l|toggle locations dialog
|
||||
@edit|Editor/show-editor-list| <@TERTIARY@>l|show editor list
|
||||
@wvis|Window/toggle-locations| <@SECONDARY@>l| toggle locations dialog
|
||||
@edit|Editor/show-editor-list| <@TERTIARY@>l| show editor list
|
||||
|
||||
;; BOTTOM ROW
|
||||
|
||||
|
@ -230,14 +227,10 @@ This mode provides many different operations on both regions and control points,
|
|||
@vis|Editor/toggle-zoom| <@TERTIARY@>z|toggle last 2 zoom states
|
||||
@aep|Region/align-regions-sync-relative| x|align sync points (relative)
|
||||
@edit|Editor/editor-cut| <@PRIMARY@>x|cut
|
||||
@edit|Editor/cut-paste-section| <@PRIMARY@><@TERTIARY@>x|cut \& paste section
|
||||
@mmode|MouseMode/set-mouse-mode-cut| c|cut mode
|
||||
@edit|Editor/editor-copy| <@PRIMARY@>c|copy
|
||||
@wvis|Common/show-trigger| <@SECONDARY@>c|show cues page
|
||||
@edit|Editor/editor-crop| <@PRIMARY@><@SECONDARY@>c|crop range
|
||||
@edit|Editor/copy-paste-section| <@PRIMARY@><@TERTIARY@>c|copy \& paste section
|
||||
@edit|Editor/delete-section| <@PRIMARY@><@TERTIARY@>Delete|delete section
|
||||
@edit|Editor/alternate-delete-section| <@PRIMARY@><@TERTIARY@>BackSpace|delete section
|
||||
@edit|Editor/editor-crop| <@PRIMARY@><@TERTIARY@>c|crop range
|
||||
@edit|Editor/editor-consolidate| <@SECONDARY@><@TERTIARY@>c|consolidate range
|
||||
@rop|Region/set-region-sync-position| v|set region sync point
|
||||
@edit|Editor/editor-paste| <@PRIMARY@>v|paste
|
||||
|
@ -470,10 +463,6 @@ This mode provides many different operations on both regions and control points,
|
|||
@notes|Notes/nudge-earlier-fine| <@SECONDARY@>Left|Nudge Notes Earlier (fine)
|
||||
@notes|Notes/edit-channels| c|Edit Note Channels
|
||||
@notes|Notes/edit-velocities| v|Edit Note Velocities
|
||||
@notes|Notes/split-notes-grid| <@PRIMARY@>e|Split Notes By Grid
|
||||
@notes|Notes/join-notes| j|Join Notes
|
||||
@notes|Notes/split-notes-more| s|Split Notes More Finely
|
||||
@notes|Notes/split-notes-less| <@TERTIARY@>s|Split Notes Less Finely
|
||||
|
||||
@notes|Notes/transpose-up-octave| <@SECONDARY@>Up|Transpose up (1 octave)
|
||||
@notes|Notes/transpose-down-octave| <@SECONDARY@>Down|Transpose down (1 octave)
|
||||
|
@ -495,7 +484,9 @@ This mode provides many different operations on both regions and control points,
|
|||
|
||||
@notes|Notes/quantize-selected-notes|q|Quantize Selected Notes
|
||||
|
||||
@notes|Main/Escape| Clear selection
|
||||
@notes|Notes/delete| Backspace|Delete Note Selection
|
||||
@notes|Notes/alt-delete| Delete|Delete Note Selection
|
||||
@notes|Main/Escape|Clear selection
|
||||
|
||||
@notes|Notes/select-next| Tab|Select next note
|
||||
@notes|Notes/select-previous| <@PRIMARY@>Tab|Select previous note
|
||||
|
@ -507,8 +498,5 @@ This mode provides many different operations on both regions and control points,
|
|||
@notes|Notes/invert-selection| <@PRIMARY@>i|Invert note selection
|
||||
@notes|Notes/duplicate-selection| <@PRIMARY@>d|Duplicate note selection
|
||||
|
||||
@rec|Recorder/arm-all| <@PRIMARY@>r|record arm all tracks
|
||||
@rec|Recorder/arm-none| <@PRIMARY@><@TERTIARY@>r|disable record arm of all tracks
|
||||
@rec|Recorder/rec-undo| <@PRIMARY@>z|undo
|
||||
@rec|Recorder/rec-redo| <@PRIMARY@><@TERTIARY@>z|redo
|
||||
@rec|Recorder/alternate-rec-redo| <@PRIMARY@>y|redo
|
||||
@rec|Recorder/arm-all| <@PRIMARY@>r|record arm all tracks
|
||||
@rec|Recorder/arm-none| <@PRIMARY@><@TERTIARY@>r|disable record arm of all tracks
|
||||
|
|
|
@ -32,17 +32,11 @@
|
|||
<menu name='Export' action='Export'>
|
||||
<menuitem action='QuickExport'/>
|
||||
<menuitem action='ExportAudio'/>
|
||||
#ifdef VAPOR
|
||||
<menuitem action='SurroundExport'/>
|
||||
#endif
|
||||
<menuitem action='StemExport'/>
|
||||
<menuitem action='ExportVideo'/>
|
||||
</menu>
|
||||
<separator/>
|
||||
<menuitem action='toggle-session-options-editor'/>
|
||||
#ifdef VAPOR
|
||||
<menuitem action='ToggleSurroundMaster'/>
|
||||
#endif
|
||||
|
||||
<menu name='MonitorMenu' action='MonitorMenu'>
|
||||
<menuitem action='UseMonitorSection'/>
|
||||
|
@ -205,10 +199,6 @@
|
|||
<menuitem action='editor-copy'/>
|
||||
<menuitem action='editor-paste'/>
|
||||
<separator/>
|
||||
<menuitem action='cut-paste-section'/>
|
||||
<menuitem action='copy-paste-section'/>
|
||||
<menuitem action='delete-section'/>
|
||||
<separator/>
|
||||
<menu action="SelectMenu">
|
||||
<menuitem action='select-all-objects'/>
|
||||
<menuitem action='select-all-tracks'/>
|
||||
|
@ -220,8 +210,6 @@
|
|||
<menuitem action='select-punch-range'/>
|
||||
<menuitem action='select-from-regions'/>
|
||||
<separator/>
|
||||
<menuitem action='add-range-marker-from-selection'/>
|
||||
<separator/>
|
||||
<menuitem action='select-all-after-edit-cursor'/>
|
||||
<menuitem action='select-all-before-edit-cursor'/>
|
||||
<menuitem action='select-all-between-cursors'/>
|
||||
|
@ -286,12 +274,6 @@
|
|||
<menuitem action='cycle-edit-point'/>
|
||||
<menuitem action='cycle-edit-point-with-marker'/>
|
||||
</menu>
|
||||
<menu action="MarkerClickBehavior">
|
||||
<menuitem action='cycle-marker-click-behavior'/>
|
||||
<menuitem action='marker-click-select-only'/>
|
||||
<menuitem action='marker-click-locate'/>
|
||||
<menuitem action='marker-click-locate-when-stopped'/>
|
||||
</menu>
|
||||
<menuitem action='cycle-snap-mode'/>
|
||||
<menu name='GridChoice' action='GridChoice'>
|
||||
<menuitem action='prev-grid-choice'/>
|
||||
|
@ -356,10 +338,6 @@
|
|||
<menuitem action='insert-region-from-source-list'/>
|
||||
<menuitem action='play-selected-regions'/>
|
||||
<menuitem action='tag-selected-regions'/>
|
||||
<separator/>
|
||||
<menuitem action='group-selected-regions'/>
|
||||
<menuitem action='ungroup-selected-regions'/>
|
||||
<separator/>
|
||||
<menuitem action='loop-region'/>
|
||||
<menuitem action='rename-region'/>
|
||||
<menuitem action='show-region-properties'/>
|
||||
|
@ -405,13 +383,13 @@
|
|||
<menuitem action='cut-region-gain'/>
|
||||
<menuitem action='reset-region-gain'/>
|
||||
<menuitem action='reset-region-gain-envelopes'/>
|
||||
<menuitem action='toggle-region-polarity'/>
|
||||
<menuitem action='toggle-region-gain-envelope-active'/>
|
||||
</menu>
|
||||
<menu action='RegionMenuPosition'>
|
||||
<menuitem action='naturalize-region'/>
|
||||
<menuitem action='snap-regions-to-grid'/>
|
||||
<menuitem action='toggle-region-lock'/>
|
||||
<menuitem action='toggle-region-lock-style'/>
|
||||
<menuitem action='toggle-region-video-lock'/>
|
||||
<menuitem action='set-region-sync-position'/>
|
||||
<menuitem action='remove-region-sync'/>
|
||||
|
@ -548,7 +526,8 @@
|
|||
<menuitem action="toggle-meter-ruler"/>
|
||||
<menuitem action="toggle-tempo-ruler"/>
|
||||
<menuitem action="toggle-range-ruler"/>
|
||||
<menuitem action="toggle-arrangement-ruler"/>
|
||||
<menuitem action="toggle-loop-punch-ruler"/>
|
||||
<menuitem action="toggle-cd-marker-ruler"/>
|
||||
<menuitem action="toggle-marker-ruler"/>
|
||||
<separator/>
|
||||
<menuitem action="toggle-video-ruler"/>
|
||||
|
@ -641,8 +620,10 @@
|
|||
#ifdef MIXBUS
|
||||
<separator/>
|
||||
<menuitem action='ToggleStripCtrls'/>
|
||||
#ifdef MIXBUS32C
|
||||
<menuitem action='ToggleStripEQ'/>
|
||||
<menuitem action='ToggleStripBus'/>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
</menu>
|
||||
|
@ -796,24 +777,17 @@
|
|||
<menuitem action="toggle-bbt-ruler"/>
|
||||
<separator/>
|
||||
<menuitem action="toggle-meter-ruler"/>
|
||||
<menuitem action="toggle-timecode-ruler"/>
|
||||
<menuitem action="toggle-tempo-ruler"/>
|
||||
<menuitem action="toggle-range-ruler"/>
|
||||
<menuitem action="toggle-marker-ruler"/>
|
||||
<menuitem action="toggle-cd-marker-ruler"/>
|
||||
<menuitem action="toggle-loop-punch-ruler"/>
|
||||
<separator/>
|
||||
<menuitem action="toggle-video-ruler"/>
|
||||
</popup>
|
||||
|
||||
<popup name='ProcessorMenu' accelerators='true'>
|
||||
<menuitem action='presets'/>
|
||||
<menuitem action='edit'/>
|
||||
<menuitem action='edit-generic'/>
|
||||
<menuitem action='controls'/>
|
||||
<menuitem action='rename'/>
|
||||
<separator/>
|
||||
<menuitem action='manage-pins'/>
|
||||
<separator/>
|
||||
<menuitem action='send_options'/>
|
||||
<separator/>
|
||||
<menuitem action='newplugin'/>
|
||||
<menuitem action='newinsert'/>
|
||||
<menuitem action='newsend'/>
|
||||
|
@ -821,23 +795,9 @@
|
|||
<menuitem action='newlisten'/>
|
||||
<menuitem action='removelisten'/>
|
||||
<separator/>
|
||||
<menuitem action='clear'/>
|
||||
<menuitem action='clear_pre'/>
|
||||
<menuitem action='clear_post'/>
|
||||
<separator/>
|
||||
<menuitem action='cut'/>
|
||||
<menuitem action='copy'/>
|
||||
<menuitem action='paste'/>
|
||||
<menuitem action='delete'/>
|
||||
<separator/>
|
||||
<menuitem action='selectall'/>
|
||||
<menuitem action='deselectall'/>
|
||||
<separator/>
|
||||
<menuitem action='activate_all'/>
|
||||
<menuitem action='deactivate_all'/>
|
||||
#ifndef MIXBUS
|
||||
<menuitem action='ab_plugins'/>
|
||||
#endif
|
||||
<menuitem action='controls'/>
|
||||
<menuitem action='send_options'/>
|
||||
<menuitem action='presets'/>
|
||||
<separator/>
|
||||
#ifndef MIXBUS
|
||||
<menu action="disk-io-menu">
|
||||
|
@ -848,6 +808,30 @@
|
|||
#endif
|
||||
<menuitem action='custom-volume-pos'/>
|
||||
<separator/>
|
||||
<menuitem action='clear'/>
|
||||
<menuitem action='clear_pre'/>
|
||||
<menuitem action='clear_post'/>
|
||||
<separator/>
|
||||
<menuitem action='cut'/>
|
||||
<menuitem action='copy'/>
|
||||
<menuitem action='paste'/>
|
||||
<menuitem action='delete'/>
|
||||
<separator/>
|
||||
<menuitem action='rename'/>
|
||||
<separator/>
|
||||
<menuitem action='selectall'/>
|
||||
<menuitem action='deselectall'/>
|
||||
<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'/>
|
||||
</popup>
|
||||
|
||||
<popup name='ShuttleUnitPopup' accelerators='true'>
|
||||
|
@ -863,29 +847,9 @@
|
|||
<menuitem action='removeUnusedRegions'/>
|
||||
</popup>
|
||||
|
||||
<popup name='MarkerShowMenu' accelerators='true'>
|
||||
<menuitem action='show-all-markers'/>
|
||||
<menuitem action='show-cd-markers'/>
|
||||
<menuitem action='show-cue-markers'/>
|
||||
<menuitem action='show-scene-markers'/>
|
||||
<menuitem action='show-location-markers'/>
|
||||
</popup>
|
||||
|
||||
<popup name='RangeShowMenu' accelerators='true'>
|
||||
<menuitem action='show-all-ranges'/>
|
||||
<menuitem action='show-session-range'/>
|
||||
<menuitem action='show-punch-range'/>
|
||||
<menuitem action='show-loop-range'/>
|
||||
<menuitem action='show-other-ranges'/>
|
||||
</popup>
|
||||
|
||||
<popup name='PopupRegionMenu' action='PopupRegionMenu' accelerators='true'>
|
||||
<menuitem action='play-selected-regions'/>
|
||||
<menuitem action='tag-selected-regions'/>
|
||||
<separator/>
|
||||
<menuitem action='group-selected-regions'/>
|
||||
<menuitem action='ungroup-selected-regions'/>
|
||||
<separator/>
|
||||
<menuitem action='loop-region'/>
|
||||
<menuitem action='rename-region'/>
|
||||
<menuitem action='show-region-properties'/>
|
||||
|
@ -917,6 +881,7 @@
|
|||
<menu action='RegionMenuPosition'>
|
||||
<menuitem action='naturalize-region'/>
|
||||
<menuitem action='toggle-region-lock'/>
|
||||
<menuitem action='toggle-region-lock-style'/>
|
||||
<menuitem action='toggle-region-video-lock'/>
|
||||
<menuitem action='snap-regions-to-grid'/>
|
||||
<menuitem action='set-region-sync-position'/>
|
||||
|
@ -963,7 +928,6 @@
|
|||
<menuitem action='cut-region-gain'/>
|
||||
<menuitem action='reset-region-gain'/>
|
||||
<menuitem action='reset-region-gain-envelopes'/>
|
||||
<menuitem action='toggle-region-polarity'/>
|
||||
<menuitem action='toggle-region-gain-envelope-active'/>
|
||||
</menu>
|
||||
<menu action='RegionMenuFades'>
|
||||
|
|
|
@ -42,7 +42,6 @@ ArdourDialog::ArdourDialog (const string& title, bool modal, bool use_seperator)
|
|||
, _sensitive (true)
|
||||
, proxy (nullptr)
|
||||
, _splash_pushed (false)
|
||||
, allow_idle (true)
|
||||
{
|
||||
init ();
|
||||
set_position (Gtk::WIN_POS_MOUSE);
|
||||
|
@ -53,12 +52,9 @@ ArdourDialog::ArdourDialog (Gtk::Window& parent, const string& title, bool modal
|
|||
, _sensitive (true)
|
||||
, proxy (nullptr)
|
||||
, _splash_pushed (false)
|
||||
, allow_idle (true)
|
||||
{
|
||||
init ();
|
||||
set_position (Gtk::WIN_POS_CENTER_ON_PARENT);
|
||||
set_transient_for (parent);
|
||||
|
||||
}
|
||||
|
||||
ArdourDialog::~ArdourDialog ()
|
||||
|
@ -69,20 +65,12 @@ ArdourDialog::~ArdourDialog ()
|
|||
proxy->explicit_delete ();
|
||||
}
|
||||
|
||||
void
|
||||
ArdourDialog::disallow_idle ()
|
||||
{
|
||||
allow_idle = false;
|
||||
}
|
||||
|
||||
void
|
||||
ArdourDialog::on_response (int response_id)
|
||||
{
|
||||
pop_splash ();
|
||||
hide ();
|
||||
if (allow_idle) {
|
||||
ARDOUR::GUIIdle ();
|
||||
}
|
||||
ARDOUR::GUIIdle ();
|
||||
Gtk::Dialog::on_response (response_id);
|
||||
}
|
||||
|
||||
|
|
|
@ -51,7 +51,6 @@ public:
|
|||
void on_show ();
|
||||
virtual void on_response (int);
|
||||
void set_ui_sensitive (bool);
|
||||
void disallow_idle ();
|
||||
|
||||
protected:
|
||||
void pop_splash ();
|
||||
|
@ -62,7 +61,6 @@ private:
|
|||
WM::ProxyTemporary* proxy;
|
||||
bool _splash_pushed;
|
||||
void init ();
|
||||
bool allow_idle;
|
||||
|
||||
static sigc::signal<void> CloseAllDialogs;
|
||||
};
|
||||
|
|
|
@ -55,13 +55,17 @@ const char* HttpGet::ca_info = NULL;
|
|||
void
|
||||
HttpGet::ca_setopt (CURL* c)
|
||||
{
|
||||
if (ca_info) {
|
||||
if (ca_info && strlen (ca_info) > 0) {
|
||||
curl_easy_setopt (c, CURLOPT_CAINFO, ca_info);
|
||||
}
|
||||
if (ca_path) {
|
||||
curl_easy_setopt (c, CURLOPT_CAPATH, ca_path);
|
||||
}
|
||||
if (ca_info || ca_path) {
|
||||
|
||||
if (ca_info && strlen (ca_info) == 0) {
|
||||
curl_easy_setopt (c, CURLOPT_SSL_VERIFYPEER, 0);
|
||||
curl_easy_setopt (c, CURLOPT_SSL_VERIFYHOST, 0);
|
||||
} else if (ca_info || ca_path) {
|
||||
curl_easy_setopt (c, CURLOPT_SSL_VERIFYPEER, 1);
|
||||
}
|
||||
}
|
||||
|
@ -80,29 +84,37 @@ HttpGet::setup_certificate_paths ()
|
|||
*
|
||||
* Short of this mess: we could simply bundle a .crt of
|
||||
* COMODO (ardour) and ghandi (freesound) and be done with it.
|
||||
* Alternatively, ship the Mozilla CA list, perhaps using https://mkcert.org/ .
|
||||
*/
|
||||
assert (!ca_path && !ca_info); // call once
|
||||
|
||||
if (Glib::file_test ("/etc/pki/tls/certs/ca-bundle.crt", Glib::FILE_TEST_IS_REGULAR)) {
|
||||
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_IS_REGULAR)) {
|
||||
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_IS_REGULAR)) {
|
||||
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 {
|
||||
ca_info = ""; // disable cert check
|
||||
}
|
||||
// else NULL: use default (currently) "/etc/ssl/certs/ca-certificates.crt" if it exists
|
||||
|
||||
/* 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 ca_path = /etc/ssl/certs and ca_info = /etc/ssl/certs/ca-certificates.crt .
|
||||
* That works on Debian and derivs + openSUSE. It has historically not
|
||||
* worked on RHEL / Fedora, but worst case the directory exists and doesn't
|
||||
* prevent ca_info from working. https://bugzilla.redhat.com/show_bug.cgi?id=1053882
|
||||
if (Glib::file_test ("/etc/pki/tls/certs/ca-bundle.crt", Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_REGULAR)) {
|
||||
// we're on RHEL // https://bugzilla.redhat.com/show_bug.cgi?id=1053882
|
||||
ca_path = "/nonexistent_path"; // don't try "/etc/ssl/certs" it's a trap
|
||||
}
|
||||
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";
|
||||
}
|
||||
|
||||
/* 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
|
||||
*/
|
||||
}
|
||||
|
||||
|
|
|
@ -45,21 +45,6 @@ ArdourMessageDialog::ArdourMessageDialog (Gtk::Window& parent,
|
|||
set_position (WIN_POS_MOUSE);
|
||||
}
|
||||
|
||||
ArdourMessageDialog::ArdourMessageDialog (Gtk::Window* parent,
|
||||
const Glib::ustring& message,
|
||||
bool use_markup,
|
||||
Gtk::MessageType type,
|
||||
Gtk::ButtonsType buttons,
|
||||
bool modal)
|
||||
: Gtk::MessageDialog (message, use_markup, type, buttons, modal)
|
||||
, _splash_pushed (false)
|
||||
{
|
||||
if (parent) {
|
||||
set_transient_for (*parent);
|
||||
}
|
||||
set_position (WIN_POS_MOUSE);
|
||||
}
|
||||
|
||||
ArdourMessageDialog::~ArdourMessageDialog ()
|
||||
{
|
||||
pop_splash ();
|
||||
|
|
|
@ -37,13 +37,6 @@ public:
|
|||
Gtk::ButtonsType buttons = Gtk::BUTTONS_OK,
|
||||
bool modal = false);
|
||||
|
||||
ArdourMessageDialog (Gtk::Window* parent,
|
||||
const Glib::ustring& message,
|
||||
bool use_markup = false,
|
||||
Gtk::MessageType type = Gtk::MESSAGE_INFO,
|
||||
Gtk::ButtonsType buttons = Gtk::BUTTONS_OK,
|
||||
bool modal = false);
|
||||
|
||||
virtual ~ArdourMessageDialog ();
|
||||
|
||||
int run ();
|
||||
|
|
|
@ -125,8 +125,6 @@
|
|||
|
||||
#include "temporal/time.h"
|
||||
|
||||
#include "control_protocol/basic_ui.h"
|
||||
|
||||
#include "about.h"
|
||||
#include "actions.h"
|
||||
#include "add_route_dialog.h"
|
||||
|
@ -146,7 +144,6 @@
|
|||
#include "gui_object.h"
|
||||
#include "gui_thread.h"
|
||||
#include "idleometer.h"
|
||||
#include "instrument_selector.h"
|
||||
#include "io_plugin_window.h"
|
||||
#include "keyboard.h"
|
||||
#include "keyeditor.h"
|
||||
|
@ -216,12 +213,6 @@ static const gchar *_record_mode_strings[] = {
|
|||
static bool
|
||||
ask_about_configuration_copy (string const & old_dir, string const & new_dir, int version)
|
||||
{
|
||||
#ifndef __APPLE__
|
||||
/* guess screen scaling */
|
||||
UIConfiguration::instance ().set_font_scale (1024 * guess_default_ui_scale ());
|
||||
UIConfiguration::instance ().reset_dpi ();
|
||||
#endif
|
||||
|
||||
ArdourMessageDialog msg (string_compose (
|
||||
_("%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"
|
||||
|
@ -255,7 +246,7 @@ libxml_generic_error_func (void* /* parsing_context*/,
|
|||
|
||||
static void
|
||||
libxml_structured_error_func (void* /* parsing_context*/,
|
||||
const xmlError *err)
|
||||
xmlErrorPtr err)
|
||||
{
|
||||
string msg;
|
||||
|
||||
|
@ -267,18 +258,14 @@ libxml_structured_error_func (void* /* parsing_context*/,
|
|||
if (!msg.empty()) {
|
||||
if (err->file && err->line) {
|
||||
error << X_("XML error: ") << msg << " in " << err->file << " at line " << err->line;
|
||||
std::cerr << X_("XML error: ") << msg << " in " << err->file << " at line " << err->line;
|
||||
|
||||
if (err->int2) {
|
||||
error << ':' << err->int2;
|
||||
std::cerr << ':' << err->int2;
|
||||
}
|
||||
|
||||
error << endmsg;
|
||||
std::cerr << std::endl;
|
||||
} else {
|
||||
error << X_("XML error: ") << msg << endmsg;
|
||||
std::cerr << X_("XML error: ") << msg << std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -288,8 +275,8 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
|
|||
: Gtkmm2ext::UI (PROGRAM_NAME, X_("gui"), argcp, argvp)
|
||||
, session_load_in_progress (false)
|
||||
, gui_object_state (new GUIObjectState)
|
||||
, primary_clock (new MainClock (X_("primary"), X_("transport")))
|
||||
, secondary_clock (new MainClock (X_("secondary"), X_("secondary")))
|
||||
, primary_clock (new MainClock (X_("primary"), X_("transport"), true ))
|
||||
, secondary_clock (new MainClock (X_("secondary"), X_("secondary"), false))
|
||||
, big_clock (new AudioClock (X_("bigclock"), false, "big", true, true, false, false))
|
||||
, video_timeline(0)
|
||||
, ignore_dual_punch (false)
|
||||
|
@ -302,7 +289,6 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
|
|||
, _was_dirty (false)
|
||||
, _mixer_on_top (false)
|
||||
, _shared_popup_menu (0)
|
||||
, _basic_ui (0)
|
||||
, startup_fsm (0)
|
||||
, secondary_clock_spacer (0)
|
||||
, latency_disable_button (ArdourButton::led_default_elements)
|
||||
|
@ -374,7 +360,6 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
|
|||
record_mode_strings = I18N (_record_mode_strings);
|
||||
|
||||
if (ARDOUR::handle_old_configuration_files (boost::bind (ask_about_configuration_copy, _1, _2, _3))) {
|
||||
|
||||
{
|
||||
/* "touch" the been-here-before path now that config has been migrated */
|
||||
PBD::ScopedFileDescriptor fout (g_open (been_here_before_path ().c_str(), O_CREAT|O_TRUNC|O_RDWR, 0666));
|
||||
|
@ -403,11 +388,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
|
|||
/* stop libxml from spewing to stdout/stderr */
|
||||
|
||||
xmlSetGenericErrorFunc (this, libxml_generic_error_func);
|
||||
|
||||
/* Cast to xmlStructuredErrorFunc to cope with different constness in different
|
||||
* versions of libxml2. */
|
||||
|
||||
xmlSetStructuredErrorFunc (this, (xmlStructuredErrorFunc)libxml_structured_error_func);
|
||||
xmlSetStructuredErrorFunc (this, libxml_structured_error_func);
|
||||
|
||||
/* Set this up early */
|
||||
|
||||
|
@ -495,6 +476,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
|
|||
|
||||
/* lets get this party started */
|
||||
|
||||
setup_gtk_ardour_enums ();
|
||||
setup_profile ();
|
||||
|
||||
SessionEvent::create_per_thread_pool ("GUI", 4096);
|
||||
|
@ -607,7 +589,7 @@ ARDOUR_UI::engine_stopped ()
|
|||
ENSURE_GUI_THREAD (*this, &ARDOUR_UI::engine_stopped)
|
||||
ActionManager::set_sensitive (ActionManager::engine_sensitive_actions, false);
|
||||
ActionManager::set_sensitive (ActionManager::engine_opposite_sensitive_actions, true);
|
||||
update_sample_rate ();
|
||||
update_sample_rate (0);
|
||||
update_cpu_load ();
|
||||
}
|
||||
|
||||
|
@ -620,7 +602,7 @@ ARDOUR_UI::engine_running (uint32_t cnt)
|
|||
|
||||
update_disk_space ();
|
||||
update_cpu_load ();
|
||||
update_sample_rate ();
|
||||
update_sample_rate (AudioEngine::instance()->sample_rate());
|
||||
update_timecode_format ();
|
||||
update_peak_thread_work ();
|
||||
ActionManager::set_sensitive (ActionManager::engine_sensitive_actions, true);
|
||||
|
@ -643,7 +625,7 @@ ARDOUR_UI::engine_halted (const char* reason, bool free_reason)
|
|||
ActionManager::set_sensitive (ActionManager::engine_sensitive_actions, false);
|
||||
ActionManager::set_sensitive (ActionManager::engine_opposite_sensitive_actions, true);
|
||||
|
||||
update_sample_rate ();
|
||||
update_sample_rate (0);
|
||||
|
||||
string msgstr;
|
||||
|
||||
|
@ -685,8 +667,8 @@ ARDOUR_UI::post_engine ()
|
|||
/* connect to important signals */
|
||||
|
||||
AudioEngine::instance()->Stopped.connect (forever_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::engine_stopped, this), gui_context());
|
||||
AudioEngine::instance()->SampleRateChanged.connect (forever_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::update_sample_rate, this), gui_context());
|
||||
AudioEngine::instance()->BufferSizeChanged.connect (forever_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::update_sample_rate, this), gui_context());
|
||||
AudioEngine::instance()->SampleRateChanged.connect (forever_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::update_sample_rate, this, _1), gui_context());
|
||||
AudioEngine::instance()->BufferSizeChanged.connect (forever_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::update_sample_rate, this, _1), gui_context());
|
||||
AudioEngine::instance()->Halted.connect_same_thread (halt_connection, boost::bind (&ARDOUR_UI::engine_halted, this, _1, false));
|
||||
AudioEngine::instance()->BecameSilent.connect (forever_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::audioengine_became_silent, this), gui_context());
|
||||
|
||||
|
@ -875,8 +857,6 @@ ARDOUR_UI::~ARDOUR_UI ()
|
|||
recorder->cleanup ();
|
||||
}
|
||||
|
||||
InstrumentSelector::DropPluginInfoPtr ();
|
||||
|
||||
if (getenv ("ARDOUR_RUNNING_UNDER_VALGRIND")) {
|
||||
// don't bother at 'real' exit. the OS cleans up for us.
|
||||
delete big_clock; big_clock = 0;
|
||||
|
@ -1207,14 +1187,12 @@ ARDOUR_UI::every_point_zero_something_seconds ()
|
|||
_editor_meter_peaked = false;
|
||||
}
|
||||
|
||||
if (!UIConfiguration::instance().get_no_strobe()) {
|
||||
const float mpeak = editor_meter->update_meters();
|
||||
const bool peaking = mpeak > UIConfiguration::instance().get_meter_peak();
|
||||
const float mpeak = editor_meter->update_meters();
|
||||
const bool peaking = mpeak > UIConfiguration::instance().get_meter_peak();
|
||||
|
||||
if (!_editor_meter_peaked && peaking) {
|
||||
editor_meter_peak_display.set_active_state (Gtkmm2ext::ExplicitActive);
|
||||
_editor_meter_peaked = true;
|
||||
}
|
||||
if (!_editor_meter_peaked && peaking) {
|
||||
editor_meter_peak_display.set_active_state ( Gtkmm2ext::ExplicitActive );
|
||||
_editor_meter_peaked = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1252,9 +1230,9 @@ ARDOUR_UI::set_fps_timeout_connection ()
|
|||
}
|
||||
|
||||
void
|
||||
ARDOUR_UI::update_sample_rate ()
|
||||
ARDOUR_UI::update_sample_rate (samplecnt_t)
|
||||
{
|
||||
std::string label = string_compose (X_("<span weight=\"ultralight\">%1</span>:"), _("Audio"));
|
||||
std::string label = string_compose (X_("<span weight=\"ultralight\">%1</span>: "), _("Audio"));
|
||||
|
||||
ENSURE_GUI_THREAD (*this, &ARDOUR_UI::update_sample_rate, ignored)
|
||||
|
||||
|
@ -1272,12 +1250,18 @@ ARDOUR_UI::update_sample_rate ()
|
|||
sample_rate_label.set_markup (label + _("none"));
|
||||
|
||||
} else {
|
||||
|
||||
char buf[64];
|
||||
snprintf (buf, sizeof (buf), "%4.1f", (AudioEngine::instance()->usecs_per_cycle() / 1000.0f));
|
||||
const char* const bg = (_session && _session->nominal_sample_rate () != rate) ? " background=\"red\" foreground=\"white\"" : "";
|
||||
sample_rate_label.set_markup (string_compose ("%1 <span%2>%3</span> %4 %5", label, bg, ARDOUR_UI_UTILS::rate_as_string (rate), buf, _("ms")));
|
||||
|
||||
if (fmod (rate, 1000.0) != 0.0) {
|
||||
snprintf (buf, sizeof (buf), "%.1f %s / %4.1f %s",
|
||||
(float) rate / 1000.0f, _("kHz"),
|
||||
(AudioEngine::instance()->usecs_per_cycle() / 1000.0f), _("ms"));
|
||||
} else {
|
||||
snprintf (buf, sizeof (buf), "%" PRId64 " %s / %4.1f %s",
|
||||
rate / 1000, _("kHz"),
|
||||
(AudioEngine::instance()->usecs_per_cycle() / 1000.0f), _("ms"));
|
||||
}
|
||||
sample_rate_label.set_markup (label + buf);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1432,10 +1416,6 @@ ARDOUR_UI::format_disk_space_label (float remain_sec)
|
|||
|
||||
std::string label = string_compose (X_("<span weight=\"ultralight\">%1</span>: "), _("Rec"));
|
||||
|
||||
if (_session && FLAC == _session->config.get_native_file_header_format () && remain_sec <= 86400) {
|
||||
label += u8"\u2265"; // Greater-Than or Equal To
|
||||
}
|
||||
|
||||
if (remain_sec > 86400) {
|
||||
disk_space_label.set_markup (label + _(">24h"));
|
||||
} else if (remain_sec > 32400 /* 9 hours */) {
|
||||
|
@ -1495,10 +1475,10 @@ ARDOUR_UI::update_timecode_format ()
|
|||
|
||||
if (_session) {
|
||||
bool matching;
|
||||
std::shared_ptr<TimecodeTransportMaster> tcmaster;
|
||||
std::shared_ptr<TransportMaster> tm = TransportMasterManager::instance().current();
|
||||
boost::shared_ptr<TimecodeTransportMaster> tcmaster;
|
||||
boost::shared_ptr<TransportMaster> tm = TransportMasterManager::instance().current();
|
||||
|
||||
if ((tm->type() == LTC || tm->type() == MTC) && (tcmaster = std::dynamic_pointer_cast<TimecodeTransportMaster>(tm)) != 0 && tm->locked()) {
|
||||
if ((tm->type() == LTC || tm->type() == MTC) && (tcmaster = boost::dynamic_pointer_cast<TimecodeTransportMaster>(tm)) != 0 && tm->locked()) {
|
||||
matching = (tcmaster->apparent_timecode_format() == _session->config.get_timecode_format());
|
||||
} else {
|
||||
matching = true;
|
||||
|
@ -1561,7 +1541,7 @@ ARDOUR_UI::session_add_midi_route (
|
|||
ChanCount one_midi_channel;
|
||||
one_midi_channel.set (DataType::MIDI, 1);
|
||||
|
||||
list<std::shared_ptr<MidiTrack> > tracks;
|
||||
list<boost::shared_ptr<MidiTrack> > tracks;
|
||||
tracks = _session->new_midi_track (one_midi_channel, one_midi_channel, strict_io, instrument, pset, route_group, how_many, name_template, order, ARDOUR::Normal, true, trigger_visibility);
|
||||
|
||||
if (tracks.size() != how_many) {
|
||||
|
@ -1598,7 +1578,7 @@ ARDOUR_UI::session_add_audio_route (
|
|||
ARDOUR::PresentationInfo::order_t order,
|
||||
bool trigger_visibility)
|
||||
{
|
||||
list<std::shared_ptr<AudioTrack> > tracks;
|
||||
list<boost::shared_ptr<AudioTrack> > tracks;
|
||||
RouteList routes;
|
||||
|
||||
assert (_session);
|
||||
|
@ -1629,7 +1609,7 @@ ARDOUR_UI::session_add_audio_route (
|
|||
}
|
||||
|
||||
if (strict_io) {
|
||||
for (list<std::shared_ptr<AudioTrack> >::iterator i = tracks.begin(); i != tracks.end(); ++i) {
|
||||
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) {
|
||||
|
@ -1780,11 +1760,11 @@ ARDOUR_UI::trx_record_enable_all_tracks ()
|
|||
return false;
|
||||
}
|
||||
|
||||
std::shared_ptr<RouteList> rl = _session->get_tracks ();
|
||||
boost::shared_ptr<RouteList> rl = _session->get_tracks ();
|
||||
bool none_record_enabled = true;
|
||||
|
||||
for (RouteList::iterator r = rl->begin(); r != rl->end(); ++r) {
|
||||
std::shared_ptr<Track> t = std::dynamic_pointer_cast<Track> (*r);
|
||||
boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*r);
|
||||
assert (t);
|
||||
|
||||
if (t->rec_enable_control()->get_value()) {
|
||||
|
@ -2149,13 +2129,13 @@ ARDOUR_UI::toggle_record_enable (uint16_t rid)
|
|||
return;
|
||||
}
|
||||
|
||||
std::shared_ptr<Route> r;
|
||||
boost::shared_ptr<Route> r;
|
||||
|
||||
if ((r = _session->get_remote_nth_route (rid)) != 0) {
|
||||
|
||||
std::shared_ptr<Track> t;
|
||||
boost::shared_ptr<Track> t;
|
||||
|
||||
if ((t = std::dynamic_pointer_cast<Track>(r)) != 0) {
|
||||
if ((t = boost::dynamic_pointer_cast<Track>(r)) != 0) {
|
||||
t->rec_enable_control()->set_value (!t->rec_enable_control()->get_value(), Controllable::UseGroup);
|
||||
}
|
||||
}
|
||||
|
@ -2192,7 +2172,7 @@ ARDOUR_UI::blink_handler (bool blink_on)
|
|||
{
|
||||
sync_blink (blink_on);
|
||||
|
||||
if (UIConfiguration::instance().get_no_strobe() || !UIConfiguration::instance().get_blink_alert_indicators()) {
|
||||
if (!UIConfiguration::instance().get_blink_alert_indicators()) {
|
||||
blink_on = true;
|
||||
}
|
||||
error_blink (blink_on);
|
||||
|
@ -2214,15 +2194,6 @@ ARDOUR_UI::update_clocks ()
|
|||
void
|
||||
ARDOUR_UI::start_clocking ()
|
||||
{
|
||||
if (UIConfiguration::instance().get_no_strobe()) {
|
||||
if (!_session) {
|
||||
return;
|
||||
}
|
||||
_session->TransportStateChange.connect (clock_state_connection, MISSING_INVALIDATOR, sigc::mem_fun (*this, &ARDOUR_UI::update_clocks), gui_context());
|
||||
_session->Located.connect (clock_state_connection, MISSING_INVALIDATOR, sigc::mem_fun (*this, &ARDOUR_UI::update_clocks), gui_context());
|
||||
return;
|
||||
}
|
||||
|
||||
if (UIConfiguration::instance().get_super_rapid_clock_update()) {
|
||||
clock_signal_connection = Timers::fps_connect (sigc::mem_fun(*this, &ARDOUR_UI::update_clocks));
|
||||
} else {
|
||||
|
@ -2233,7 +2204,6 @@ ARDOUR_UI::start_clocking ()
|
|||
void
|
||||
ARDOUR_UI::stop_clocking ()
|
||||
{
|
||||
clock_state_connection.drop_connections ();
|
||||
clock_signal_connection.disconnect ();
|
||||
}
|
||||
|
||||
|
@ -2282,7 +2252,7 @@ void
|
|||
ARDOUR_UI::primary_clock_value_changed ()
|
||||
{
|
||||
if (_session) {
|
||||
_session->request_locate (primary_clock->last_when ().samples());
|
||||
_session->request_locate (primary_clock->current_time ().samples());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2290,7 +2260,7 @@ void
|
|||
ARDOUR_UI::big_clock_value_changed ()
|
||||
{
|
||||
if (_session) {
|
||||
_session->request_locate (big_clock->last_when ().samples());
|
||||
_session->request_locate (big_clock->current_time ().samples());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2298,7 +2268,7 @@ void
|
|||
ARDOUR_UI::secondary_clock_value_changed ()
|
||||
{
|
||||
if (_session) {
|
||||
_session->request_locate (secondary_clock->last_when ().samples());
|
||||
_session->request_locate (secondary_clock->current_time ().samples());
|
||||
}
|
||||
}
|
||||
void
|
||||
|
@ -2375,11 +2345,12 @@ ARDOUR_UI::route_setup_info (const std::string& script_path)
|
|||
return rv;
|
||||
}
|
||||
|
||||
LuaState lua (true, true);
|
||||
LuaState lua;
|
||||
lua.Print.connect (&_lua_print);
|
||||
lua.sandbox (true);
|
||||
|
||||
lua_State* L = lua.getState();
|
||||
LuaInstance::register_classes (L, true);
|
||||
LuaInstance::register_classes (L);
|
||||
LuaBindings::set_session (L, _session);
|
||||
luabridge::push <PublicEditor *> (L, &PublicEditor::instance());
|
||||
lua_setglobal (L, "Editor");
|
||||
|
@ -2427,11 +2398,12 @@ ARDOUR_UI::meta_route_setup (const std::string& script_path)
|
|||
return;
|
||||
}
|
||||
|
||||
LuaState lua (true, true);
|
||||
LuaState lua;
|
||||
lua.Print.connect (&_lua_print);
|
||||
lua.sandbox (true);
|
||||
|
||||
lua_State* L = lua.getState();
|
||||
LuaInstance::register_classes (L, true);
|
||||
LuaInstance::register_classes (L);
|
||||
LuaBindings::set_session (L, _session);
|
||||
luabridge::push <PublicEditor *> (L, &PublicEditor::instance());
|
||||
lua_setglobal (L, "Editor");
|
||||
|
@ -2472,13 +2444,12 @@ ARDOUR_UI::meta_session_setup (const std::string& script_path)
|
|||
return;
|
||||
}
|
||||
|
||||
bool sandbox = UIConfiguration::instance().get_sandbox_all_lua_scripts ();
|
||||
|
||||
LuaState lua (true, sandbox);
|
||||
LuaState lua;
|
||||
lua.Print.connect (&_lua_print);
|
||||
lua.sandbox (false);
|
||||
|
||||
lua_State* L = lua.getState();
|
||||
LuaInstance::register_classes (L, sandbox);
|
||||
LuaInstance::register_classes (L);
|
||||
LuaBindings::set_session (L, _session);
|
||||
luabridge::push <PublicEditor *> (L, &PublicEditor::instance());
|
||||
lua_setglobal (L, "Editor");
|
||||
|
@ -2890,34 +2861,6 @@ ARDOUR_UI::add_route_dialog_response (int r)
|
|||
bool strict_io = add_route_dialog->use_strict_io ();
|
||||
bool trigger_visibility = add_route_dialog->show_on_cue_page ();
|
||||
|
||||
AddRouteDialog::TypeWanted type = add_route_dialog->type_wanted ();
|
||||
|
||||
if (input_chan.n_total () == 0 && type != AddRouteDialog::VCAMaster) {
|
||||
/* Custom */
|
||||
Gtk::HBox h;
|
||||
Gtk::Label* l = manage (new Label (add_route_dialog->type_wanted() == AddRouteDialog::AudioTrack ? _("Audio Channels for new track:") : _("Audio Channels for new bus:")));
|
||||
Gtk::Adjustment* a = manage (new Gtk::Adjustment (2, 0, 121, 1)); // arbitrary max 11^2 for 10th order amb)
|
||||
Gtk::SpinButton* s = manage (new Gtk::SpinButton (*a, 1, 0));
|
||||
|
||||
h.set_spacing (6);
|
||||
h.pack_start (*l, false, false);
|
||||
h.pack_start (*s, true, true);
|
||||
|
||||
ArdourDialog d (_("Custom Channel"), true, false);
|
||||
d.get_vbox()->set_border_width (12);
|
||||
d.get_vbox()->pack_start (h, false, false);
|
||||
|
||||
d.add_button(Stock::CANCEL, RESPONSE_CANCEL);
|
||||
d.add_button(Stock::OK, RESPONSE_OK);
|
||||
d.set_default_response (RESPONSE_OK);
|
||||
d.set_position (WIN_POS_MOUSE);
|
||||
d.show_all ();
|
||||
|
||||
if (d.run () == RESPONSE_OK) {
|
||||
input_chan.set (DataType::AUDIO, a->get_value ());
|
||||
}
|
||||
}
|
||||
|
||||
if (oac & AutoConnectMaster) {
|
||||
output_chan.set (DataType::AUDIO, (_session->master_out() ? _session->master_out()->n_inputs().n_audio() : input_chan.n_audio()));
|
||||
output_chan.set (DataType::MIDI, 0);
|
||||
|
@ -3167,35 +3110,3 @@ ARDOUR_UI::setup_toplevel_window (Gtk::Window& window, const string& name, void*
|
|||
window.signal_key_release_event().connect (sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::key_event_handler), &window), false);
|
||||
}
|
||||
|
||||
void
|
||||
ARDOUR_UI::trigger_slot (int c, int r)
|
||||
{
|
||||
if (!_basic_ui) {
|
||||
return;
|
||||
}
|
||||
|
||||
_basic_ui->bang_trigger_at (c, r);
|
||||
}
|
||||
|
||||
void
|
||||
ARDOUR_UI::trigger_cue_row (int r)
|
||||
{
|
||||
if (!_basic_ui) {
|
||||
return;
|
||||
}
|
||||
|
||||
_basic_ui->trigger_cue_row (r);
|
||||
}
|
||||
|
||||
void
|
||||
ARDOUR_UI::stop_all_cues (bool immediately)
|
||||
{
|
||||
_basic_ui->trigger_stop_all (immediately);
|
||||
}
|
||||
|
||||
void
|
||||
ARDOUR_UI::stop_cues (int col, bool immediately)
|
||||
{
|
||||
_basic_ui->trigger_stop_col (col, immediately);
|
||||
}
|
||||
|
||||
|
|
|
@ -175,7 +175,6 @@ class MidiTracer;
|
|||
class NSM_Client;
|
||||
class LevelMeterHBox;
|
||||
class GUIObjectState;
|
||||
class BasicUI;
|
||||
|
||||
namespace ARDOUR {
|
||||
class ControlProtocolInfo;
|
||||
|
@ -214,6 +213,7 @@ public:
|
|||
void launch_reference ();
|
||||
void launch_tracker ();
|
||||
void launch_subscribe ();
|
||||
void launch_cheat_sheet ();
|
||||
void launch_website ();
|
||||
void launch_website_dev ();
|
||||
void launch_forums ();
|
||||
|
@ -227,9 +227,7 @@ public:
|
|||
int copy_demo_sessions ();
|
||||
int load_session (const std::string& path, const std::string& snapshot, std::string mix_template = std::string());
|
||||
bool session_load_in_progress;
|
||||
int build_session (std::string const& path, std::string const& snapshot, std::string const& session_template, ARDOUR::BusProfile const&, bool from_startup_fsm, bool unnamed, Temporal::TimeDomain domain);
|
||||
int build_session_stage_two (std::string const& path, std::string const& snapshot, std::string const& session_template, ARDOUR::BusProfile const&, bool unnamed, Temporal::TimeDomain domain, ARDOUR::samplecnt_t samplerate = 0);
|
||||
|
||||
int build_session (std::string const& path, std::string const& snapshot, std::string const& session_template, ARDOUR::BusProfile const&, bool from_startup_fsm, bool unnamed);
|
||||
bool session_is_new() const { return _session_is_new; }
|
||||
|
||||
ARDOUR::Session* the_session() { return _session; }
|
||||
|
@ -241,7 +239,7 @@ public:
|
|||
|
||||
void start_session_load (bool create_new);
|
||||
void session_dialog_response_handler (int response, SessionDialog* session_dialog);
|
||||
void build_session_from_dialog (SessionDialog&, std::string const& session_name, std::string const& session_path, std::string const& session_template, Temporal::TimeDomain domain);
|
||||
void build_session_from_dialog (SessionDialog&, std::string const& session_name, std::string const& session_path, std::string const& session_template);
|
||||
bool ask_about_loading_existing_session (const std::string& session_path);
|
||||
int load_session_from_startup_fsm ();
|
||||
|
||||
|
@ -252,8 +250,6 @@ public:
|
|||
int save_state_canfail (std::string state_name = "", bool switch_to_it = false);
|
||||
void save_state (const std::string & state_name = "", bool switch_to_it = false);
|
||||
|
||||
int new_session_from_aaf (std::string const&, std::string const&, std::string&, std::string&);
|
||||
|
||||
static ARDOUR_UI *instance () { return theArdourUI; }
|
||||
|
||||
/* signal emitted when escape key is pressed. All UI components that
|
||||
|
@ -275,6 +271,8 @@ public:
|
|||
|
||||
void reset_focus (Gtk::Widget*);
|
||||
|
||||
static PublicEditor* _instance;
|
||||
|
||||
/** Emitted frequently with the audible sample, false, and the edit point as
|
||||
* parameters respectively.
|
||||
*
|
||||
|
@ -295,11 +293,6 @@ public:
|
|||
XMLNode* clock_mode_settings () const;
|
||||
XMLNode* tearoff_settings (const char*) const;
|
||||
|
||||
void trigger_slot (int c, int r);
|
||||
void trigger_cue_row (int r);
|
||||
void stop_all_cues (bool immediately);
|
||||
void stop_cues (int c, bool immediately);
|
||||
|
||||
void save_ardour_state ();
|
||||
gboolean configure_handler (GdkEventConfigure* conf);
|
||||
|
||||
|
@ -444,7 +437,6 @@ private:
|
|||
|
||||
Gtk::Menu* _shared_popup_menu;
|
||||
|
||||
BasicUI* _basic_ui;
|
||||
void hide_tabbable (ArdourWidgets::Tabbable*);
|
||||
void detach_tabbable (ArdourWidgets::Tabbable*);
|
||||
void attach_tabbable (ArdourWidgets::Tabbable*);
|
||||
|
@ -475,7 +467,8 @@ private:
|
|||
|
||||
void audio_midi_setup_reconfigure_done (int response, std::string path, std::string snapshot, std::string mix_template);
|
||||
int load_session_stage_two (const std::string& path, const std::string& snapshot, std::string mix_template = std::string());
|
||||
void audio_midi_setup_for_new_session_done (int response, std::string path, std::string snapshot, std::string session_template, ARDOUR::BusProfile const&, bool unnamed, Temporal::TimeDomain domain);
|
||||
void audio_midi_setup_for_new_session_done (int response, std::string path, std::string snapshot, std::string session_template, ARDOUR::BusProfile const&, bool unnamed);
|
||||
int build_session_stage_two (std::string const& path, std::string const& snapshot, std::string const& session_template, ARDOUR::BusProfile const&, bool unnamed);
|
||||
sigc::connection _engine_dialog_connection;
|
||||
|
||||
void save_session_at_its_request (std::string);
|
||||
|
@ -618,6 +611,10 @@ private:
|
|||
void primary_clock_value_changed ();
|
||||
void secondary_clock_value_changed ();
|
||||
|
||||
/* called by Blink signal */
|
||||
|
||||
void transport_rec_enable_blink (bool onoff);
|
||||
|
||||
/* menu bar and associated stuff */
|
||||
|
||||
Gtk::MenuBar* menu_bar;
|
||||
|
@ -644,7 +641,7 @@ private:
|
|||
void update_peak_thread_work ();
|
||||
|
||||
Gtk::Label sample_rate_label;
|
||||
void update_sample_rate ();
|
||||
void update_sample_rate (ARDOUR::samplecnt_t);
|
||||
|
||||
Gtk::Label format_label;
|
||||
void update_format ();
|
||||
|
@ -950,8 +947,6 @@ private:
|
|||
|
||||
void ask_about_scratch_deletion ();
|
||||
bool nsm_first_session_opened;
|
||||
|
||||
PBD::ScopedConnectionList clock_state_connection;
|
||||
};
|
||||
|
||||
#endif /* __ardour_gui_h__ */
|
||||
|
|
|
@ -364,16 +364,14 @@ ARDOUR_UI::setup_transport ()
|
|||
latency_disable_button.set_related_action (act);
|
||||
|
||||
set_size_request_to_display_given_text (route_latency_value, "1000 spl", 0, 0);
|
||||
set_size_request_to_display_given_text (io_latency_value, "888.88 ms", 0, 0);
|
||||
set_size_request_to_display_given_text (io_latency_value, "1000 spl", 0, 0);
|
||||
|
||||
/* connect signals */
|
||||
ARDOUR_UI::Clock.connect (sigc::bind (sigc::mem_fun (primary_clock, &MainClock::set), false));
|
||||
ARDOUR_UI::Clock.connect (sigc::bind (sigc::mem_fun (secondary_clock, &MainClock::set), false));
|
||||
|
||||
primary_clock->ValueChanged.connect (sigc::mem_fun(*this, &ARDOUR_UI::primary_clock_value_changed));
|
||||
primary_clock->change_display_delta_mode_signal.connect (sigc::mem_fun(UIConfiguration::instance(), &UIConfiguration::set_primary_clock_delta_mode));
|
||||
secondary_clock->ValueChanged.connect (sigc::mem_fun(*this, &ARDOUR_UI::secondary_clock_value_changed));
|
||||
secondary_clock->change_display_delta_mode_signal.connect (sigc::mem_fun(UIConfiguration::instance(), &UIConfiguration::set_secondary_clock_delta_mode));
|
||||
big_clock->ValueChanged.connect (sigc::mem_fun(*this, &ARDOUR_UI::big_clock_value_changed));
|
||||
|
||||
editor_visibility_button.signal_drag_failed().connect (sigc::bind (sigc::ptr_fun (drag_failed), editor));
|
||||
|
@ -445,8 +443,8 @@ ARDOUR_UI::setup_transport ()
|
|||
/* and widget text */
|
||||
auto_return_button.set_text(_("Auto Return"));
|
||||
follow_edits_button.set_text(_("Follow Range"));
|
||||
punch_in_button.set_text (S_("Punch|In"));
|
||||
punch_out_button.set_text (S_("Punch|Out"));
|
||||
punch_in_button.set_text (_("In"));
|
||||
punch_out_button.set_text (_("Out"));
|
||||
|
||||
record_mode_selector.AddMenuElem (MenuElem (record_mode_strings[(int)RecLayered], sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::set_record_mode), RecLayered)));
|
||||
record_mode_selector.AddMenuElem (MenuElem (record_mode_strings[(int)RecNonLayered], sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::set_record_mode), RecNonLayered)));
|
||||
|
@ -896,7 +894,7 @@ ARDOUR_UI::feedback_blink (bool onoff)
|
|||
feedback_alert_button.set_active_color (UIConfigurationBase::instance().color ("feedback alert: alt active", NULL));
|
||||
}
|
||||
} else {
|
||||
feedback_alert_button.set_text (_("Feedback"));
|
||||
feedback_alert_button.set_text ("Feedback");
|
||||
feedback_alert_button.reset_fixed_colors ();
|
||||
feedback_alert_button.set_active (false);
|
||||
}
|
||||
|
|
|
@ -121,11 +121,11 @@ ARDOUR_UI::reset_focus (Gtk::Widget* w)
|
|||
void
|
||||
ARDOUR_UI::monitor_dim_all ()
|
||||
{
|
||||
std::shared_ptr<Route> mon = _session->monitor_out ();
|
||||
boost::shared_ptr<Route> mon = _session->monitor_out ();
|
||||
if (!mon) {
|
||||
return;
|
||||
}
|
||||
std::shared_ptr<ARDOUR::MonitorProcessor> _monitor = mon->monitor_control ();
|
||||
boost::shared_ptr<ARDOUR::MonitorProcessor> _monitor = mon->monitor_control ();
|
||||
|
||||
Glib::RefPtr<ToggleAction> tact = ActionManager::get_toggle_action (X_("Monitor"), "monitor-dim-all");
|
||||
_monitor->set_dim_all (tact->get_active());
|
||||
|
@ -134,11 +134,11 @@ ARDOUR_UI::monitor_dim_all ()
|
|||
void
|
||||
ARDOUR_UI::monitor_cut_all ()
|
||||
{
|
||||
std::shared_ptr<Route> mon = _session->monitor_out ();
|
||||
boost::shared_ptr<Route> mon = _session->monitor_out ();
|
||||
if (!mon) {
|
||||
return;
|
||||
}
|
||||
std::shared_ptr<ARDOUR::MonitorProcessor> _monitor = mon->monitor_control ();
|
||||
boost::shared_ptr<ARDOUR::MonitorProcessor> _monitor = mon->monitor_control ();
|
||||
|
||||
Glib::RefPtr<ToggleAction> tact = ActionManager::get_toggle_action (X_("Monitor"), "monitor-cut-all");
|
||||
_monitor->set_cut_all (tact->get_active());
|
||||
|
@ -147,11 +147,11 @@ ARDOUR_UI::monitor_cut_all ()
|
|||
void
|
||||
ARDOUR_UI::monitor_mono ()
|
||||
{
|
||||
std::shared_ptr<Route> mon = _session->monitor_out ();
|
||||
boost::shared_ptr<Route> mon = _session->monitor_out ();
|
||||
if (!mon) {
|
||||
return;
|
||||
}
|
||||
std::shared_ptr<ARDOUR::MonitorProcessor> _monitor = mon->monitor_control ();
|
||||
boost::shared_ptr<ARDOUR::MonitorProcessor> _monitor = mon->monitor_control ();
|
||||
|
||||
Glib::RefPtr<ToggleAction> tact = ActionManager::get_toggle_action (X_("Monitor"), "monitor-mono");
|
||||
_monitor->set_mono (tact->get_active());
|
||||
|
@ -180,8 +180,35 @@ ARDOUR_UI::update_transport_clocks (samplepos_t p)
|
|||
{
|
||||
timepos_t pos (p);
|
||||
|
||||
primary_clock->set (pos);
|
||||
secondary_clock->set (pos);
|
||||
switch (UIConfiguration::instance().get_primary_clock_delta_mode()) {
|
||||
case NoDelta:
|
||||
primary_clock->set (pos);
|
||||
break;
|
||||
case DeltaEditPoint:
|
||||
primary_clock->set_duration (pos.distance (editor->get_preferred_edit_position (EDIT_IGNORE_PHEAD)), false);
|
||||
break;
|
||||
case DeltaOriginMarker:
|
||||
{
|
||||
Location* loc = _session->locations()->clock_origin_location ();
|
||||
primary_clock->set_duration (pos.distance (loc->start()));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
switch (UIConfiguration::instance().get_secondary_clock_delta_mode()) {
|
||||
case NoDelta:
|
||||
secondary_clock->set (pos);
|
||||
break;
|
||||
case DeltaEditPoint:
|
||||
secondary_clock->set_duration (pos.distance (editor->get_preferred_edit_position (EDIT_IGNORE_PHEAD)), false);
|
||||
break;
|
||||
case DeltaOriginMarker:
|
||||
{
|
||||
Location* loc = _session->locations()->clock_origin_location ();
|
||||
secondary_clock->set_duration (pos.distance (loc->start()));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (big_clock_window) {
|
||||
big_clock->set (pos);
|
||||
|
@ -211,4 +238,3 @@ ARDOUR_UI::record_state_changed ()
|
|||
big_clock->set_active (false);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,712 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2023 Robin Gareus <robin@gareus.org>
|
||||
* Copyright (C) 2023-2024 Adrien Gesta-Fline <dev.agfline@posteo.net>
|
||||
*
|
||||
* 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 <fcntl.h> // O_WRONLY
|
||||
#include <glib/gstdio.h> // g_unlink()
|
||||
|
||||
#include "pbd/basename.h"
|
||||
#include "pbd/convert.h"
|
||||
#include "pbd/file_utils.h"
|
||||
|
||||
#include "ardour/audio_track.h"
|
||||
#include "ardour/audioengine.h"
|
||||
#include "ardour/audioregion.h"
|
||||
#include "ardour/filename_extensions.h"
|
||||
#include "ardour/import_status.h"
|
||||
#include "ardour/playlist.h"
|
||||
#include "ardour/plugin_manager.h"
|
||||
#include "ardour/region_factory.h"
|
||||
#include "ardour/source_factory.h"
|
||||
#include "ardour/utils.h"
|
||||
|
||||
#include "aaf/libaaf.h"
|
||||
#include "aaf/utils.h"
|
||||
|
||||
#include "ardour_ui.h"
|
||||
#include "public_editor.h"
|
||||
|
||||
#include "pbd/i18n.h"
|
||||
|
||||
using namespace std;
|
||||
using namespace PBD;
|
||||
using namespace ARDOUR;
|
||||
|
||||
static void
|
||||
aaf_debug_callback (struct aafLog* log, void* ctxdata, int libid, int type, const char* srcfile, const char* srcfunc, int lineno, const char* msg, void* user)
|
||||
{
|
||||
const char* eol = "";
|
||||
|
||||
if (libid != LOG_SRC_ID_TRACE && libid != LOG_SRC_ID_DUMP) {
|
||||
switch (type) {
|
||||
case VERB_SUCCESS:
|
||||
PBD::info << string_compose ("[libaaf] %1:%2 in %3(): ", srcfile, lineno, srcfunc);
|
||||
break;
|
||||
case VERB_ERROR:
|
||||
PBD::error << string_compose ("[libaaf] %1:%2 in %3(): ", srcfile, lineno, srcfunc);
|
||||
break;
|
||||
case VERB_WARNING:
|
||||
PBD::warning << string_compose ("[libaaf] %1:%2 in %3(): ", srcfile, lineno, srcfunc);
|
||||
break;
|
||||
// case VERB_DEBUG: PBD::debug << string_compose ("[libaaf] %1:%2 in %3(): ", srcfile, lineno, srcfunc); break;
|
||||
}
|
||||
}
|
||||
|
||||
if (libid != LOG_SRC_ID_DUMP) {
|
||||
eol = "\n";
|
||||
}
|
||||
|
||||
switch (type) {
|
||||
case VERB_SUCCESS:
|
||||
PBD::info << msg << eol;
|
||||
break;
|
||||
case VERB_ERROR:
|
||||
PBD::error << msg << eol;
|
||||
break;
|
||||
case VERB_WARNING:
|
||||
PBD::warning << msg << eol;
|
||||
break;
|
||||
// case VERB_DEBUG: PBD::debug << msg << eol; break;
|
||||
}
|
||||
|
||||
LOG_BUFFER_RESET (log);
|
||||
}
|
||||
|
||||
static std::shared_ptr<AudioTrack>
|
||||
get_nth_audio_track (uint32_t nth, std::shared_ptr<RouteList const> routes)
|
||||
{
|
||||
RouteList rl = *(routes);
|
||||
rl.sort (Stripable::Sorter ());
|
||||
|
||||
for (auto const& r : rl) {
|
||||
std::shared_ptr<AudioTrack> at = std::dynamic_pointer_cast<AudioTrack> (r);
|
||||
if (!at) {
|
||||
continue;
|
||||
}
|
||||
if (nth-- == 0) {
|
||||
return at;
|
||||
}
|
||||
}
|
||||
return std::shared_ptr<AudioTrack> ();
|
||||
}
|
||||
|
||||
static std::shared_ptr<AudioTrack>
|
||||
prepare_audio_track (aafiAudioTrack* aafTrack, Session* s)
|
||||
{
|
||||
/* Use existing track */
|
||||
std::shared_ptr<AudioTrack> track = get_nth_audio_track ((aafTrack->number - 1), s->get_routes ());
|
||||
|
||||
if (track) {
|
||||
return track;
|
||||
}
|
||||
|
||||
/* ..or create a new track */
|
||||
|
||||
uint32_t outputs = 2;
|
||||
if (s->master_out ()) {
|
||||
outputs = max (outputs, s->master_out ()->n_inputs ().n_audio ());
|
||||
}
|
||||
|
||||
list<std::shared_ptr<AudioTrack>> at (s->new_audio_track (aafTrack->format, outputs, NULL, 1, aafTrack->name, PresentationInfo::max_order));
|
||||
|
||||
if (at.empty ()) {
|
||||
PBD::fatal << "AAF: Could not create new audio track." << endmsg;
|
||||
abort (); /*NOTREACHED*/
|
||||
}
|
||||
|
||||
return at.back ();
|
||||
}
|
||||
|
||||
static bool
|
||||
import_sndfile_as_region (Session* s, struct aafiAudioEssencePointer* aafAudioEssencePtrList, SrcQuality quality, timepos_t& pos, SourceList** oneClipSources, ImportStatus& status, vector<std::shared_ptr<Region>>& regions)
|
||||
{
|
||||
SourceList* sources = NULL;
|
||||
|
||||
if (aafAudioEssencePtrList->user) {
|
||||
sources = (SourceList*)aafAudioEssencePtrList->user;
|
||||
} else {
|
||||
sources = new SourceList;
|
||||
|
||||
/* Import the source */
|
||||
status.clear ();
|
||||
|
||||
status.current = 1;
|
||||
status.total = 1;
|
||||
status.freeze = false;
|
||||
status.quality = quality;
|
||||
status.replace_existing_source = false;
|
||||
status.split_midi_channels = false;
|
||||
status.import_markers = false;
|
||||
status.done = false;
|
||||
status.cancel = false;
|
||||
|
||||
int channelCount = 0;
|
||||
|
||||
aafiAudioEssencePointer* aafAudioEssencePtr = NULL;
|
||||
AAFI_foreachEssencePointer (aafAudioEssencePtrList, aafAudioEssencePtr)
|
||||
{
|
||||
if (aafAudioEssencePtr->essenceFile->usable_file_path)
|
||||
status.paths.push_back (aafAudioEssencePtr->essenceFile->usable_file_path);
|
||||
else
|
||||
status.paths.push_back (aafAudioEssencePtr->essenceFile->original_file_path);
|
||||
|
||||
channelCount++;
|
||||
PBD::info << string_compose ("AAF: Preparing to import clip channel %1: %2\n", channelCount, aafAudioEssencePtr->essenceFile->unique_name);
|
||||
}
|
||||
|
||||
s->import_files (status);
|
||||
|
||||
status.progress = 1.0;
|
||||
sources->clear ();
|
||||
|
||||
/* FIXME: There is no way to tell if cancel button was pressed
|
||||
* or if the file failed to import, just that one of these occurred.
|
||||
* We want status.cancel to reflect the user's choice only
|
||||
*/
|
||||
if (status.cancel && status.current > 1) {
|
||||
/* Succeeded to import file, assume user hit cancel */
|
||||
return false;
|
||||
} else if (status.cancel && status.current == 1) {
|
||||
/* Failed to import file, assume user did not hit cancel */
|
||||
status.cancel = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
for (int i = 0; i < channelCount; i++) {
|
||||
PropertyList proplist;
|
||||
sources->push_back (status.sources.at (i));
|
||||
|
||||
proplist.add (ARDOUR::Properties::start, 0);
|
||||
proplist.add (ARDOUR::Properties::length, timecnt_t ((*sources)[0]->length (), pos));
|
||||
proplist.add (ARDOUR::Properties::name, aafAudioEssencePtrList->essenceFile->unique_name);
|
||||
proplist.add (ARDOUR::Properties::layer, 0);
|
||||
proplist.add (ARDOUR::Properties::whole_file, true);
|
||||
proplist.add (ARDOUR::Properties::external, true);
|
||||
|
||||
RegionFactory::create (*sources, proplist);
|
||||
}
|
||||
|
||||
/* build peakfiles */
|
||||
for (SourceList::iterator x = sources->begin (); x != sources->end (); ++x) {
|
||||
SourceFactory::setup_peakfile (*x, true);
|
||||
}
|
||||
|
||||
aafAudioEssencePtrList->user = sources;
|
||||
}
|
||||
|
||||
*oneClipSources = sources;
|
||||
|
||||
/* Put the source on a region */
|
||||
string region_name;
|
||||
|
||||
/* take all the sources we have and package them up as a region */
|
||||
region_name = region_name_from_path (status.paths.front (), (sources->size () > 1), false);
|
||||
|
||||
/* we checked in import_sndfiles() that there were not too many */
|
||||
while (RegionFactory::region_by_name (region_name)) {
|
||||
region_name = bump_name_once (region_name, '.');
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static std::shared_ptr<Region>
|
||||
create_region (vector<std::shared_ptr<Region>> source_regions, aafiAudioClip* aafAudioClip, SourceList& oneClipSources, aafPosition_t clipOffset, aafRational_t samplerate_r)
|
||||
{
|
||||
string unique_file_name = aafAudioClip->essencePointerList->essenceFile->unique_name; // XXX
|
||||
|
||||
aafPosition_t clipPos = aafi_convertUnit (aafAudioClip->pos, aafAudioClip->track->edit_rate, &samplerate_r);
|
||||
aafPosition_t clipLen = aafi_convertUnit (aafAudioClip->len, aafAudioClip->track->edit_rate, &samplerate_r);
|
||||
aafPosition_t essenceOffset = aafi_convertUnit (aafAudioClip->essence_offset, aafAudioClip->track->edit_rate, &samplerate_r);
|
||||
|
||||
PropertyList proplist;
|
||||
|
||||
proplist.add (ARDOUR::Properties::start, essenceOffset);
|
||||
proplist.add (ARDOUR::Properties::length, clipLen);
|
||||
proplist.add (ARDOUR::Properties::name, unique_file_name);
|
||||
proplist.add (ARDOUR::Properties::layer, 0);
|
||||
proplist.add (ARDOUR::Properties::whole_file, false);
|
||||
proplist.add (ARDOUR::Properties::external, true);
|
||||
|
||||
/* NOTE: region position is set when calling add_region() */
|
||||
|
||||
std::shared_ptr<Region> region = RegionFactory::create (oneClipSources, proplist);
|
||||
|
||||
for (SourceList::iterator source = oneClipSources.begin (); source != oneClipSources.end (); ++source) {
|
||||
/* position displayed in Ardour source list */
|
||||
(*source)->set_natural_position (timepos_t (clipPos + clipOffset));
|
||||
|
||||
for (vector<std::shared_ptr<Region>>::iterator region = source_regions.begin (); region != source_regions.end (); ++region) {
|
||||
if ((*region)->source (0) == *source) {
|
||||
/* Enable "Move to Original Position" */
|
||||
(*region)->set_position (timepos_t (clipPos + clipOffset - essenceOffset));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return region;
|
||||
}
|
||||
|
||||
static void
|
||||
set_region_gain (aafiAudioClip* aafAudioClip, std::shared_ptr<Region> region, Session* s)
|
||||
{
|
||||
if (aafAudioClip->gain && aafAudioClip->gain->flags & AAFI_AUDIO_GAIN_CONSTANT) {
|
||||
std::dynamic_pointer_cast<AudioRegion> (region)->set_scale_amplitude (aafRationalToFloat (aafAudioClip->gain->value[0]));
|
||||
}
|
||||
|
||||
if (aafAudioClip->automation) {
|
||||
aafiAudioGain* level = aafAudioClip->automation;
|
||||
std::shared_ptr<AudioRegion> ar = std::dynamic_pointer_cast<AudioRegion> (region);
|
||||
std::shared_ptr<AutomationList> al = ar->envelope ();
|
||||
|
||||
for (unsigned int i = 0; i < level->pts_cnt; ++i) {
|
||||
al->fast_simple_add (timepos_t (aafRationalToFloat (level->time[i]) * region->length ().samples ()), aafRationalToFloat (level->value[i]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static FadeShape
|
||||
aaf_fade_interpol_to_ardour_fade_shape (aafiInterpolation_e interpol)
|
||||
{
|
||||
switch (interpol & AAFI_INTERPOL_MASK) {
|
||||
case AAFI_INTERPOL_NONE:
|
||||
return FadeConstantPower;
|
||||
case AAFI_INTERPOL_LINEAR:
|
||||
return FadeLinear;
|
||||
case AAFI_INTERPOL_LOG:
|
||||
return FadeConstantPower;
|
||||
case AAFI_INTERPOL_CONSTANT:
|
||||
return FadeConstantPower;
|
||||
case AAFI_INTERPOL_POWER:
|
||||
return FadeConstantPower;
|
||||
case AAFI_INTERPOL_BSPLINE:
|
||||
return FadeConstantPower;
|
||||
default:
|
||||
return FadeConstantPower;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
set_region_fade (aafiAudioClip* aafAudioClip, std::shared_ptr<Region> region, aafRational_t* samplerate)
|
||||
{
|
||||
if (aafAudioClip == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
aafiTransition* fadein = aafi_getFadeIn (aafAudioClip);
|
||||
aafiTransition* fadeout = aafi_getFadeOut (aafAudioClip);
|
||||
aafiTransition* xfade = (aafAudioClip->timelineItem->prev) ? aafi_timelineItemToCrossFade (aafAudioClip->timelineItem->prev) : NULL;
|
||||
|
||||
if (xfade) {
|
||||
if (fadein == NULL) {
|
||||
fadein = xfade;
|
||||
} else {
|
||||
PBD::warning << "Clip has both fadein and crossfade : crossfade will be ignored." << endmsg;
|
||||
}
|
||||
}
|
||||
|
||||
FadeShape fade_shape;
|
||||
samplecnt_t fade_len;
|
||||
|
||||
if (fadein != NULL) {
|
||||
fade_shape = aaf_fade_interpol_to_ardour_fade_shape ((aafiInterpolation_e)(fadein->flags & AAFI_INTERPOL_MASK));
|
||||
fade_len = aafi_convertUnit (fadein->len, aafAudioClip->track->edit_rate, samplerate);
|
||||
|
||||
std::dynamic_pointer_cast<AudioRegion> (region)->set_fade_in (fade_shape, fade_len);
|
||||
}
|
||||
|
||||
if (fadeout != NULL) {
|
||||
fade_shape = aaf_fade_interpol_to_ardour_fade_shape ((aafiInterpolation_e)(fadeout->flags & AAFI_INTERPOL_MASK));
|
||||
fade_len = aafi_convertUnit (fadeout->len, aafAudioClip->track->edit_rate, samplerate);
|
||||
|
||||
std::dynamic_pointer_cast<AudioRegion> (region)->set_fade_out (fade_shape, fade_len);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
set_session_timecode (AAF_Iface* aafi, Session* s)
|
||||
{
|
||||
using namespace Timecode;
|
||||
|
||||
uint16_t aafFPS = aafi->Timecode->fps;
|
||||
TimecodeFormat ardourtc;
|
||||
|
||||
/*
|
||||
* Fractional timecodes are never explicitly set into tc->fps, so we deduce
|
||||
* them based on edit_rate value.
|
||||
*/
|
||||
|
||||
switch (aafFPS) {
|
||||
case 24:
|
||||
if (aafi->Timecode->edit_rate->numerator == 24000 &&
|
||||
aafi->Timecode->edit_rate->denominator == 1001) {
|
||||
ardourtc = timecode_23976;
|
||||
} else {
|
||||
ardourtc = timecode_24;
|
||||
}
|
||||
break;
|
||||
|
||||
case 25:
|
||||
if (aafi->Timecode->edit_rate->numerator == 25000 &&
|
||||
aafi->Timecode->edit_rate->denominator == 1001) {
|
||||
ardourtc = timecode_24976;
|
||||
} else {
|
||||
ardourtc = timecode_25;
|
||||
}
|
||||
break;
|
||||
|
||||
case 30:
|
||||
if (aafi->Timecode->edit_rate->numerator == 30000 &&
|
||||
aafi->Timecode->edit_rate->denominator == 1001) {
|
||||
if (aafi->Timecode->drop) {
|
||||
ardourtc = timecode_2997drop;
|
||||
} else {
|
||||
ardourtc = timecode_2997;
|
||||
}
|
||||
} else {
|
||||
if (aafi->Timecode->drop) {
|
||||
ardourtc = timecode_30drop;
|
||||
} else {
|
||||
ardourtc = timecode_30;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 60:
|
||||
if (aafi->Timecode->edit_rate->numerator == 60000 &&
|
||||
aafi->Timecode->edit_rate->denominator == 1001) {
|
||||
ardourtc = timecode_5994;
|
||||
} else {
|
||||
ardourtc = timecode_60;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
PBD::error << string_compose ("Unknown AAF timecode fps : %1 (%2/%3).", aafFPS, aafi->Timecode->edit_rate->numerator, aafi->Timecode->edit_rate->denominator) << endmsg;
|
||||
return;
|
||||
}
|
||||
|
||||
s->config.set_timecode_format (ardourtc);
|
||||
}
|
||||
|
||||
/* Create and open Sesssion from AAF
|
||||
* return > 0 if file is not a [valid] AAF
|
||||
* return < 0 if session creation failed.
|
||||
* return 0 on success. path and snapshot are set.
|
||||
*/
|
||||
int
|
||||
ARDOUR_UI::new_session_from_aaf (string const& aaf, string const& target_dir, string& path, string& snapshot)
|
||||
{
|
||||
if (PBD::downcase (aaf).find (advanced_authoring_format_suffix) == string::npos) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (_session) {
|
||||
if (unload_session (false)) {
|
||||
/* unload cancelled by user */
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Possible libaaf log to external file : part 1/2 */
|
||||
// string logfile = Glib::build_filename (g_get_tmp_dir (), "aaf-import-XXXXXX.log");
|
||||
// int logfd = g_mkstemp_full (&logfile[0], O_WRONLY, 0700);
|
||||
//
|
||||
// fprintf(stderr, "Logfile: %s\n",&logfile[0] );
|
||||
//
|
||||
// if (logfd < 0) {
|
||||
// error << _("AAF: Could not prepare log file") << endmsg;
|
||||
// fprintf(stderr, "AAF: Could not prepare log file\n" );
|
||||
// return -1;
|
||||
// }
|
||||
//
|
||||
// FILE *logfp = fdopen( logfd, "w" );
|
||||
//
|
||||
// if (!logfp) {
|
||||
// error << _("AAF: Could not prepare log file") << endmsg;
|
||||
// fprintf(stderr, "AAF: Could not prepare log file\n" );
|
||||
// return -1;
|
||||
// }
|
||||
|
||||
AAF_Iface* aafi = aafi_alloc (NULL);
|
||||
|
||||
if (!aafi) {
|
||||
error << "AAF: Could not init AAF library." << endmsg;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* protools options must be set (there is no sens not setting them with Ardour) */
|
||||
uint32_t aaf_protools_options = (AAFI_PROTOOLS_OPT_REPLACE_CLIP_FADES | AAFI_PROTOOLS_OPT_REMOVE_SAMPLE_ACCURATE_EDIT);
|
||||
|
||||
aafi_set_option_int (aafi, "trace", 1);
|
||||
aafi_set_option_int (aafi, "protools", aaf_protools_options);
|
||||
// aafi_set_option_str (aafi, "media_location", media_location_path.c_str ());
|
||||
|
||||
aafi_set_debug (aafi, VERB_DEBUG, 0, NULL, &aaf_debug_callback, this);
|
||||
|
||||
if (aafi_load_file (aafi, aaf.c_str ())) {
|
||||
error << "AAF: Could not load AAF file." << endmsg;
|
||||
aafi_release (&aafi);
|
||||
return -1;
|
||||
}
|
||||
|
||||
snapshot = legalize_for_universal_path (basename_nosuffix (aaf));
|
||||
path = Glib::build_filename (target_dir, snapshot);
|
||||
|
||||
if (Glib::file_test (path, Glib::FILE_TEST_EXISTS)) {
|
||||
error << string_compose (_ ("AAF: Destination '%1' already exists."), path) << endmsg;
|
||||
snapshot = ""; // XXX?
|
||||
path = "";
|
||||
aafi_release (&aafi);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Create media cache */
|
||||
GError* err = NULL;
|
||||
char* td = g_dir_make_tmp ("aaf-cache-XXXXXX", &err);
|
||||
|
||||
if (!td) {
|
||||
error << string_compose (_ ("AAF: Could not prepare media cache: %1"), err->message) << endmsg;
|
||||
aafi_release (&aafi);
|
||||
return -1;
|
||||
}
|
||||
|
||||
const string media_cache_path = PBD::canonical_path (td);
|
||||
g_free (td);
|
||||
g_clear_error (&err);
|
||||
|
||||
/* all systems go. create sessions */
|
||||
BusProfile bus_profile;
|
||||
bus_profile.master_out_channels = 2;
|
||||
|
||||
aafRational_t samplerate_r;
|
||||
|
||||
samplerate_r.numerator = aafi->Audio->samplerate;
|
||||
samplerate_r.denominator = 1;
|
||||
|
||||
std::string restore_backend;
|
||||
if (!AudioEngine::instance ()->running ()) {
|
||||
AudioEngine* e = AudioEngine::instance ();
|
||||
restore_backend = e->current_backend_name ();
|
||||
e->set_backend ("None (Dummy)", "", "");
|
||||
e->start ();
|
||||
PluginManager::instance ().refresh (true);
|
||||
attach_to_engine ();
|
||||
}
|
||||
if (!AudioEngine::instance ()->running ()) {
|
||||
PBD::error << _ ("AAF: Could not start [dummy] engine for AAF import .") << endmsg;
|
||||
return -1;
|
||||
}
|
||||
|
||||
build_session_stage_two (path, snapshot, "", bus_profile, false, Temporal::AudioTime, aafi->Audio->samplerate);
|
||||
|
||||
if (!_session) {
|
||||
aafi_release (&aafi);
|
||||
PBD::remove_directory (media_cache_path);
|
||||
if (!restore_backend.empty ()) {
|
||||
AudioEngine::instance ()->stop ();
|
||||
AudioEngine::instance ()->set_backend (restore_backend, "", "");
|
||||
}
|
||||
error << _ ("AAF: Could not create new session for AAF import .") << endmsg;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Possible libaaf log to external file : part 2/2
|
||||
* Moving log file from temp/ to session/
|
||||
*/
|
||||
|
||||
// string newlogfile = Glib::build_filename (path, "aaf-import.log");
|
||||
//
|
||||
// if (!PBD::copy_file (logfile, newlogfile)) {
|
||||
// // if (g_rename (logfile.c_str(), newlogfile.c_str()) != 0) {
|
||||
// error << string_compose (_("Could not copy logfile from \"%1\" to \"%2\": %3"),
|
||||
// logfile, newlogfile, strerror (errno)) << endmsg;
|
||||
// fprintf(stderr, "Could not copy logfile from \"%s\" to \"%s\": %s\n", logfile.c_str(), newlogfile.c_str(), strerror (errno) );
|
||||
// } else {
|
||||
// fprintf(stderr, "Copied logfile from \"%s\" to \"%s\"\n", logfile.c_str(), newlogfile.c_str() );
|
||||
// g_unlink(logfile.c_str ());
|
||||
// logfile = newlogfile;
|
||||
// fprintf(stderr, "New logfile : \"%s\"\n", logfile.c_str() );
|
||||
// }
|
||||
|
||||
switch (aafi->Audio->samplesize) {
|
||||
case 16:
|
||||
_session->config.set_native_file_data_format (ARDOUR::FormatInt16);
|
||||
break;
|
||||
case 24:
|
||||
_session->config.set_native_file_data_format (ARDOUR::FormatInt24);
|
||||
break;
|
||||
case 32:
|
||||
_session->config.set_native_file_data_format (ARDOUR::FormatFloat);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
/* Import Sources */
|
||||
|
||||
SourceList* oneClipSources;
|
||||
ARDOUR::ImportStatus import_status;
|
||||
vector<std::shared_ptr<Region>> source_regions;
|
||||
timepos_t pos = timepos_t::max (Temporal::AudioTime);
|
||||
|
||||
aafiAudioTrack* aafAudioTrack = NULL;
|
||||
aafiTimelineItem* aafAudioItem = NULL;
|
||||
aafiAudioClip* aafAudioClip = NULL;
|
||||
aafiAudioEssencePointer* aafAudioEssencePtr = NULL;
|
||||
|
||||
aafPosition_t sessionStart = aafi_convertUnit (aafi->compositionStart, aafi->compositionStart_editRate, &samplerate_r);
|
||||
|
||||
AAFI_foreachAudioTrack (aafi, aafAudioTrack)
|
||||
{
|
||||
std::shared_ptr<AudioTrack> track = prepare_audio_track (aafAudioTrack, _session);
|
||||
|
||||
AAFI_foreachTrackItem (aafAudioTrack, aafAudioItem)
|
||||
{
|
||||
aafAudioClip = aafi_timelineItemToAudioClip (aafAudioItem);
|
||||
|
||||
if (!aafAudioClip) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (aafAudioClip->essencePointerList == NULL) {
|
||||
error << _ ("AAF: Clip has no essence.") << endmsg;
|
||||
continue;
|
||||
}
|
||||
|
||||
int essenceError = 0;
|
||||
char* essenceName = aafAudioClip->essencePointerList->essenceFile->name;
|
||||
|
||||
AAFI_foreachEssencePointer (aafAudioClip->essencePointerList, aafAudioEssencePtr)
|
||||
{
|
||||
struct aafiAudioEssenceFile* audioEssenceFile = aafAudioEssencePtr->essenceFile;
|
||||
|
||||
if (!audioEssenceFile) {
|
||||
PBD::error << string_compose (_ ("AAF: Could not create new region for clip '%1': Missing audio essence"), audioEssenceFile->unique_name) << endmsg;
|
||||
essenceError++;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (audioEssenceFile->is_embedded) {
|
||||
if (aafi_extractAudioEssenceFile (aafi, audioEssenceFile, AAFI_EXTRACT_DEFAULT, media_cache_path.c_str (), 0, 0, NULL, NULL) < 0) {
|
||||
PBD::error << string_compose ("AAF: Could not extract audio file '%1' from AAF.", audioEssenceFile->unique_name) << endmsg;
|
||||
essenceError++;
|
||||
continue;
|
||||
}
|
||||
} else if (!audioEssenceFile->is_embedded && !audioEssenceFile->usable_file_path) {
|
||||
PBD::error << string_compose ("AAF: Could not locate external audio file: '%1'", audioEssenceFile->original_file_path) << endmsg;
|
||||
essenceError++;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (essenceError) {
|
||||
PBD::error << string_compose ("AAF: Error parsing audio essence pointerlist : %1\n", essenceName);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!import_sndfile_as_region (_session, aafAudioClip->essencePointerList, SrcBest, pos, &oneClipSources, import_status, source_regions)) {
|
||||
PBD::error << string_compose ("AAF: Could not import '%1' to session.", essenceName) << endmsg;
|
||||
continue;
|
||||
} else {
|
||||
AAFI_foreachEssencePointer (aafAudioClip->essencePointerList, aafAudioEssencePtr)
|
||||
{
|
||||
if (aafAudioEssencePtr->essenceFile->is_embedded) {
|
||||
g_unlink (aafAudioEssencePtr->essenceFile->usable_file_path);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!oneClipSources || oneClipSources->size () == 0) {
|
||||
error << string_compose (_ ("AAF: Could not create new region for clip '%1': Region has no source"), essenceName) << endmsg;
|
||||
continue;
|
||||
}
|
||||
|
||||
std::shared_ptr<Region> region = create_region (source_regions, aafAudioClip, *oneClipSources, sessionStart, samplerate_r);
|
||||
|
||||
if (!region) {
|
||||
error << string_compose (_ ("AAF: Could not create new region for clip '%1'"), essenceName) << endmsg;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* converts whatever edit_rate clip is in, to samples */
|
||||
aafPosition_t clipPos = aafi_convertUnit (aafAudioClip->pos, aafAudioClip->track->edit_rate, &samplerate_r);
|
||||
|
||||
track->playlist ()->add_region (region, timepos_t (clipPos + sessionStart));
|
||||
set_region_gain (aafAudioClip, region, _session);
|
||||
set_region_fade (aafAudioClip, region, &samplerate_r);
|
||||
if (aafAudioClip->mute) {
|
||||
region->set_muted (true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// oneClipSources.clear ();
|
||||
|
||||
aafiMarker* marker = NULL;
|
||||
|
||||
AAFI_foreachMarker (aafi, marker)
|
||||
{
|
||||
aafPosition_t markerStart = sessionStart + aafi_convertUnit (marker->start, marker->edit_rate, &samplerate_r);
|
||||
aafPosition_t markerEnd = sessionStart + aafi_convertUnit ((marker->start + marker->length), marker->edit_rate, &samplerate_r);
|
||||
|
||||
Location* location;
|
||||
|
||||
if (marker->length == 0) {
|
||||
location = new Location (*_session, timepos_t (markerStart), timepos_t (markerStart), marker->name, Location::Flags (Location::IsMark));
|
||||
} else {
|
||||
location = new Location (*_session, timepos_t (markerStart), timepos_t (markerEnd), marker->name, Location::Flags (Location::IsRangeMarker));
|
||||
}
|
||||
|
||||
_session->locations ()->add (location, true);
|
||||
}
|
||||
|
||||
/* set session range */
|
||||
aafRational_t nominal_sample_rate;
|
||||
nominal_sample_rate.numerator = _session->nominal_sample_rate ();
|
||||
nominal_sample_rate.denominator = 1;
|
||||
|
||||
samplepos_t start = samplepos_t (aafi_convertUnit (aafi->compositionStart, aafi->compositionStart_editRate, &nominal_sample_rate));
|
||||
samplepos_t end = samplepos_t (aafi_convertUnit (aafi->compositionLength, aafi->compositionLength_editRate, &nominal_sample_rate)) + start;
|
||||
_session->maybe_update_session_range (timepos_t (start), timepos_t (end));
|
||||
|
||||
/* set timecode */
|
||||
set_session_timecode (aafi, _session);
|
||||
|
||||
the_editor ().access_action ("Editor", "zoom-to-session");
|
||||
|
||||
/* Cleanup */
|
||||
import_status.progress = 1.0;
|
||||
import_status.done = true;
|
||||
import_status.sources.clear ();
|
||||
import_status.all_done = true;
|
||||
|
||||
_session->save_state ("");
|
||||
|
||||
source_regions.clear ();
|
||||
|
||||
PBD::remove_directory (media_cache_path);
|
||||
|
||||
aafi_release (&aafi);
|
||||
|
||||
if (!restore_backend.empty ()) {
|
||||
AudioEngine::instance ()->stop ();
|
||||
AudioEngine::instance ()->set_backend (restore_backend, "", "");
|
||||
}
|
||||
return 0;
|
||||
}
|
|
@ -58,7 +58,7 @@ ARDOUR_UI::launch_chat ()
|
|||
|
||||
switch (dialog.run()) {
|
||||
case RESPONSE_OK:
|
||||
open_uri("https://ardour.org/chat");
|
||||
open_uri("http://ardour.org/chat");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -80,25 +80,35 @@ ARDOUR_UI::launch_reference ()
|
|||
void
|
||||
ARDOUR_UI::launch_tracker ()
|
||||
{
|
||||
PBD::open_uri ("https://tracker.ardour.org");
|
||||
PBD::open_uri ("http://tracker.ardour.org");
|
||||
}
|
||||
|
||||
void
|
||||
ARDOUR_UI::launch_subscribe ()
|
||||
{
|
||||
PBD::open_uri ("https://community.ardour.org/subscribe");
|
||||
PBD::open_uri ("https://community.ardour.org/s/subscribe");
|
||||
}
|
||||
|
||||
void
|
||||
ARDOUR_UI::launch_cheat_sheet ()
|
||||
{
|
||||
#ifdef __APPLE__
|
||||
PBD::open_uri ("http://manual.ardour.org/files/a3_mnemonic_cheat_sheet_osx.pdf");
|
||||
#else
|
||||
PBD::open_uri ("http://manual.ardour.org/files/a3_mnemonic_cheatsheet.pdf");
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
ARDOUR_UI::launch_website ()
|
||||
{
|
||||
PBD::open_uri ("https://ardour.org");
|
||||
PBD::open_uri ("http://ardour.org");
|
||||
}
|
||||
|
||||
void
|
||||
ARDOUR_UI::launch_website_dev ()
|
||||
{
|
||||
PBD::open_uri ("https://ardour.org/development.html");
|
||||
PBD::open_uri ("http://ardour.org/development.html");
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -110,6 +120,6 @@ ARDOUR_UI::launch_forums ()
|
|||
void
|
||||
ARDOUR_UI::launch_howto_report ()
|
||||
{
|
||||
PBD::open_uri ("https://ardour.org/reporting_bugs");
|
||||
PBD::open_uri ("http://ardour.org/reporting_bugs");
|
||||
}
|
||||
|
||||
|
|
|
@ -86,7 +86,11 @@ ARDOUR_UI::we_have_dependents ()
|
|||
*/
|
||||
mixer->monitor_section().use_others_actions ();
|
||||
|
||||
/* Create "static" actions that apply to all ProcessorBoxes
|
||||
*/
|
||||
ProcessorBox::register_actions ();
|
||||
StepEntry::setup_actions_and_bindings ();
|
||||
TriggerUI::setup_actions_and_bindings ();
|
||||
ClipEditorBox::init ();
|
||||
|
||||
/* Global, editor, mixer, processor box actions are defined now. Link
|
||||
|
@ -211,7 +215,6 @@ ARDOUR_UI::idle_ask_about_quit ()
|
|||
Gtk::BUTTONS_YES_NO,
|
||||
true); /* modal */
|
||||
msg.set_default_response (Gtk::RESPONSE_YES);
|
||||
msg.set_position (WIN_POS_MOUSE);
|
||||
|
||||
if (msg.run () == Gtk::RESPONSE_YES) {
|
||||
finish ();
|
||||
|
@ -273,10 +276,11 @@ ARDOUR_UI::setup_windows ()
|
|||
}
|
||||
|
||||
if (create_trigger_page ()) {
|
||||
error << _("UI: cannot setup trigger") << endmsg;
|
||||
error << _("UI: cannot setup recorder") << endmsg;
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
if (create_meterbridge ()) {
|
||||
error << _("UI: cannot setup meterbridge") << endmsg;
|
||||
return -1;
|
||||
|
@ -420,7 +424,7 @@ ARDOUR_UI::apply_window_settings (bool with_size)
|
|||
_tabs.set_current_page (_tabs.page_num (rc_option_editor->contents()));
|
||||
} else if (recorder && current_tab == "recorder") {
|
||||
_tabs.set_current_page (_tabs.page_num (recorder->contents()));
|
||||
} else if (trigger_page && current_tab == "trigger") {
|
||||
} else if (recorder && current_tab == "trigger") {
|
||||
_tabs.set_current_page (_tabs.page_num (trigger_page->contents()));
|
||||
} else if (editor) {
|
||||
_tabs.set_current_page (_tabs.page_num (editor->contents()));
|
||||
|
@ -442,7 +446,7 @@ ARDOUR_UI::bind_lua_action_script (GdkEventButton*ev, int i)
|
|||
if (Gtkmm2ext::Keyboard::modifier_state_equals (ev->state, Gtkmm2ext::Keyboard::TertiaryModifier)) {
|
||||
li->remove_lua_action (i);
|
||||
} else {
|
||||
li->interactive_add (*editor->current_toplevel (), LuaScriptInfo::EditorAction, i);
|
||||
li->interactive_add (LuaScriptInfo::EditorAction, i);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -44,7 +44,6 @@
|
|||
#include "ardour/session.h"
|
||||
|
||||
#include "control_protocol/control_protocol.h"
|
||||
#include "control_protocol/basic_ui.h"
|
||||
|
||||
#include "gtkmm2ext/keyboard.h"
|
||||
#include "gtkmm2ext/utils.h"
|
||||
|
@ -104,12 +103,6 @@ ARDOUR_UI::set_session (Session *s)
|
|||
{
|
||||
SessionHandlePtr::set_session (s);
|
||||
|
||||
if (_basic_ui) {
|
||||
delete _basic_ui;
|
||||
}
|
||||
|
||||
_basic_ui = new BasicUI (*s);
|
||||
|
||||
/* adjust sensitivity of menu bar options to reflect presence/absence
|
||||
* of session
|
||||
*/
|
||||
|
@ -126,7 +119,6 @@ ARDOUR_UI::set_session (Session *s)
|
|||
transport_ctrl.set_session (s);
|
||||
|
||||
update_path_label ();
|
||||
update_sample_rate ();
|
||||
|
||||
if (!_session) {
|
||||
WM::Manager::instance().set_session (s);
|
||||
|
@ -334,13 +326,8 @@ ARDOUR_UI::unload_session (bool hide_stuff, bool force_unload)
|
|||
break;
|
||||
case 0:
|
||||
// discard/don't save
|
||||
if (_session->unnamed()) {
|
||||
ask_about_scratch_deletion ();
|
||||
}
|
||||
break;
|
||||
}
|
||||
} else if (!force_unload && _session && _session->unnamed()) {
|
||||
ask_about_scratch_deletion ();
|
||||
}
|
||||
|
||||
|
||||
|
@ -1052,7 +1039,6 @@ ARDOUR_UI::handle_locations_change (Location *)
|
|||
bool
|
||||
ARDOUR_UI::tabbed_window_state_event_handler (GdkEventWindowState* ev, void* object)
|
||||
{
|
||||
#ifndef __APPLE__
|
||||
if (object == editor) {
|
||||
|
||||
if ((ev->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) &&
|
||||
|
@ -1083,7 +1069,6 @@ ARDOUR_UI::tabbed_window_state_event_handler (GdkEventWindowState* ev, void* obj
|
|||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -64,7 +64,6 @@
|
|||
#include "editing.h"
|
||||
#include "enums_convert.h"
|
||||
#include "actions.h"
|
||||
#include "meter_patterns.h"
|
||||
#include "meterbridge.h"
|
||||
#include "luawindow.h"
|
||||
#include "mixer_ui.h"
|
||||
|
@ -290,6 +289,7 @@ ARDOUR_UI::install_actions ()
|
|||
ActionManager::register_action (common_actions, X_("tutorial"), S_("Help|Tutorial"), mem_fun(*this, &ARDOUR_UI::launch_tutorial));
|
||||
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"), _("Website"), mem_fun(*this, &ARDOUR_UI::launch_website));
|
||||
ActionManager::register_action (common_actions, X_("website-dev"), _("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));
|
||||
|
@ -441,26 +441,26 @@ ARDOUR_UI::install_actions ()
|
|||
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 = ActionManager::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 = ActionManager::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 = ActionManager::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-seconds"), _("Seconds"), sigc::bind (sigc::mem_fun(primary_clock, &AudioClock::set_mode), AudioClock::Seconds));
|
||||
act = ActionManager::register_action (transport_actions, X_("primary-clock-seconds"), _("Seconds"), sigc::bind (sigc::mem_fun(primary_clock, &AudioClock::set_mode), AudioClock::Seconds, 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::Samples));
|
||||
act = ActionManager::register_action (transport_actions, X_("primary-clock-samples"), _("Samples"), sigc::bind (sigc::mem_fun(primary_clock, &AudioClock::set_mode), AudioClock::Samples, 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 = ActionManager::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 = ActionManager::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 = ActionManager::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-seconds"), _("Seconds"), sigc::bind (sigc::mem_fun(secondary_clock, &AudioClock::set_mode), AudioClock::Seconds));
|
||||
act = ActionManager::register_action (transport_actions, X_("secondary-clock-seconds"), _("Seconds"), sigc::bind (sigc::mem_fun(secondary_clock, &AudioClock::set_mode), AudioClock::Seconds, 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::Samples));
|
||||
act = ActionManager::register_action (transport_actions, X_("secondary-clock-samples"), _("Samples"), sigc::bind (sigc::mem_fun(secondary_clock, &AudioClock::set_mode), AudioClock::Samples, false));
|
||||
ActionManager::session_sensitive_actions.push_back (act);
|
||||
|
||||
act = ActionManager::register_toggle_action (transport_actions, X_("SessionMonitorIn"), _("All Input"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_session_monitoring_in));
|
||||
|
@ -471,11 +471,11 @@ ARDOUR_UI::install_actions ()
|
|||
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->set_short_label (S_("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->set_short_label (S_("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));
|
||||
|
@ -501,12 +501,6 @@ ARDOUR_UI::install_actions ()
|
|||
act = ActionManager::register_toggle_action (main_actions, X_("ToggleLatencyCompensation"), _("Disable Latency Compensation"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_latency_switch));
|
||||
ActionManager::session_sensitive_actions.push_back (act);
|
||||
|
||||
act = ActionManager::register_toggle_action (main_actions, X_("ResetAllPeakDisplays"), _("Reset Mixer Meter Peaks"), []() { ArdourMeter::ResetAllPeakDisplays (); });
|
||||
ActionManager::session_sensitive_actions.push_back (act);
|
||||
|
||||
act = ActionManager::register_toggle_action (main_actions, X_("ResetMeterPeakHold"), _("Reset All Meter Peak Hold"), []() { ArdourMeter::ResetAllPeakDisplays (); ActionManager::get_action ("Recorder", "reset-input-peak-hold")->activate (); });
|
||||
ActionManager::session_sensitive_actions.push_back (act);
|
||||
|
||||
act = ActionManager::register_action (main_actions, X_("MonitorMenu"), _("Monitor Section")); /* just the submenu item */
|
||||
ActionManager::session_sensitive_actions.push_back (act);
|
||||
|
||||
|
@ -605,9 +599,6 @@ ARDOUR_UI::install_dependent_actions ()
|
|||
act = ActionManager::register_action (main_actions, X_("QuickExport"), _("Quick Audio Export..."), sigc::mem_fun (*editor, &PublicEditor::quick_export));
|
||||
ActionManager::session_sensitive_actions.push_back (act);
|
||||
|
||||
act = ActionManager::register_action (main_actions, X_("SurroundExport"), _("Export Surround Master..."), sigc::mem_fun (*editor, &PublicEditor::surround_export));
|
||||
act->set_sensitive (false);
|
||||
|
||||
act = ActionManager::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);
|
||||
|
||||
|
@ -649,9 +640,6 @@ ARDOUR_UI::install_dependent_actions ()
|
|||
act = ActionManager::register_action (common_actions, "alternate-remove-location-from-playhead", _("Remove Mark at Playhead"), sigc::mem_fun(editor, &PublicEditor::remove_location_at_playhead_cursor));
|
||||
ActionManager::session_sensitive_actions.push_back (act);
|
||||
|
||||
act = ActionManager::register_action (common_actions, "add-bbt-from-playhead", _("Add BBT Marker from Playhead"), sigc::mem_fun(editor, &PublicEditor::add_bbt_marker_at_playhead_cursor));
|
||||
ActionManager::session_sensitive_actions.push_back (act);
|
||||
|
||||
act = ActionManager::register_action (common_actions, "nudge-next-forward", _("Nudge Next Later"), sigc::bind (sigc::mem_fun(editor, &PublicEditor::nudge_forward), true, false));
|
||||
ActionManager::session_sensitive_actions.push_back (act);
|
||||
act = ActionManager::register_action (common_actions, "nudge-next-backward", _("Nudge Next Earlier"), sigc::bind (sigc::mem_fun(editor, &PublicEditor::nudge_backward), true, false));
|
||||
|
@ -790,7 +778,7 @@ ARDOUR_UI::build_menu_bar ()
|
|||
|
||||
wall_clock_label.set_name ("WallClock");
|
||||
wall_clock_label.set_use_markup ();
|
||||
timecode_format_label.set_name ("Timecode");
|
||||
timecode_format_label.set_name ("WallClock");
|
||||
timecode_format_label.set_use_markup ();
|
||||
peak_thread_work_label.set_name ("PeakThreadWork");
|
||||
peak_thread_work_label.set_use_markup ();
|
||||
|
@ -1119,7 +1107,7 @@ ARDOUR_UI::tabbable_visibility_button_press (GdkEventButton* ev, string const& t
|
|||
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 (ev->button, ev->time);
|
||||
menu->popup (3, ev->time);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -114,7 +114,7 @@ void
|
|||
ARDOUR_UI::create_xrun_marker (samplepos_t where)
|
||||
{
|
||||
if (_session) {
|
||||
Location *location = new Location (*_session, timepos_t (where), timepos_t (where), _("xrun"), Location::Flags(Location::IsMark | Location::IsXrun));
|
||||
Location *location = new Location (*_session, timepos_t (where), timepos_t (where), _("xrun"), Location::IsMark);
|
||||
_session->locations()->add (location);
|
||||
}
|
||||
}
|
||||
|
@ -122,6 +122,7 @@ ARDOUR_UI::create_xrun_marker (samplepos_t where)
|
|||
void
|
||||
ARDOUR_UI::halt_on_xrun_message ()
|
||||
{
|
||||
cerr << "HALT on xrun\n";
|
||||
ArdourMessageDialog msg (_main_window, _("Recording was stopped because your system could not keep up."));
|
||||
msg.run ();
|
||||
}
|
||||
|
|
|
@ -125,7 +125,6 @@ ARDOUR_UI::key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey
|
|||
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));
|
||||
bool cutcopypaste = false;
|
||||
|
||||
if (focus) {
|
||||
|
||||
|
@ -153,20 +152,7 @@ ARDOUR_UI::key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey
|
|||
(focus ? gtk_widget_get_name (focus) : "no focus widget"),
|
||||
((ev->state & mask) ? "yes" : "no"),
|
||||
window.get_title(),
|
||||
gdk_keyval_name (ev->keyval)));
|
||||
|
||||
if (Keyboard::some_magic_widget_has_focus() && (ev->state == Keyboard::PrimaryModifier)) {
|
||||
switch (ev->keyval) {
|
||||
case GDK_x:
|
||||
case GDK_c:
|
||||
case GDK_v:
|
||||
cutcopypaste = true;
|
||||
DEBUG_TRACE (DEBUG::Accelerators, string_compose ("seen cut/copy/paste keys with magic widget focus, Primary-%1\n", gdk_keyval_name (ev->keyval)));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
gdk_keyval_name (ev->keyval)))
|
||||
|
||||
/* This exists to allow us to override the way GTK handles
|
||||
key events. The normal sequence is:
|
||||
|
@ -200,7 +186,7 @@ ARDOUR_UI::key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey
|
|||
*/
|
||||
|
||||
|
||||
if (!cutcopypaste && (!special_handling_of_unmodified_accelerators || (ev->state & mask))) {
|
||||
if (!special_handling_of_unmodified_accelerators || (ev->state & mask)) {
|
||||
|
||||
/* no special handling or there are modifiers in effect: accelerate first */
|
||||
|
||||
|
@ -257,7 +243,7 @@ ARDOUR_UI::key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey
|
|||
|
||||
} else {
|
||||
|
||||
/* no modifiers or cut/copy/paste key event, propagate first */
|
||||
/* no modifiers, propagate first */
|
||||
|
||||
DEBUG_TRACE (DEBUG::Accelerators, "\tpropagate, then activate\n");
|
||||
|
||||
|
@ -289,9 +275,7 @@ ARDOUR_UI::key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey
|
|||
* top level tab or a top level window)
|
||||
*/
|
||||
|
||||
if (top_level_bindings) {
|
||||
DEBUG_TRACE (DEBUG::Accelerators, string_compose ("\tusing top level bindings %1 @ %2 for this event\n", top_level_bindings->name(), top_level_bindings));
|
||||
}
|
||||
DEBUG_TRACE (DEBUG::Accelerators, string_compose ("\tusing top level bindings %1 @ %2 for this event\n", top_level_bindings->name(), top_level_bindings));
|
||||
|
||||
if (top_level_bindings && top_level_bindings->activate (k, Bindings::Press)) {
|
||||
DEBUG_TRACE (DEBUG::Accelerators, "\t\thandled\n");
|
||||
|
|
|
@ -50,10 +50,6 @@
|
|||
|
||||
#include "pbd/i18n.h"
|
||||
|
||||
#ifdef __APPLE__
|
||||
extern void use_cocoa_invalidation (int); // cocoacarbon.mm
|
||||
#endif
|
||||
|
||||
using namespace Gtk;
|
||||
using namespace Gtkmm2ext;
|
||||
using namespace ARDOUR;
|
||||
|
@ -69,11 +65,6 @@ ARDOUR_UI::toggle_external_sync()
|
|||
msg.run ();
|
||||
return;
|
||||
}
|
||||
if (_session->default_play_speed() != 1.0f && (TransportMasterManager::instance().current()->type() == Engine)) {
|
||||
ArdourMessageDialog msg (_("It is not possible to use JACK as the sync source\n when the vari-speed is enabled."));
|
||||
msg.run ();
|
||||
return;
|
||||
}
|
||||
|
||||
ActionManager::toggle_config_state_foo ("Transport", "ToggleExternalSync", sigc::mem_fun (_session->config, &SessionConfiguration::set_external_sync), sigc::mem_fun (_session->config, &SessionConfiguration::get_external_sync));
|
||||
|
||||
|
@ -246,8 +237,7 @@ ARDOUR_UI::toggle_punch_out ()
|
|||
void
|
||||
ARDOUR_UI::show_loop_punch_ruler_and_disallow_hide ()
|
||||
{
|
||||
/* XXX FIX ME */
|
||||
Glib::RefPtr<ToggleAction> tact; // = ActionManager::get_toggle_action (X_("Rulers"), "toggle-loop-punch-ruler");
|
||||
Glib::RefPtr<ToggleAction> tact = ActionManager::get_toggle_action (X_("Rulers"), "toggle-loop-punch-ruler");
|
||||
|
||||
tact->set_sensitive (false);
|
||||
|
||||
|
@ -260,10 +250,9 @@ ARDOUR_UI::show_loop_punch_ruler_and_disallow_hide ()
|
|||
void
|
||||
ARDOUR_UI::reenable_hide_loop_punch_ruler_if_appropriate ()
|
||||
{
|
||||
/* XXX FIX ME */
|
||||
if (!_session->config.get_punch_in() && !_session->config.get_punch_out()) {
|
||||
/* if punch in/out are now both off, reallow hiding of the loop/punch ruler */
|
||||
Glib::RefPtr<Action> act; // = ActionManager::get_action (X_("Rulers"), "toggle-loop-punch-ruler");
|
||||
Glib::RefPtr<Action> act = ActionManager::get_action (X_("Rulers"), "toggle-loop-punch-ruler");
|
||||
if (act) {
|
||||
act->set_sensitive (true);
|
||||
}
|
||||
|
@ -390,9 +379,21 @@ ARDOUR_UI::parameter_changed (std::string p)
|
|||
} else if (p == "show-track-meters") {
|
||||
if (editor) editor->toggle_meter_updating();
|
||||
} else if (p == "primary-clock-delta-mode") {
|
||||
primary_clock->set_display_delta_mode(UIConfiguration::instance().get_primary_clock_delta_mode());
|
||||
if (UIConfiguration::instance().get_primary_clock_delta_mode() != NoDelta) {
|
||||
primary_clock->set_editable (false);
|
||||
primary_clock->set_widget_name ("transport delta");
|
||||
} else {
|
||||
primary_clock->set_editable (true);
|
||||
primary_clock->set_widget_name ("transport");
|
||||
}
|
||||
} else if (p == "secondary-clock-delta-mode") {
|
||||
secondary_clock->set_display_delta_mode(UIConfiguration::instance().get_secondary_clock_delta_mode());
|
||||
if (UIConfiguration::instance().get_secondary_clock_delta_mode() != NoDelta) {
|
||||
secondary_clock->set_editable (false);
|
||||
secondary_clock->set_widget_name ("secondary delta");
|
||||
} else {
|
||||
secondary_clock->set_editable (true);
|
||||
secondary_clock->set_widget_name ("secondary");
|
||||
}
|
||||
} else if (p == "super-rapid-clock-update") {
|
||||
if (_session) {
|
||||
stop_clocking ();
|
||||
|
@ -504,13 +505,6 @@ ARDOUR_UI::parameter_changed (std::string p)
|
|||
if (UIConfiguration::instance().get_clock_display_limit() > limit) {
|
||||
UIConfiguration::instance().set_clock_display_limit (limit);
|
||||
}
|
||||
} else if (p == "no-strobe") {
|
||||
stop_clocking ();
|
||||
start_clocking ();
|
||||
} else if (p == "use-cocoa-invalidation") {
|
||||
#ifdef __APPLE__
|
||||
use_cocoa_invalidation (UIConfiguration::instance().get_use_cocoa_invalidation());
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -112,20 +112,20 @@ ARDOUR_UI::ask_about_loading_existing_session (const std::string& session_path)
|
|||
}
|
||||
|
||||
void
|
||||
ARDOUR_UI::build_session_from_dialog (SessionDialog& sd, const std::string& session_path, const std::string& session_name, std::string const& session_template, Temporal::TimeDomain domain)
|
||||
ARDOUR_UI::build_session_from_dialog (SessionDialog& sd, const std::string& session_path, const std::string& session_name, std::string const& session_template)
|
||||
{
|
||||
BusProfile bus_profile;
|
||||
|
||||
if (nsm) {
|
||||
bus_profile.master_out_channels = 2;
|
||||
} else if (Profile->get_mixbus ()) {
|
||||
} else if ( Profile->get_mixbus()) {
|
||||
bus_profile.master_out_channels = 2;
|
||||
} else {
|
||||
/* get settings from advanced section of NSD */
|
||||
bus_profile.master_out_channels = (uint32_t) sd.master_channel_count();
|
||||
}
|
||||
|
||||
build_session (session_path, session_name, session_template, bus_profile, false, !sd.was_new_name_edited(), domain);
|
||||
build_session (session_path, session_name, session_template, bus_profile, false, !sd.was_new_name_edited());
|
||||
}
|
||||
|
||||
/** This is only ever used once Ardour is already running with a session
|
||||
|
@ -161,7 +161,6 @@ ARDOUR_UI::session_dialog_response_handler (int response, SessionDialog* session
|
|||
string session_name;
|
||||
string session_path;
|
||||
string template_name;
|
||||
Temporal::TimeDomain session_domain;
|
||||
bool likely_new = false;
|
||||
|
||||
session_path = "";
|
||||
|
@ -176,7 +175,6 @@ ARDOUR_UI::session_dialog_response_handler (int response, SessionDialog* session
|
|||
|
||||
session_name = session_dialog->session_name (likely_new);
|
||||
session_path = session_dialog->session_folder ();
|
||||
session_domain = session_dialog->session_domain ();
|
||||
|
||||
if (nsm) {
|
||||
likely_new = true;
|
||||
|
@ -195,20 +193,6 @@ ARDOUR_UI::session_dialog_response_handler (int response, SessionDialog* session
|
|||
return; /* back to main event loop */
|
||||
} else if (rv == 0) {
|
||||
session_dialog->set_provided_session (session_name, session_path);
|
||||
} else {
|
||||
|
||||
rv = new_session_from_aaf (session_name, Config->get_default_session_parent_dir(), session_path, session_name);
|
||||
if (rv < 0) {
|
||||
ArdourMessageDialog msg (*session_dialog, _("Extracting AAF failed"));
|
||||
msg.run ();
|
||||
return; /* back to main event loop */
|
||||
} else if (rv == 0) {
|
||||
session_dialog->set_provided_session (session_name, session_path);
|
||||
/* we got a session now */
|
||||
session_dialog->hide ();
|
||||
delete_when_idle (session_dialog);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -305,7 +289,7 @@ ARDOUR_UI::session_dialog_response_handler (int response, SessionDialog* session
|
|||
|
||||
if (!template_name.empty() || likely_new) {
|
||||
|
||||
build_session_from_dialog (*session_dialog, session_path, session_name, template_name, session_domain);
|
||||
build_session_from_dialog (*session_dialog, session_path, session_name, template_name);
|
||||
|
||||
} else {
|
||||
|
||||
|
@ -458,7 +442,7 @@ ARDOUR_UI::load_session_stage_two (const std::string& path, const std::string& s
|
|||
|
||||
(void) msg.run ();
|
||||
msg.hide ();
|
||||
g_free (escaped_error_txt);
|
||||
delete escaped_error_txt;
|
||||
|
||||
goto out;
|
||||
}
|
||||
|
@ -489,7 +473,7 @@ ARDOUR_UI::load_session_stage_two (const std::string& path, const std::string& s
|
|||
|
||||
(void) msg.run ();
|
||||
msg.hide ();
|
||||
g_free (escaped_error_txt);
|
||||
delete escaped_error_txt;
|
||||
|
||||
goto out;
|
||||
}
|
||||
|
@ -517,7 +501,7 @@ ARDOUR_UI::load_session_stage_two (const std::string& path, const std::string& s
|
|||
|
||||
(void) msg.run ();
|
||||
msg.hide ();
|
||||
g_free (escaped_error_txt);
|
||||
delete escaped_error_txt;
|
||||
|
||||
goto out;
|
||||
}
|
||||
|
@ -620,7 +604,7 @@ ARDOUR_UI::load_session_stage_two (const std::string& path, const std::string& s
|
|||
}
|
||||
|
||||
int
|
||||
ARDOUR_UI::build_session (const std::string& path, const std::string& snap_name, const std::string& session_template, BusProfile const& bus_profile, bool from_startup_fsm, bool unnamed, Temporal::TimeDomain domain)
|
||||
ARDOUR_UI::build_session (const std::string& path, const std::string& snap_name, const std::string& session_template, BusProfile const& bus_profile, bool from_startup_fsm, bool unnamed)
|
||||
{
|
||||
int x;
|
||||
|
||||
|
@ -639,11 +623,11 @@ ARDOUR_UI::build_session (const std::string& path, const std::string& snap_name,
|
|||
* asked for the SR (even if try-autostart-engine is set)
|
||||
*/
|
||||
if (from_startup_fsm && AudioEngine::instance()->running ()) {
|
||||
return build_session_stage_two (path, snap_name, session_template, bus_profile, unnamed, domain);
|
||||
return build_session_stage_two (path, snap_name, session_template, bus_profile, unnamed);
|
||||
}
|
||||
/* Sample-rate cannot be changed when JACK is running */
|
||||
if (!ARDOUR::AudioEngine::instance()->setup_required () && AudioEngine::instance()->running ()) {
|
||||
return build_session_stage_two (path, snap_name, session_template, bus_profile, unnamed, domain);
|
||||
return build_session_stage_two (path, snap_name, session_template, bus_profile, unnamed);
|
||||
}
|
||||
|
||||
/* Work-around missing "OK" button:
|
||||
|
@ -659,7 +643,7 @@ ARDOUR_UI::build_session (const std::string& path, const std::string& snap_name,
|
|||
audio_midi_setup->set_position (WIN_POS_CENTER);
|
||||
audio_midi_setup->set_modal ();
|
||||
audio_midi_setup->present ();
|
||||
_engine_dialog_connection = audio_midi_setup->signal_response().connect (boost::bind (&ARDOUR_UI::audio_midi_setup_for_new_session_done, this, _1, path, snap_name, session_template, bus_profile, unnamed, domain));
|
||||
_engine_dialog_connection = audio_midi_setup->signal_response().connect (sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::audio_midi_setup_for_new_session_done), path, snap_name, session_template, bus_profile, unnamed));
|
||||
|
||||
/* not done yet, but we're avoiding modal dialogs */
|
||||
return 0;
|
||||
|
@ -667,7 +651,7 @@ ARDOUR_UI::build_session (const std::string& path, const std::string& snap_name,
|
|||
|
||||
|
||||
void
|
||||
ARDOUR_UI::audio_midi_setup_for_new_session_done (int response, std::string path, std::string snap_name, std::string template_name, BusProfile const& bus_profile, bool unnamed, Temporal::TimeDomain domain)
|
||||
ARDOUR_UI::audio_midi_setup_for_new_session_done (int response, std::string path, std::string snap_name, std::string template_name, BusProfile const& bus_profile, bool unnamed)
|
||||
{
|
||||
_engine_dialog_connection.disconnect ();
|
||||
|
||||
|
@ -685,18 +669,18 @@ ARDOUR_UI::audio_midi_setup_for_new_session_done (int response, std::string path
|
|||
audio_midi_setup->set_modal (false);
|
||||
audio_midi_setup->hide();
|
||||
|
||||
build_session_stage_two (path, snap_name, template_name, bus_profile, unnamed, domain);
|
||||
build_session_stage_two (path, snap_name, template_name, bus_profile, unnamed);
|
||||
}
|
||||
|
||||
int
|
||||
ARDOUR_UI::build_session_stage_two (std::string const& path, std::string const& snap_name, std::string const& session_template, BusProfile const& bus_profile, bool unnamed, Temporal::TimeDomain domain, samplecnt_t samplerate)
|
||||
ARDOUR_UI::build_session_stage_two (std::string const& path, std::string const& snap_name, std::string const& session_template, BusProfile const& bus_profile, bool unnamed)
|
||||
{
|
||||
Session* new_session;
|
||||
|
||||
bool meta_session = !session_template.empty() && session_template.substr (0, 11) == "urn:ardour:";
|
||||
|
||||
try {
|
||||
new_session = new Session (*AudioEngine::instance(), path, snap_name, bus_profile.master_out_channels > 0 ? &bus_profile : NULL, meta_session ? "" : session_template, unnamed, samplerate);
|
||||
new_session = new Session (*AudioEngine::instance(), path, snap_name, bus_profile.master_out_channels > 0 ? &bus_profile : NULL, meta_session ? "" : session_template, unnamed);
|
||||
}
|
||||
catch (SessionException const& e) {
|
||||
gchar* escaped_error_txt = 0;
|
||||
|
@ -716,7 +700,7 @@ ARDOUR_UI::build_session_stage_two (std::string const& path, std::string const&
|
|||
msg.set_title (_("Loading Error"));
|
||||
msg.set_position (Gtk::WIN_POS_CENTER);
|
||||
msg.run ();
|
||||
g_free (escaped_error_txt);
|
||||
delete escaped_error_txt;
|
||||
return -1;
|
||||
}
|
||||
catch (Glib::Error const& e) {
|
||||
|
@ -740,7 +724,7 @@ ARDOUR_UI::build_session_stage_two (std::string const& path, std::string const&
|
|||
msg.set_title (_("Loading Error"));
|
||||
msg.set_position (Gtk::WIN_POS_CENTER);
|
||||
msg.run ();
|
||||
g_free (escaped_error_txt);
|
||||
delete escaped_error_txt;
|
||||
return -1;
|
||||
}
|
||||
catch (...) {
|
||||
|
@ -761,7 +745,7 @@ ARDOUR_UI::build_session_stage_two (std::string const& path, std::string const&
|
|||
msg.set_title (_("Loading Error"));
|
||||
msg.set_position (Gtk::WIN_POS_CENTER);
|
||||
msg.run ();
|
||||
g_free (escaped_error_txt);
|
||||
delete escaped_error_txt;
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -790,8 +774,6 @@ ARDOUR_UI::build_session_stage_two (std::string const& path, std::string const&
|
|||
n->set_property (X_("left-frame"), X_("0"));
|
||||
}
|
||||
|
||||
new_session->config.set_default_time_domain(domain);
|
||||
|
||||
set_session (new_session);
|
||||
|
||||
new_session->save_state(new_session->name());
|
||||
|
@ -1127,7 +1109,9 @@ ARDOUR_UI::process_snapshot_session_prompter (Prompter& prompter, bool switch_to
|
|||
}
|
||||
}
|
||||
|
||||
vector<std::string> n = Session::possible_states (_session->session_directory().root_path());
|
||||
vector<std::string> p;
|
||||
get_state_files_in_directory (_session->session_directory().root_path(), p);
|
||||
vector<string> n = get_file_names_no_extension (p);
|
||||
|
||||
if (find (n.begin(), n.end(), snapname) != n.end()) {
|
||||
|
||||
|
@ -1185,20 +1169,9 @@ ARDOUR_UI::open_session ()
|
|||
FileFilter archive_filter;
|
||||
archive_filter.add_pattern (string_compose(X_("*%1"), ARDOUR::session_archive_suffix));
|
||||
archive_filter.set_name (_("Session Archives"));
|
||||
|
||||
open_session_selector.add_filter (archive_filter);
|
||||
|
||||
FileFilter aaf_filter;
|
||||
aaf_filter.add_pattern (string_compose(X_("*%1"), ARDOUR::advanced_authoring_format_suffix));
|
||||
aaf_filter.set_name (_("Advanced Authoring Format (AAF)"));
|
||||
open_session_selector.add_filter (aaf_filter);
|
||||
|
||||
FileFilter all_filter;
|
||||
all_filter.add_pattern (string_compose(X_("*%1"), ARDOUR::statefile_suffix));
|
||||
all_filter.add_pattern (string_compose(X_("*%1"), ARDOUR::session_archive_suffix));
|
||||
all_filter.add_pattern (string_compose(X_("*%1"), ARDOUR::advanced_authoring_format_suffix));
|
||||
all_filter.set_name (_("All supported files"));
|
||||
open_session_selector.add_filter (all_filter);
|
||||
|
||||
open_session_selector.set_filter (session_filter);
|
||||
|
||||
int response = open_session_selector.run();
|
||||
|
@ -1215,34 +1188,22 @@ ARDOUR_UI::open_session ()
|
|||
string path, name;
|
||||
bool isnew;
|
||||
|
||||
if (session_path.empty()) {
|
||||
return;
|
||||
}
|
||||
int rv = ARDOUR::inflate_session (session_path, Config->get_default_session_parent_dir(), path, name);
|
||||
if (rv == 0) {
|
||||
_session_is_new = false;
|
||||
load_session (path, name);
|
||||
return;
|
||||
}
|
||||
else if (rv < 0) {
|
||||
ArdourMessageDialog msg (_main_window, string_compose (_("Extracting session-archive failed: %1"), inflate_error (rv)));
|
||||
msg.run ();
|
||||
return;
|
||||
}
|
||||
|
||||
rv = new_session_from_aaf (session_path, Config->get_default_session_parent_dir(), path, name);
|
||||
if (rv == 0) {
|
||||
_session_is_new = false;
|
||||
return;
|
||||
} else if (rv < 0) {
|
||||
ArdourMessageDialog msg (_main_window, _("Extracting AAF failed"));
|
||||
msg.run ();
|
||||
return;
|
||||
}
|
||||
|
||||
if (ARDOUR::find_session (session_path, path, name, isnew) == 0) {
|
||||
_session_is_new = isnew;
|
||||
load_session (path, name);
|
||||
if (session_path.length() > 0) {
|
||||
int rv = ARDOUR::inflate_session (session_path,
|
||||
Config->get_default_session_parent_dir(), path, name);
|
||||
if (rv == 0) {
|
||||
_session_is_new = false;
|
||||
load_session (path, name);
|
||||
}
|
||||
else if (rv < 0) {
|
||||
ArdourMessageDialog msg (_main_window,
|
||||
string_compose (_("Extracting session-archive failed: %1"), inflate_error (rv)));
|
||||
msg.run ();
|
||||
}
|
||||
else if (ARDOUR::find_session (session_path, path, name, isnew) == 0) {
|
||||
_session_is_new = isnew;
|
||||
load_session (path, name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1307,7 +1268,6 @@ ARDOUR_UI::ask_about_saving_session (const vector<string>& actions)
|
|||
window.add_button (actions[2], RESPONSE_ACCEPT);
|
||||
|
||||
window.set_default_response (RESPONSE_ACCEPT);
|
||||
window.set_keep_above (true);
|
||||
|
||||
Gtk::Button noquit_button (msg);
|
||||
noquit_button.set_name ("EditorGTKButton");
|
||||
|
@ -1363,7 +1323,7 @@ void
|
|||
ARDOUR_UI::save_session_at_its_request (std::string snapshot_name)
|
||||
{
|
||||
if (_session) {
|
||||
_session->save_state (snapshot_name, true);
|
||||
_session->save_state (snapshot_name);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -78,13 +78,13 @@
|
|||
|
||||
#include "pbd/i18n.h"
|
||||
|
||||
using namespace Temporal;
|
||||
using namespace ARDOUR;
|
||||
using namespace PBD;
|
||||
using namespace Gtk;
|
||||
using namespace Gtkmm2ext;
|
||||
using namespace std;
|
||||
|
||||
|
||||
static bool
|
||||
_hide_splash (gpointer arg)
|
||||
{
|
||||
|
@ -184,11 +184,10 @@ ARDOUR_UI::sr_mismatch_dialog (samplecnt_t desired, samplecnt_t actual)
|
|||
HBox* hbox = new HBox();
|
||||
Image* image = new Image (Stock::DIALOG_WARNING, ICON_SIZE_DIALOG);
|
||||
ArdourDialog dialog (_("Sample Rate Mismatch"), true);
|
||||
Label message (string_compose (_("\
|
||||
This session was created with a sample rate of %1 Hz, but \
|
||||
%2 is currently running at %3 Hz. If you load this session, \
|
||||
audio will be resampled, which reduces quality.\n"), desired, PROGRAM_NAME, actual));
|
||||
message.set_line_wrap ();
|
||||
Label message (string_compose (_("\
|
||||
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"), desired, PROGRAM_NAME, actual));
|
||||
|
||||
image->set_alignment(ALIGN_CENTER, ALIGN_START);
|
||||
hbox->pack_start (*image, PACK_EXPAND_WIDGET, 12);
|
||||
|
@ -225,10 +224,10 @@ void
|
|||
ARDOUR_UI::sr_mismatch_message (samplecnt_t desired, samplecnt_t actual)
|
||||
{
|
||||
ArdourMessageDialog msg (string_compose (_("\
|
||||
This session was created with a sample rate of %1 Hz, but \
|
||||
This session was created with a sample rate of %1 Hz, but\n\
|
||||
%2 is currently running at %3 Hz.\n\
|
||||
Audio is resampled for both playback and recording to match the sampling \
|
||||
rate, which reduces quality. Reconfigure the Audio Engine in \
|
||||
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,
|
||||
|
@ -525,35 +524,16 @@ ARDOUR_UI::sfsm_response (StartupFSM::Result r)
|
|||
DEBUG_TRACE (DEBUG::GuiStartup, string_compose (X_("startup FSM response %1\n"), r));
|
||||
|
||||
switch (r) {
|
||||
case StartupFSM::ExitProgram: {
|
||||
/* failure mode */
|
||||
std::stringstream str;;
|
||||
dump_errors (str, 10);
|
||||
std::string msg (string_compose (_("<span font_size=\"large\" font_weight=\"bold\">Something went seriously wrong. %1 cannot continue.</span>\n\n"
|
||||
"Here are a few hints at what might be wrong:\n\n%2"),
|
||||
PROGRAM_NAME,
|
||||
str.str()));
|
||||
ArdourMessageDialog d (msg, true);
|
||||
d.set_title (string_compose (_("%1: Unrecoverable Error"), PROGRAM_NAME));
|
||||
d.run();
|
||||
|
||||
case StartupFSM::ExitProgram:
|
||||
queue_finish ();
|
||||
}
|
||||
break;
|
||||
|
||||
case StartupFSM::QuitProgram:
|
||||
/* user explicitly requested quit */
|
||||
queue_finish ();
|
||||
break;
|
||||
|
||||
case StartupFSM::LoadedSession:
|
||||
startup_done ();
|
||||
break;
|
||||
|
||||
case StartupFSM::LoadSession:
|
||||
|
||||
if (load_session_from_startup_fsm () == 0) {
|
||||
startup_done ();
|
||||
delete startup_fsm;
|
||||
startup_fsm = 0;
|
||||
} else {
|
||||
DEBUG_TRACE (DEBUG::GuiStartup, "FSM reset\n");
|
||||
startup_fsm->reset ();
|
||||
|
@ -623,11 +603,6 @@ ARDOUR_UI::starting ()
|
|||
*/
|
||||
|
||||
startup_fsm->start ();
|
||||
|
||||
if (startup_fsm->complete()) {
|
||||
delete startup_fsm;
|
||||
startup_fsm = 0;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -683,29 +658,23 @@ ARDOUR_UI::copy_demo_sessions ()
|
|||
int
|
||||
ARDOUR_UI::load_session_from_startup_fsm ()
|
||||
{
|
||||
const string session_path = startup_fsm->session_path;
|
||||
const string session_name = startup_fsm->session_name;
|
||||
const string session_template = startup_fsm->session_template;
|
||||
const bool session_is_new = startup_fsm->session_is_new;
|
||||
const bool session_was_not_named = (!startup_fsm->session_name_edited && ARDOUR_COMMAND_LINE::session_name.empty());
|
||||
const TimeDomain session_domain = startup_fsm->session_domain;
|
||||
const BusProfile bus_profile = startup_fsm->bus_profile;
|
||||
const string session_path = startup_fsm->session_path;
|
||||
const string session_name = startup_fsm->session_name;
|
||||
const string session_template = startup_fsm->session_template;
|
||||
const bool session_is_new = startup_fsm->session_is_new;
|
||||
const BusProfile bus_profile = startup_fsm->bus_profile;
|
||||
const bool session_was_not_named = (!startup_fsm->session_name_edited && ARDOUR_COMMAND_LINE::session_name.empty());
|
||||
|
||||
if (session_is_new) {
|
||||
|
||||
if (build_session (session_path, session_name, session_template, bus_profile, true, session_was_not_named, session_domain)) {
|
||||
if (build_session (session_path, session_name, session_template, bus_profile, true, session_was_not_named)) {
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ret = load_session (session_path, session_name, session_template);
|
||||
return load_session (session_path, session_name, session_template);
|
||||
|
||||
if (!ret) {
|
||||
startup_fsm->set_complete ();
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -735,8 +704,6 @@ ARDOUR_UI::startup_done ()
|
|||
_status_bar_visibility.update ();
|
||||
|
||||
BootMessage (string_compose (_("%1 is ready for use"), PROGRAM_NAME));
|
||||
|
||||
startup_fsm->set_complete ();
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -901,7 +868,7 @@ ARDOUR_UI::load_from_application_api (const std::string& path)
|
|||
if (nsm) {
|
||||
BusProfile bus_profile;
|
||||
bus_profile.master_out_channels = 2;
|
||||
build_session (path, basename_nosuffix (path), "", bus_profile, true, false, AudioTime);
|
||||
build_session (path, basename_nosuffix (path), "", bus_profile, true, false);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -49,9 +49,7 @@ ArdourWindow::ArdourWindow (Gtk::Window& parent, string title)
|
|||
{
|
||||
init ();
|
||||
set_title (title);
|
||||
#ifndef __APPLE__
|
||||
set_transient_for (parent);
|
||||
#endif
|
||||
set_position (Gtk::WIN_POS_CENTER_ON_PARENT);
|
||||
}
|
||||
|
||||
|
|
|
@ -27,6 +27,6 @@ exec valgrind --tool=callgrind \
|
|||
--dump-instr=yes --collect-jumps=yes\
|
||||
--separate-threads=yes \
|
||||
--collect-systime=yes --collect-bus=yes \
|
||||
--collect-atstart=no --instr-atstart=no\
|
||||
--callgrind-out-file=/tmp/ardour_profile/ardour-%p.log \
|
||||
--toggle-collect="ARDOUR::AudioEngine::process_callback*" \
|
||||
$TOP/$EXECUTABLE "$@"
|
||||
|
|
|
@ -5,7 +5,6 @@ VALGRIND_OPTIONS="$VALGRIND_OPTIONS --error-limit=no"
|
|||
#VALGRIND_OPTIONS="$VALGRIND_OPTIONS --show-leak-kinds=all -v"
|
||||
#VALGRIND_OPTIONS="$VALGRIND_OPTIONS --log-file=/tmp/ardour-%p.log"
|
||||
#VALGRIND_OPTIONS="$VALGRIND_OPTIONS --gen-suppressions=all"
|
||||
#VALGRIND_OPTIONS="$VALGRIND_OPTIONS -q --vgdb-error=0"
|
||||
|
||||
TOP=`dirname "$0"`/..
|
||||
. $TOP/build/gtk2_ardour/ardev_common_waf.sh
|
||||
|
|
|
@ -79,7 +79,7 @@ class AUPluginUI;
|
|||
class AUPluginUI : public PlugUIBase, public Gtk::VBox
|
||||
{
|
||||
public:
|
||||
AUPluginUI (std::shared_ptr<ARDOUR::PlugInsertBase>);
|
||||
AUPluginUI (boost::shared_ptr<ARDOUR::PlugInsertBase>);
|
||||
~AUPluginUI ();
|
||||
|
||||
gint get_preferred_width () { return req_width; }
|
||||
|
@ -115,7 +115,7 @@ public:
|
|||
|
||||
private:
|
||||
WindowRef wr;
|
||||
std::shared_ptr<ARDOUR::AUPlugin> au;
|
||||
boost::shared_ptr<ARDOUR::AUPlugin> au;
|
||||
int prefheight;
|
||||
int prefwidth;
|
||||
|
||||
|
|
|
@ -395,7 +395,7 @@ static void interposed_drawIfNeeded (id receiver, SEL selector, NSRect rect)
|
|||
}
|
||||
@end
|
||||
|
||||
AUPluginUI::AUPluginUI (std::shared_ptr<PlugInsertBase> pib)
|
||||
AUPluginUI::AUPluginUI (boost::shared_ptr<PlugInsertBase> pib)
|
||||
: PlugUIBase (pib)
|
||||
, automation_mode_label (_("Automation"))
|
||||
, preset_label (_("Presets"))
|
||||
|
@ -419,7 +419,7 @@ AUPluginUI::AUPluginUI (std::shared_ptr<PlugInsertBase> pib)
|
|||
set_popdown_strings (automation_mode_selector, automation_mode_strings);
|
||||
automation_mode_selector.set_active_text (automation_mode_strings.front());
|
||||
|
||||
if ((au = std::dynamic_pointer_cast<AUPlugin> (pib->plugin())) == 0) {
|
||||
if ((au = boost::dynamic_pointer_cast<AUPlugin> (pib->plugin())) == 0) {
|
||||
error << _("unknown type of editor-supplying plugin (note: no AudioUnit support in this version of ardour)") << endmsg;
|
||||
throw failed_constructor ();
|
||||
}
|
||||
|
@ -1348,7 +1348,7 @@ AUPluginUI::stop_updating (GdkEventAny*)
|
|||
}
|
||||
|
||||
PlugUIBase*
|
||||
create_au_gui (std::shared_ptr<PlugInsertBase> pib, VBox** box)
|
||||
create_au_gui (boost::shared_ptr<PlugInsertBase> pib, VBox** box)
|
||||
{
|
||||
AUPluginUI* aup = new AUPluginUI (pib);
|
||||
(*box) = aup;
|
||||
|
|
|
@ -92,7 +92,7 @@ AudioClipEditor::ClipBBTMetric::get_marks (std::vector<ArdourCanvas::Ruler::Mark
|
|||
return;
|
||||
}
|
||||
|
||||
std::shared_ptr<AudioTrigger> at = std::dynamic_pointer_cast<AudioTrigger> (trigger);
|
||||
boost::shared_ptr<AudioTrigger> at = boost::dynamic_pointer_cast<AudioTrigger> (trigger);
|
||||
if (!at) {
|
||||
return;
|
||||
}
|
||||
|
@ -105,7 +105,7 @@ AudioClipEditor::ClipBBTMetric::get_marks (std::vector<ArdourCanvas::Ruler::Mark
|
|||
|
||||
std::cerr << "get marks between " << lower << " .. " << upper << " with tempo " << tempo << " upp = " << units_per_pixel << std::endl;
|
||||
|
||||
samplecnt_t samples_per_beat = tempo.samples_per_note_type (TEMPORAL_SAMPLE_RATE);
|
||||
samplecnt_t samples_per_beat = tempo.samples_per_note_type (AudioEngine::instance()->sample_rate());
|
||||
int64_t beat_number = (lower + (samples_per_beat/2)) / samples_per_beat;
|
||||
int64_t last = INT64_MIN;
|
||||
const double scale = UIConfiguration::instance ().get_ui_scale ();
|
||||
|
@ -402,7 +402,7 @@ AudioClipEditor::drop_waves ()
|
|||
}
|
||||
|
||||
void
|
||||
AudioClipEditor::set_region (std::shared_ptr<AudioRegion> r, TriggerReference tr)
|
||||
AudioClipEditor::set_region (boost::shared_ptr<AudioRegion> r, TriggerReference tr)
|
||||
{
|
||||
drop_waves ();
|
||||
|
||||
|
@ -425,12 +425,12 @@ AudioClipEditor::set_region (std::shared_ptr<AudioRegion> r, TriggerReference tr
|
|||
len = r->source (0)->length ().samples ();
|
||||
|
||||
for (uint32_t n = 0; n < n_chans; ++n) {
|
||||
std::shared_ptr<Region> wr = RegionFactory::get_whole_region_for_source (r->source (n));
|
||||
boost::shared_ptr<Region> wr = RegionFactory::get_whole_region_for_source (r->source (n));
|
||||
if (!wr) {
|
||||
continue;
|
||||
}
|
||||
|
||||
std::shared_ptr<AudioRegion> war = std::dynamic_pointer_cast<AudioRegion> (wr);
|
||||
boost::shared_ptr<AudioRegion> war = boost::dynamic_pointer_cast<AudioRegion> (wr);
|
||||
if (!war) {
|
||||
continue;
|
||||
}
|
||||
|
@ -445,7 +445,7 @@ AudioClipEditor::set_region (std::shared_ptr<AudioRegion> r, TriggerReference tr
|
|||
}
|
||||
|
||||
TriggerPtr trigger (tr.trigger());
|
||||
std::shared_ptr<AudioTrigger> at = std::dynamic_pointer_cast<AudioTrigger> (trigger);
|
||||
boost::shared_ptr<AudioTrigger> at = boost::dynamic_pointer_cast<AudioTrigger> (trigger);
|
||||
if (at) {
|
||||
if (at->segment_tempo() == 0.) {
|
||||
/* tempo unknown, hide ruler */
|
||||
|
@ -607,9 +607,9 @@ AudioClipEditorBox::zoom_out_click ()
|
|||
}
|
||||
|
||||
void
|
||||
AudioClipEditorBox::set_region (std::shared_ptr<Region> r, TriggerReference tref)
|
||||
AudioClipEditorBox::set_region (boost::shared_ptr<Region> r, TriggerReference tref)
|
||||
{
|
||||
std::shared_ptr<AudioRegion> ar = std::dynamic_pointer_cast<AudioRegion> (r);
|
||||
boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion> (r);
|
||||
|
||||
if (!ar) {
|
||||
return;
|
||||
|
|
|
@ -70,7 +70,7 @@ public:
|
|||
ClipEditorBox () {}
|
||||
~ClipEditorBox () {}
|
||||
|
||||
virtual void set_region (std::shared_ptr<ARDOUR::Region>, ARDOUR::TriggerReference) = 0;
|
||||
virtual void set_region (boost::shared_ptr<ARDOUR::Region>, ARDOUR::TriggerReference) = 0;
|
||||
|
||||
static void init ();
|
||||
static void register_clip_editor_actions (Gtkmm2ext::Bindings*);
|
||||
|
@ -92,7 +92,7 @@ public:
|
|||
AudioClipEditor ();
|
||||
~AudioClipEditor ();
|
||||
|
||||
void set_region (std::shared_ptr<ARDOUR::AudioRegion>, ARDOUR::TriggerReference);
|
||||
void set_region (boost::shared_ptr<ARDOUR::AudioRegion>, ARDOUR::TriggerReference);
|
||||
void on_size_allocate (Gtk::Allocation&);
|
||||
|
||||
double sample_to_pixel (ARDOUR::samplepos_t);
|
||||
|
@ -138,7 +138,7 @@ private:
|
|||
samplepos_t left_origin;
|
||||
double _spp;
|
||||
double scroll_fraction;
|
||||
std::shared_ptr<ARDOUR::AudioRegion> audio_region;
|
||||
boost::shared_ptr<ARDOUR::AudioRegion> audio_region;
|
||||
|
||||
void scroll_left ();
|
||||
void scrol_right ();
|
||||
|
@ -201,7 +201,7 @@ public:
|
|||
AudioClipEditorBox ();
|
||||
~AudioClipEditorBox ();
|
||||
|
||||
void set_region (std::shared_ptr<ARDOUR::Region>, ARDOUR::TriggerReference);
|
||||
void set_region (boost::shared_ptr<ARDOUR::Region>, ARDOUR::TriggerReference);
|
||||
void region_changed (const PBD::PropertyChange& what_changed);
|
||||
|
||||
private:
|
||||
|
@ -215,7 +215,7 @@ private:
|
|||
|
||||
PBD::ScopedConnection state_connection;
|
||||
|
||||
std::shared_ptr<ARDOUR::Region> _region;
|
||||
boost::shared_ptr<ARDOUR::Region> _region;
|
||||
|
||||
void zoom_in_click ();
|
||||
void zoom_out_click ();
|
||||
|
|
|
@ -68,6 +68,7 @@ using namespace Temporal;
|
|||
|
||||
using Gtkmm2ext::Keyboard;
|
||||
|
||||
sigc::signal<void> AudioClock::ModeChanged;
|
||||
vector<AudioClock*> AudioClock::clocks;
|
||||
|
||||
#define BBT_BAR_CHAR "|"
|
||||
|
@ -78,11 +79,14 @@ AudioClock::AudioClock (const string& clock_name, bool transient, const string&
|
|||
bool accept_on_focus_out)
|
||||
: ops_menu (0)
|
||||
, _name (clock_name)
|
||||
, is_transient (transient)
|
||||
, is_duration (duration)
|
||||
, editable (allow_edit)
|
||||
, _follows_playhead (follows_playhead)
|
||||
, _accept_on_focus_out (accept_on_focus_out)
|
||||
, _off (false)
|
||||
, em_width (0)
|
||||
, _edit_by_click_field (false)
|
||||
, _negative_allowed (false)
|
||||
, edit_is_negative (false)
|
||||
, _limit_pos (timepos_t::max (Temporal::AudioTime))
|
||||
|
@ -97,6 +101,8 @@ AudioClock::AudioClock (const string& clock_name, bool transient, const string&
|
|||
, corner_radius (4)
|
||||
, font_size (10240)
|
||||
, editing (false)
|
||||
, last_pdelta (0)
|
||||
, last_sdelta (0)
|
||||
, dragging (false)
|
||||
, drag_field (Field (0))
|
||||
, xscale (1.0)
|
||||
|
@ -113,8 +119,9 @@ AudioClock::AudioClock (const string& clock_name, bool transient, const string&
|
|||
|
||||
_mode = BBT; /* lie to force mode switch */
|
||||
set_mode (Timecode);
|
||||
AudioClock::set (last_when(), true);
|
||||
|
||||
if (!transient) {
|
||||
if (!is_transient) {
|
||||
clocks.push_back (this);
|
||||
}
|
||||
|
||||
|
@ -124,8 +131,8 @@ AudioClock::AudioClock (const string& clock_name, bool transient, const string&
|
|||
_left_btn.set_sizing_text (_("0000000000000"));
|
||||
_right_btn.set_sizing_text (_("0000000000000"));
|
||||
|
||||
_left_btn.set_layout_font (UIConfiguration::instance().get_ArdourSmallFont());
|
||||
_right_btn.set_layout_font (UIConfiguration::instance().get_ArdourSmallFont());
|
||||
_left_btn.set_layout_font (UIConfiguration::instance().get_SmallMonospaceFont());
|
||||
_right_btn.set_layout_font (UIConfiguration::instance().get_SmallMonospaceFont());
|
||||
|
||||
UIConfiguration::instance().ColorsChanged.connect (sigc::mem_fun (*this, &AudioClock::set_colors));
|
||||
UIConfiguration::instance().DPIReset.connect (sigc::mem_fun (*this, &AudioClock::dpi_reset));
|
||||
|
@ -309,7 +316,7 @@ AudioClock::render (Cairo::RefPtr<Cairo::Context> const& ctx, cairo_rectangle_t*
|
|||
cairo_set_source_rgba (cr, cursor_r, cursor_g, cursor_b, cursor_a);
|
||||
cairo_rectangle (cr,
|
||||
min (get_width() - 2.0,
|
||||
(double) xcenter + cursor.get_x()/PANGO_SCALE),
|
||||
(double) xcenter + cursor.get_x()/PANGO_SCALE + em_width),
|
||||
(get_height() - layout_height)/2.0,
|
||||
2.0, cursor.get_height()/PANGO_SCALE);
|
||||
cairo_fill (cr);
|
||||
|
@ -506,40 +513,35 @@ AudioClock::end_edit (bool modify)
|
|||
} else {
|
||||
|
||||
editing = false;
|
||||
samplepos_t samples = 0; /* stupid gcc */
|
||||
samplepos_t pos = 0; /* stupid gcc */
|
||||
|
||||
switch (_mode) {
|
||||
case Timecode:
|
||||
samples = samples_from_timecode_string (edit_string);
|
||||
pos = samples_from_timecode_string (edit_string);
|
||||
break;
|
||||
|
||||
case BBT:
|
||||
if (is_duration) {
|
||||
samples = sample_duration_from_bbt_string (last_when(), edit_string);
|
||||
pos = sample_duration_from_bbt_string (last_when(), edit_string);
|
||||
} else {
|
||||
samples = samples_from_bbt_string (timepos_t(), edit_string);
|
||||
pos = samples_from_bbt_string (timepos_t(), edit_string);
|
||||
}
|
||||
break;
|
||||
|
||||
case MinSec:
|
||||
samples = samples_from_minsec_string (edit_string);
|
||||
pos = samples_from_minsec_string (edit_string);
|
||||
break;
|
||||
|
||||
case Seconds:
|
||||
samples = samples_from_seconds_string (edit_string);
|
||||
pos = samples_from_seconds_string (edit_string);
|
||||
break;
|
||||
|
||||
case Samples:
|
||||
samples = samples_from_audiosamples_string (edit_string);
|
||||
pos = samples_from_audiosamples_string (edit_string);
|
||||
break;
|
||||
}
|
||||
|
||||
if (is_duration) {
|
||||
AudioClock::set_duration (timecnt_t (samples), true);
|
||||
} else {
|
||||
AudioClock::set (timepos_t (samples), true);
|
||||
}
|
||||
|
||||
AudioClock::set (timepos_t (pos), true);
|
||||
_layout->set_attributes (normal_attributes);
|
||||
ValueChanged(); /* EMIT_SIGNAL */
|
||||
}
|
||||
|
@ -783,9 +785,9 @@ AudioClock::end_edit_relative (bool add)
|
|||
|
||||
if (!distance.is_zero ()) {
|
||||
if (add) {
|
||||
AudioClock::set (last_when() + timepos_t (distance), true);
|
||||
AudioClock::set (current_time() + timepos_t (distance), true);
|
||||
} else {
|
||||
timepos_t c = last_when();
|
||||
timepos_t c = current_time();
|
||||
|
||||
if (c > timepos_t (distance)|| _negative_allowed) {
|
||||
AudioClock::set (c.earlier (distance), true);
|
||||
|
@ -804,11 +806,7 @@ AudioClock::end_edit_relative (bool add)
|
|||
void
|
||||
AudioClock::tempo_map_changed ()
|
||||
{
|
||||
if (is_duration) {
|
||||
set_duration (current_duration(), true);
|
||||
} else {
|
||||
AudioClock::set (last_when(), true);
|
||||
}
|
||||
AudioClock::set (last_when(), true);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -821,9 +819,9 @@ AudioClock::session_configuration_changed (std::string p)
|
|||
|
||||
if (p == "sync-source" || p == "external-sync") {
|
||||
if (is_duration) {
|
||||
set_duration (current_duration(), true);
|
||||
AudioClock::set_duration (current_duration(), true);
|
||||
} else {
|
||||
AudioClock::set (last_when(), true);
|
||||
AudioClock::set (current_time(), true);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@ -832,9 +830,9 @@ AudioClock::session_configuration_changed (std::string p)
|
|||
switch (_mode) {
|
||||
case Timecode:
|
||||
if (is_duration) {
|
||||
set_duration (current_duration(), true);
|
||||
AudioClock::set_duration (current_duration(), true);
|
||||
} else {
|
||||
AudioClock::set (last_when(), true);
|
||||
AudioClock::set (current_time(), true);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
@ -853,17 +851,17 @@ AudioClock::set_duration (Temporal::timecnt_t const & dur, bool force)
|
|||
}
|
||||
|
||||
timepos_t when;
|
||||
|
||||
/* extent semantics, not length */
|
||||
|
||||
timecnt_t d;
|
||||
|
||||
/* durations for timecode display should use extent, not length
|
||||
*
|
||||
* reminder:
|
||||
* length = end - start
|
||||
* extent = end - start - 1
|
||||
* reminder: length = end - start ; extent = end - start - 1
|
||||
*
|
||||
* and thus:
|
||||
* start + length = end
|
||||
* start + extent = last_point_inside duration
|
||||
* start + length = end
|
||||
* start + extent = last_point_inside duration
|
||||
*/
|
||||
|
||||
switch (_mode) {
|
||||
|
@ -893,24 +891,24 @@ AudioClock::set_duration (Temporal::timecnt_t const & dur, bool force)
|
|||
|
||||
switch (_mode) {
|
||||
case Timecode:
|
||||
set_timecode (when);
|
||||
set_timecode (when, force);
|
||||
break;
|
||||
|
||||
case BBT:
|
||||
set_bbt (dur);
|
||||
set_bbt (dur, force);
|
||||
btn_en = true;
|
||||
break;
|
||||
|
||||
case MinSec:
|
||||
set_minsec (when);
|
||||
set_minsec (when, force);
|
||||
break;
|
||||
|
||||
case Seconds:
|
||||
set_seconds (when);
|
||||
set_seconds (when, force);
|
||||
break;
|
||||
|
||||
case Samples:
|
||||
set_samples (when);
|
||||
set_samples (when, force);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -946,24 +944,24 @@ AudioClock::set (timepos_t const & w, bool force)
|
|||
|
||||
switch (_mode) {
|
||||
case Timecode:
|
||||
set_timecode (when);
|
||||
set_timecode (when, force);
|
||||
break;
|
||||
|
||||
case BBT:
|
||||
set_bbt (timecnt_t (when));
|
||||
set_bbt (timecnt_t (when), force);
|
||||
btn_en = true;
|
||||
break;
|
||||
|
||||
case MinSec:
|
||||
set_minsec (when);
|
||||
set_minsec (when, force);
|
||||
break;
|
||||
|
||||
case Seconds:
|
||||
set_seconds (when);
|
||||
set_seconds (when, force);
|
||||
break;
|
||||
|
||||
case Samples:
|
||||
set_samples (when);
|
||||
set_samples (when, force);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1008,7 +1006,7 @@ AudioClock::set_slave_info ()
|
|||
return;
|
||||
}
|
||||
|
||||
std::shared_ptr<TransportMaster> tm = TransportMasterManager::instance().current();
|
||||
boost::shared_ptr<TransportMaster> tm = TransportMasterManager::instance().current();
|
||||
|
||||
if (_session->transport_master_is_external()) {
|
||||
|
||||
|
@ -1029,8 +1027,8 @@ AudioClock::set_slave_info ()
|
|||
case LTC:
|
||||
case MTC:
|
||||
if (tm) {
|
||||
std::shared_ptr<TimecodeTransportMaster> tcmaster;
|
||||
if ((tcmaster = std::dynamic_pointer_cast<TimecodeTransportMaster>(tm)) != 0) {
|
||||
boost::shared_ptr<TimecodeTransportMaster> tcmaster;
|
||||
if ((tcmaster = boost::dynamic_pointer_cast<TimecodeTransportMaster>(tm)) != 0) {
|
||||
//TODO: _left_btn.set_name () // tcmaster->apparent_timecode_format() != _session->config.get_timecode_format();
|
||||
_left_btn.set_text (string_compose ("%1%2", tm->display_name()[0], tcmaster->position_string ()), false);
|
||||
_right_btn.set_text (tm->delta_string (), false);
|
||||
|
@ -1066,7 +1064,7 @@ AudioClock::set_out_of_bounds (bool negative)
|
|||
}
|
||||
|
||||
void
|
||||
AudioClock::set_samples (timepos_t const & w)
|
||||
AudioClock::set_samples (timepos_t const & w, bool /*force*/)
|
||||
{
|
||||
timepos_t when (w);
|
||||
char buf[32];
|
||||
|
@ -1117,7 +1115,7 @@ AudioClock::set_samples (timepos_t const & w)
|
|||
}
|
||||
|
||||
void
|
||||
AudioClock::set_seconds (timepos_t const & when)
|
||||
AudioClock::set_seconds (timepos_t const & when, bool /*force*/)
|
||||
{
|
||||
char buf[32];
|
||||
|
||||
|
@ -1200,7 +1198,7 @@ AudioClock::print_minsec (samplepos_t when, char* buf, size_t bufsize, float sam
|
|||
}
|
||||
|
||||
void
|
||||
AudioClock::set_minsec (timepos_t const & when)
|
||||
AudioClock::set_minsec (timepos_t const & when, bool /*force*/)
|
||||
{
|
||||
char buf[32];
|
||||
|
||||
|
@ -1223,7 +1221,7 @@ AudioClock::set_minsec (timepos_t const & when)
|
|||
}
|
||||
|
||||
void
|
||||
AudioClock::set_timecode (timepos_t const & w)
|
||||
AudioClock::set_timecode (timepos_t const & w, bool /*force*/)
|
||||
{
|
||||
timepos_t when (w);
|
||||
Timecode::Time TC;
|
||||
|
@ -1260,7 +1258,7 @@ AudioClock::set_timecode (timepos_t const & w)
|
|||
}
|
||||
|
||||
void
|
||||
AudioClock::set_bbt (timecnt_t const & w)
|
||||
AudioClock::set_bbt (timecnt_t const & w, bool /*force*/)
|
||||
{
|
||||
timepos_t pos (w);
|
||||
char buf[64];
|
||||
|
@ -1281,14 +1279,13 @@ AudioClock::set_bbt (timecnt_t const & w)
|
|||
|
||||
/* handle a common case */
|
||||
|
||||
TempoMap::SharedPtr tmap (TempoMap::use());
|
||||
|
||||
if (is_duration) {
|
||||
if (pos.is_zero ()) {
|
||||
BBT.bars = 0;
|
||||
BBT.beats = 0;
|
||||
BBT.ticks = 0;
|
||||
} else {
|
||||
TempoMap::SharedPtr tmap (TempoMap::use());
|
||||
|
||||
const int divisions = tmap->meter_at (w.position()).divisions_per_bar();
|
||||
Temporal::BBT_Time sub_bbt;
|
||||
|
@ -1323,7 +1320,7 @@ AudioClock::set_bbt (timecnt_t const & w)
|
|||
}
|
||||
}
|
||||
} else {
|
||||
BBT = tmap->bbt_at (pos);
|
||||
BBT = TempoMap::use()->bbt_at (pos);
|
||||
}
|
||||
|
||||
if (negative) {
|
||||
|
@ -1338,15 +1335,19 @@ AudioClock::set_bbt (timecnt_t const & w)
|
|||
|
||||
if (_with_info) {
|
||||
|
||||
TempoMetric m (tmap->metric_at (pos));
|
||||
TempoMetric m (TempoMap::use()->metric_at (pos));
|
||||
|
||||
#ifndef PLATFORM_WINDOWS
|
||||
/* UTF8 1/4 note and 1/8 note ♩ (\u2669) and ♪ (\u266a) are n/a on Windows */
|
||||
if (m.tempo().note_type() == 4) {
|
||||
snprintf (buf, sizeof(buf), u8"\u2669 = %.3f", m.tempo().note_types_per_minute_at_DOUBLE (pos));
|
||||
snprintf (buf, sizeof(buf), "\u2669 = %.3f", m.tempo().note_types_per_minute_at_DOUBLE (pos));
|
||||
_left_btn.set_text (string_compose ("%1", buf), false);
|
||||
} else if (m.tempo().note_type() == 8) {
|
||||
snprintf (buf, sizeof(buf), u8"\u266a = %.3f", m.tempo().note_types_per_minute_at_DOUBLE (pos));
|
||||
snprintf (buf, sizeof(buf), "\u266a = %.3f", m.tempo().note_types_per_minute_at_DOUBLE (pos));
|
||||
_left_btn.set_text (string_compose ("%1", buf), false);
|
||||
} else {
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
snprintf (buf, sizeof(buf), "1/%d = %.3f",m.tempo().note_type(), m.tempo().note_types_per_minute_at_DOUBLE (pos));
|
||||
_left_btn.set_text (buf, false);
|
||||
}
|
||||
|
@ -1385,7 +1386,7 @@ AudioClock::set_session (Session *s)
|
|||
|
||||
AudioClock::Mode amode;
|
||||
if ((*i)->get_property (X_("mode"), amode)) {
|
||||
set_mode (amode);
|
||||
set_mode (amode, true);
|
||||
}
|
||||
bool on;
|
||||
if ((*i)->get_property (X_("on"), on)) {
|
||||
|
@ -1395,11 +1396,7 @@ AudioClock::set_session (Session *s)
|
|||
}
|
||||
}
|
||||
|
||||
if (is_duration) {
|
||||
AudioClock::set_duration (current_duration (), true);
|
||||
} else {
|
||||
AudioClock::set (last_when(), true);
|
||||
}
|
||||
AudioClock::set (last_when(), true);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1484,6 +1481,7 @@ AudioClock::on_key_press_event (GdkEventKey* ev)
|
|||
|
||||
case GDK_Escape:
|
||||
end_edit (false);
|
||||
ChangeAborted(); /* EMIT SIGNAL */
|
||||
return true;
|
||||
|
||||
case GDK_Delete:
|
||||
|
@ -1735,7 +1733,36 @@ AudioClock::on_button_release_event (GdkEventButton *ev)
|
|||
return true;
|
||||
} else {
|
||||
if (ev->button == 1) {
|
||||
start_edit ();
|
||||
|
||||
if (_edit_by_click_field) {
|
||||
|
||||
int xcenter = (get_width() - layout_width) /2;
|
||||
int index = 0;
|
||||
int trailing;
|
||||
int y = ev->y - ((get_height() - layout_height)/2);
|
||||
int x = ev->x - xcenter;
|
||||
Field f;
|
||||
|
||||
if (!_layout->xy_to_index (x * PANGO_SCALE, y * PANGO_SCALE, index, trailing)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
f = index_to_field (index);
|
||||
|
||||
switch (f) {
|
||||
case Timecode_frames:
|
||||
case MS_Milliseconds:
|
||||
case Ticks:
|
||||
case SS_Deciseconds:
|
||||
f = Field (0);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
start_edit (f);
|
||||
} else {
|
||||
start_edit ();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1745,7 +1772,7 @@ AudioClock::on_button_release_event (GdkEventButton *ev)
|
|||
if (ops_menu == 0) {
|
||||
build_ops_menu ();
|
||||
}
|
||||
ops_menu->popup (ev->button, ev->time);
|
||||
ops_menu->popup (1, ev->time);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1796,34 +1823,27 @@ AudioClock::on_scroll_event (GdkEventScroll *ev)
|
|||
switch (ev->direction) {
|
||||
|
||||
case GDK_SCROLL_UP:
|
||||
step = get_incremental_step (f, last_when());
|
||||
step = get_incremental_step (f, current_time());
|
||||
if (!step.is_zero ()) {
|
||||
if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
|
||||
step *= 10;
|
||||
}
|
||||
if (is_duration) {
|
||||
AudioClock::set_duration (current_duration() + step, true); // XXX step is too small ?!
|
||||
} else {
|
||||
AudioClock::set (last_when() + step, true);
|
||||
}
|
||||
AudioClock::set (current_time() + step, true);
|
||||
ValueChanged (); /* EMIT_SIGNAL */
|
||||
}
|
||||
break;
|
||||
|
||||
case GDK_SCROLL_DOWN:
|
||||
step = get_incremental_step (f, last_when());
|
||||
step = get_incremental_step (f, current_time());
|
||||
if (!step.is_zero ()) {
|
||||
if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
|
||||
step *= 10;
|
||||
}
|
||||
if (is_duration) {
|
||||
if (!(current_duration () - step).is_negative()) {
|
||||
AudioClock::set_duration (current_duration () - step, true);
|
||||
}
|
||||
} else if (!_negative_allowed && last_when() < step) {
|
||||
|
||||
if (!_negative_allowed && current_time() < step) {
|
||||
AudioClock::set (timepos_t (), true);
|
||||
} else {
|
||||
AudioClock::set (last_when().earlier (step), true);
|
||||
AudioClock::set (current_time().earlier (step), true);
|
||||
}
|
||||
|
||||
ValueChanged (); /* EMIT_SIGNAL */
|
||||
|
@ -1853,28 +1873,20 @@ AudioClock::on_motion_notify_event (GdkEventMotion *ev)
|
|||
if (drag_accum) {
|
||||
|
||||
|
||||
timepos_t pos = last_when ();
|
||||
timepos_t pos = current_time ();
|
||||
timepos_t step = get_incremental_step (drag_field, pos);
|
||||
|
||||
step *= fabs (drag_accum);
|
||||
|
||||
if (drag_accum > 0) { /* positive, so downward motion ... decrement clock */
|
||||
|
||||
if (is_duration) {
|
||||
if (!step.is_zero () && (current_duration () >= timecnt_t(step))) {
|
||||
AudioClock::set_duration (current_duration () - step, false);
|
||||
}
|
||||
} else if (!step.is_zero () && (step < pos)) {
|
||||
if (!step.is_zero () && (step < pos)) {
|
||||
AudioClock::set (pos.earlier (step), false);
|
||||
} else {
|
||||
AudioClock::set (timepos_t () , false);
|
||||
}
|
||||
|
||||
} else if (is_duration) {
|
||||
/* negative so upward motion .. increment clock */
|
||||
AudioClock::set_duration (current_duration () + step, false);
|
||||
} else {
|
||||
/* negative so upward motion .. increment clock */
|
||||
} else { /* negative so upward motion .. increment clock */
|
||||
AudioClock::set (pos + step, false);
|
||||
}
|
||||
|
||||
|
@ -1952,11 +1964,15 @@ AudioClock::get_incremental_step (Field field, timepos_t const & pos)
|
|||
return f;
|
||||
}
|
||||
|
||||
timepos_t
|
||||
AudioClock::current_time () const
|
||||
{
|
||||
return last_when();
|
||||
}
|
||||
|
||||
timecnt_t
|
||||
AudioClock::current_duration (timepos_t pos) const
|
||||
{
|
||||
assert (is_duration);
|
||||
|
||||
timecnt_t ret;
|
||||
|
||||
switch (_mode) {
|
||||
|
@ -1968,7 +1984,7 @@ AudioClock::current_duration (timepos_t pos) const
|
|||
case MinSec:
|
||||
case Seconds:
|
||||
case Samples:
|
||||
ret = last_time;
|
||||
ret = timecnt_t (last_when(), pos);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -2007,13 +2023,14 @@ AudioClock::bbt_validate_edit (string & str)
|
|||
}
|
||||
|
||||
bool
|
||||
AudioClock::timecode_validate_edit (const string& str)
|
||||
AudioClock::timecode_validate_edit (const string&)
|
||||
{
|
||||
Timecode::Time TC;
|
||||
int hours;
|
||||
char ignored[2];
|
||||
|
||||
if (sscanf (str.c_str(), "%*[- _]%" PRId32 ":%" PRId32 ":%" PRId32 "%*[:;]%" PRId32,
|
||||
&hours, &TC.minutes, &TC.seconds, &TC.frames) != 4) {
|
||||
if (sscanf (_layout->get_text().c_str(), "%[- _]%" PRId32 ":%" PRId32 ":%" PRId32 "%[:;]%" PRId32,
|
||||
ignored, &hours, &TC.minutes, &TC.seconds, ignored, &TC.frames) != 6) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -2071,9 +2088,10 @@ AudioClock::samples_from_timecode_string (const string& str) const
|
|||
|
||||
Timecode::Time TC;
|
||||
samplepos_t sample;
|
||||
char ignored[2];
|
||||
int hours;
|
||||
|
||||
if (sscanf (str.c_str(), "%*[- _]%d:%d:%d%*[:;]%d", &hours, &TC.minutes, &TC.seconds, &TC.frames) != 4) {
|
||||
if (sscanf (str.c_str(), "%[- _]%d:%d:%d%[:;]%d", ignored, &hours, &TC.minutes, &TC.seconds, ignored, &TC.frames) != 6) {
|
||||
error << string_compose (_("programming error: %1 %2"), "badly formatted timecode clock string", str) << endmsg;
|
||||
return 0;
|
||||
}
|
||||
|
@ -2113,13 +2131,11 @@ samplepos_t
|
|||
AudioClock::samples_from_bbt_string (timepos_t const & pos, const string& str) const
|
||||
{
|
||||
if (_session == 0) {
|
||||
#ifndef NDEBUG
|
||||
cout << "AudioClock::samples_from_bbt_string() called with BBT mode but without session!\n";
|
||||
#endif
|
||||
error << "AudioClock::current_time() called with BBT mode but without session!" << endmsg;
|
||||
return 0;
|
||||
}
|
||||
|
||||
BBT_Argument bbt;
|
||||
BBT_Time bbt;
|
||||
|
||||
if (sscanf (str.c_str(), BBT_SCANF_FORMAT, &bbt.bars, &bbt.beats, &bbt.ticks) != 3) {
|
||||
return 0;
|
||||
|
@ -2139,9 +2155,7 @@ samplepos_t
|
|||
AudioClock::sample_duration_from_bbt_string (timepos_t const & pos, const string& str) const
|
||||
{
|
||||
if (_session == 0) {
|
||||
#ifndef NDEBUG
|
||||
cout << "AudioClock::sample_duration_from_bbt_string() called with BBT mode but without session!\n";
|
||||
#endif
|
||||
error << "AudioClock::sample_duration_from_bbt_string() called with BBT mode but without session!" << endmsg;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2196,11 +2210,11 @@ AudioClock::build_ops_menu ()
|
|||
MenuList& ops_items = ops_menu->items();
|
||||
ops_menu->set_name ("ArdourContextMenu");
|
||||
|
||||
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 (_("Seconds"), sigc::bind (sigc::mem_fun(*this, &AudioClock::set_mode), Seconds)));
|
||||
ops_items.push_back (MenuElem (_("Samples"), sigc::bind (sigc::mem_fun(*this, &AudioClock::set_mode), Samples)));
|
||||
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 (_("Seconds"), sigc::bind (sigc::mem_fun(*this, &AudioClock::set_mode), Seconds, false)));
|
||||
ops_items.push_back (MenuElem (_("Samples"), sigc::bind (sigc::mem_fun(*this, &AudioClock::set_mode), Samples, false)));
|
||||
|
||||
if (editable && !_off && !is_duration && !_follows_playhead) {
|
||||
ops_items.push_back (SeparatorElem());
|
||||
|
@ -2218,8 +2232,6 @@ AudioClock::set_from_playhead ()
|
|||
return;
|
||||
}
|
||||
|
||||
assert (!is_duration);
|
||||
|
||||
AudioClock::set (timepos_t (_session->transport_sample()));
|
||||
ValueChanged ();
|
||||
}
|
||||
|
@ -2234,26 +2246,22 @@ AudioClock::locate ()
|
|||
return;
|
||||
}
|
||||
|
||||
_session->request_locate (last_when().samples());
|
||||
_session->request_locate (current_time().samples());
|
||||
}
|
||||
|
||||
void
|
||||
AudioClock::set_mode (Mode m)
|
||||
AudioClock::set_mode (Mode m, bool noemit)
|
||||
{
|
||||
if (_mode == m) {
|
||||
return;
|
||||
}
|
||||
|
||||
timecnt_t existing_duration;
|
||||
|
||||
if (_session && is_duration) {
|
||||
existing_duration = current_duration ();
|
||||
}
|
||||
|
||||
_mode = m;
|
||||
|
||||
insert_map.clear();
|
||||
|
||||
_layout->set_text ("");
|
||||
|
||||
Gtk::Requisition req;
|
||||
set_clock_dimensions (req);
|
||||
|
||||
|
@ -2310,10 +2318,10 @@ AudioClock::set_mode (Mode m)
|
|||
break;
|
||||
}
|
||||
|
||||
if (is_duration) {
|
||||
AudioClock::set_duration (existing_duration, true);
|
||||
} else {
|
||||
AudioClock::set (last_when(), true);
|
||||
AudioClock::set (last_when(), true);
|
||||
|
||||
if (!is_transient && !noemit) {
|
||||
ModeChanged (); /* EMIT SIGNAL (the static one)*/
|
||||
}
|
||||
|
||||
mode_changed (); /* EMIT SIGNAL (the member one) */
|
||||
|
@ -2359,7 +2367,7 @@ AudioClock::set_off (bool yn)
|
|||
*/
|
||||
|
||||
if (is_duration) {
|
||||
set_duration (last_time, true);
|
||||
AudioClock::set_duration (last_time, true);
|
||||
} else {
|
||||
AudioClock::set (last_when(), true);
|
||||
}
|
||||
|
|
|
@ -48,7 +48,7 @@ namespace ARDOUR {
|
|||
|
||||
class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr
|
||||
{
|
||||
public:
|
||||
public:
|
||||
enum Mode {
|
||||
Timecode,
|
||||
BBT,
|
||||
|
@ -79,13 +79,14 @@ public:
|
|||
|
||||
void set_from_playhead ();
|
||||
void locate ();
|
||||
void set_mode (Mode);
|
||||
void set_mode (Mode, bool noemit = false);
|
||||
void set_bbt_reference (Temporal::timepos_t const &);
|
||||
|
||||
void copy_text_to_clipboard () const;
|
||||
|
||||
std::string name() const { return _name; }
|
||||
|
||||
Temporal::timepos_t last_when () const { return last_time.position(); }
|
||||
Temporal::timepos_t current_time () const;
|
||||
Temporal::timecnt_t current_duration (Temporal::timepos_t position = Temporal::timepos_t()) const;
|
||||
void set_session (ARDOUR::Session *s);
|
||||
void set_negative_allowed (bool yn);
|
||||
|
@ -105,12 +106,15 @@ public:
|
|||
|
||||
sigc::signal<void> ValueChanged;
|
||||
sigc::signal<void> mode_changed;
|
||||
sigc::signal<void> ChangeAborted;
|
||||
|
||||
static sigc::signal<void> ModeChanged;
|
||||
static std::vector<AudioClock*> clocks;
|
||||
|
||||
protected:
|
||||
protected:
|
||||
void render (Cairo::RefPtr<Cairo::Context> const&, cairo_rectangle_t*);
|
||||
bool get_is_duration () const { return is_duration; }
|
||||
Temporal::timecnt_t offset () const { return _offset; }
|
||||
|
||||
virtual void build_ops_menu ();
|
||||
Gtk::Menu *ops_menu;
|
||||
|
@ -121,19 +125,25 @@ protected:
|
|||
ArdourWidgets::ArdourButton _left_btn;
|
||||
ArdourWidgets::ArdourButton _right_btn;
|
||||
|
||||
private:
|
||||
private:
|
||||
Mode _mode;
|
||||
std::string _name;
|
||||
bool is_transient;
|
||||
bool is_duration;
|
||||
bool editable;
|
||||
/** true if this clock follows the playhead, meaning that certain operations are redundant */
|
||||
bool _follows_playhead;
|
||||
bool _accept_on_focus_out;
|
||||
bool _off;
|
||||
int em_width;
|
||||
bool _edit_by_click_field;
|
||||
bool _negative_allowed;
|
||||
bool edit_is_negative;
|
||||
|
||||
Temporal::timepos_t _limit_pos;
|
||||
Temporal::timepos_t duration_position;
|
||||
|
||||
Temporal::timecnt_t _offset;
|
||||
|
||||
Glib::RefPtr<Pango::Layout> _layout;
|
||||
|
||||
|
@ -153,6 +163,10 @@ private:
|
|||
double corner_radius;
|
||||
uint32_t font_size;
|
||||
|
||||
static const double info_font_scale_factor;
|
||||
static const double separator_height;
|
||||
static const double x_leading_padding;
|
||||
|
||||
enum Field {
|
||||
Timecode_Hours = 1,
|
||||
Timecode_Minutes,
|
||||
|
@ -186,6 +200,10 @@ private:
|
|||
std::string input_string;
|
||||
|
||||
Temporal::timecnt_t last_time;
|
||||
Temporal::timepos_t last_when() const { return last_time.position(); }
|
||||
|
||||
bool last_pdelta;
|
||||
bool last_sdelta;
|
||||
|
||||
bool dragging;
|
||||
double drag_start_y;
|
||||
|
@ -203,11 +221,11 @@ private:
|
|||
bool on_focus_out_event (GdkEventFocus*);
|
||||
|
||||
void set_slave_info ();
|
||||
void set_timecode (Temporal::timepos_t const &);
|
||||
void set_bbt (Temporal::timecnt_t const &);
|
||||
void set_minsec (Temporal::timepos_t const &);
|
||||
void set_seconds (Temporal::timepos_t const &);
|
||||
void set_samples (Temporal::timepos_t const &);
|
||||
void set_timecode (Temporal::timepos_t const &, bool);
|
||||
void set_bbt (Temporal::timecnt_t const &, bool);
|
||||
void set_minsec (Temporal::timepos_t const &, bool);
|
||||
void set_seconds (Temporal::timepos_t const &, bool);
|
||||
void set_samples (Temporal::timepos_t const &, bool);
|
||||
void set_out_of_bounds (bool negative);
|
||||
void finish_set (Temporal::timepos_t const &, bool);
|
||||
|
||||
|
@ -234,6 +252,7 @@ private:
|
|||
void start_edit (Field f = Field (0));
|
||||
void end_edit (bool);
|
||||
void end_edit_relative (bool);
|
||||
void edit_next_field ();
|
||||
|
||||
Temporal::timecnt_t parse_as_distance (const std::string&);
|
||||
Temporal::timecnt_t parse_as_timecode_distance (const std::string&);
|
||||
|
|
|
@ -33,12 +33,10 @@
|
|||
#include "ardour/audioregion.h"
|
||||
#include "ardour/session_event.h"
|
||||
#include "ardour/dB.h"
|
||||
#include "ardour/region_fx_plugin.h"
|
||||
|
||||
#include "audio_region_editor.h"
|
||||
#include "audio_region_view.h"
|
||||
#include "gui_thread.h"
|
||||
#include "public_editor.h"
|
||||
|
||||
#include "pbd/i18n.h"
|
||||
|
||||
|
@ -54,13 +52,10 @@ _peak_amplitude_thread (void* arg)
|
|||
return 0;
|
||||
}
|
||||
|
||||
AudioRegionEditor::AudioRegionEditor (Session* s, AudioRegionView* arv)
|
||||
: RegionEditor (s, arv)
|
||||
, _arv (arv)
|
||||
, _audio_region (arv->audio_region ())
|
||||
, gain_adjustment(accurate_coefficient_to_dB(fabsf (_audio_region->scale_amplitude())), -40.0, +40.0, 0.1, 1.0, 0)
|
||||
, _polarity_toggle (_("Invert"))
|
||||
, _show_on_touch (_("Show on Touch"))
|
||||
AudioRegionEditor::AudioRegionEditor (Session* s, boost::shared_ptr<AudioRegion> r)
|
||||
: 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)
|
||||
, _peak_channel (false)
|
||||
{
|
||||
|
||||
|
@ -89,29 +84,9 @@ AudioRegionEditor::AudioRegionEditor (Session* s, AudioRegionView* arv)
|
|||
_table.attach (*b, 1, 2, _table_row, _table_row + 1, Gtk::FILL, Gtk::FILL);
|
||||
++_table_row;
|
||||
|
||||
_polarity_label.set_name ("AudioRegionEditorLabel");
|
||||
_polarity_label.set_text (_("Polarity:"));
|
||||
_polarity_label.set_alignment (1, 0.5);
|
||||
_table.attach (_polarity_label, 0, 1, _table_row, _table_row + 1, Gtk::FILL, Gtk::FILL);
|
||||
_table.attach (_polarity_toggle, 1, 2, _table_row, _table_row + 1, Gtk::FILL, Gtk::FILL);
|
||||
++_table_row;
|
||||
|
||||
_region_line_label.set_name ("AudioRegionEditorLabel");
|
||||
_region_line_label.set_text (_("Region Line:"));
|
||||
_region_line_label.set_alignment (1, 0.5);
|
||||
_table.attach (_region_line_label, 0, 1, _table_row, _table_row + 1, Gtk::FILL, Gtk::FILL);
|
||||
_table.attach (_region_line, 1, 2, _table_row, _table_row + 1, Gtk::FILL, Gtk::FILL);
|
||||
_table.attach (_show_on_touch, 2, 3, _table_row, _table_row + 1, Gtk::FILL, Gtk::FILL);
|
||||
++_table_row;
|
||||
|
||||
gain_changed ();
|
||||
refill_region_line ();
|
||||
|
||||
gain_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &AudioRegionEditor::gain_adjustment_changed));
|
||||
_polarity_toggle.signal_toggled().connect (sigc::mem_fun (*this, &AudioRegionEditor::gain_adjustment_changed));
|
||||
_show_on_touch.signal_toggled().connect (sigc::mem_fun (*this, &AudioRegionEditor::show_on_touch_changed));
|
||||
|
||||
arv->region_line_changed.connect ((sigc::mem_fun (*this, &AudioRegionEditor::refill_region_line)));
|
||||
|
||||
_peak_amplitude.property_editable() = false;
|
||||
_peak_amplitude.set_text (_("Calculating..."));
|
||||
|
@ -122,7 +97,6 @@ AudioRegionEditor::AudioRegionEditor (Session* s, AudioRegionView* arv)
|
|||
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 ()
|
||||
|
@ -146,33 +120,19 @@ AudioRegionEditor::region_changed (const PBD::PropertyChange& what_changed)
|
|||
signal_peak_thread ();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
AudioRegionEditor::region_fx_changed ()
|
||||
{
|
||||
RegionEditor::region_fx_changed ();
|
||||
refill_region_line ();
|
||||
}
|
||||
|
||||
void
|
||||
AudioRegionEditor::gain_changed ()
|
||||
{
|
||||
const gain_t scale_amplitude = _audio_region->scale_amplitude();
|
||||
|
||||
float const region_gain_dB = accurate_coefficient_to_dB (fabsf (scale_amplitude));
|
||||
float const region_gain_dB = accurate_coefficient_to_dB (_audio_region->scale_amplitude());
|
||||
if (region_gain_dB != gain_adjustment.get_value()) {
|
||||
gain_adjustment.set_value(region_gain_dB);
|
||||
}
|
||||
_polarity_toggle.set_active (scale_amplitude < 0);
|
||||
}
|
||||
|
||||
void
|
||||
AudioRegionEditor::gain_adjustment_changed ()
|
||||
{
|
||||
float gain = dB_to_coefficient (gain_adjustment.get_value());
|
||||
if (_polarity_toggle.get_active ()) {
|
||||
gain *= -1;
|
||||
}
|
||||
float const gain = dB_to_coefficient (gain_adjustment.get_value());
|
||||
if (_audio_region->scale_amplitude() != gain) {
|
||||
_audio_region->set_scale_amplitude (gain);
|
||||
}
|
||||
|
@ -215,118 +175,3 @@ AudioRegionEditor::peak_amplitude_found (double p)
|
|||
_peak_amplitude.set_text (s.str ());
|
||||
}
|
||||
|
||||
void
|
||||
AudioRegionEditor::show_touched_automation (std::weak_ptr<PBD::Controllable> wac)
|
||||
{
|
||||
if (!_arv->set_region_fx_line (wac)) {
|
||||
return;
|
||||
}
|
||||
|
||||
switch (PublicEditor::instance ().current_mouse_mode ()) {
|
||||
case Editing::MouseObject:
|
||||
case Editing::MouseTimeFX:
|
||||
case Editing::MouseGrid:
|
||||
case Editing::MouseCut:
|
||||
PublicEditor::instance ().set_mouse_mode (Editing::MouseDraw, false);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
AudioRegionEditor::show_on_touch_changed ()
|
||||
{
|
||||
if (!_show_on_touch.get_active ()) {
|
||||
_ctrl_touched_connection.disconnect ();
|
||||
return;
|
||||
}
|
||||
Controllable::ControlTouched.connect (_ctrl_touched_connection, invalidator (*this), boost::bind (&AudioRegionEditor::show_touched_automation, this, _1), gui_context ());
|
||||
}
|
||||
|
||||
void
|
||||
AudioRegionEditor::refill_region_line ()
|
||||
{
|
||||
using namespace Gtk::Menu_Helpers;
|
||||
|
||||
_region_line.clear_items ();
|
||||
|
||||
MenuList& rm_items (_region_line.items ());
|
||||
|
||||
int nth = 0;
|
||||
PBD::ID rfx_id (0);
|
||||
uint32_t param_id = 0;
|
||||
string active_text = _("Gain Envelope");
|
||||
|
||||
_arv->get_region_fx_line (rfx_id, param_id);
|
||||
_arv->set_ignore_line_change (true);
|
||||
|
||||
Gtk::RadioMenuItem::Group grp;
|
||||
AudioRegionView* arv = _arv;
|
||||
|
||||
rm_items.push_back (RadioMenuElem (grp, _("Gain Envelope")));
|
||||
Gtk::CheckMenuItem* cmi = static_cast<Gtk::CheckMenuItem*> (&rm_items.back ());
|
||||
cmi->set_active (rfx_id == 0 || param_id == UINT32_MAX);
|
||||
cmi->signal_activate ().connect ([cmi, arv] () { if (cmi->get_active ()) {arv->set_region_gain_line (); }});
|
||||
|
||||
_audio_region->foreach_plugin ([&rm_items, arv, &nth, &grp, &active_text, rfx_id, param_id](std::weak_ptr<RegionFxPlugin> wfx)
|
||||
{
|
||||
std::shared_ptr<RegionFxPlugin> fx (wfx.lock ());
|
||||
if (!fx) {
|
||||
return;
|
||||
}
|
||||
std::shared_ptr<Plugin> plugin = fx->plugin ();
|
||||
|
||||
Gtk::Menu* acm = manage (new Gtk::Menu);
|
||||
MenuList& acm_items (acm->items ());
|
||||
|
||||
for (size_t i = 0; i < plugin->parameter_count (); ++i) {
|
||||
if (!plugin->parameter_is_control (i) || !plugin->parameter_is_input (i)) {
|
||||
continue;
|
||||
}
|
||||
const Evoral::Parameter param (PluginAutomation, 0, i);
|
||||
std::string label = plugin->describe_parameter (param);
|
||||
if (label == X_("latency") || label == X_("hidden")) {
|
||||
continue;
|
||||
}
|
||||
std::shared_ptr<ARDOUR::AutomationControl> c (std::dynamic_pointer_cast<ARDOUR::AutomationControl> (fx->control (param)));
|
||||
if (c && c->flags () & (Controllable::HiddenControl | Controllable::NotAutomatable)) {
|
||||
continue;
|
||||
}
|
||||
bool active = fx->id () == rfx_id && param_id == i;
|
||||
|
||||
acm_items.push_back (RadioMenuElem (grp, label));
|
||||
Gtk::CheckMenuItem* cmi = static_cast<Gtk::CheckMenuItem*> (&acm_items.back ());
|
||||
cmi->set_active (active);
|
||||
cmi->signal_activate ().connect ([cmi, arv, nth, i] () { if (cmi->get_active ()) {arv->set_region_fx_line (nth, i); }});
|
||||
if (active) {
|
||||
active_text = fx->name () + ": " + label;
|
||||
}
|
||||
}
|
||||
|
||||
if (!acm_items.empty ()) {
|
||||
rm_items.push_back (MenuElem (fx->name (), *acm));
|
||||
} else {
|
||||
delete acm;
|
||||
}
|
||||
++nth;
|
||||
});
|
||||
|
||||
|
||||
if (rm_items.size () > 1) {
|
||||
_show_on_touch.set_sensitive (true);
|
||||
} else {
|
||||
_show_on_touch.set_active (false);
|
||||
_show_on_touch.set_sensitive (false);
|
||||
}
|
||||
|
||||
_region_line.set_text (active_text);
|
||||
_arv->set_ignore_line_change (false);
|
||||
}
|
||||
|
||||
void
|
||||
AudioRegionEditor::on_unmap ()
|
||||
{
|
||||
_show_on_touch.set_active (false);
|
||||
ArdourDialog::on_unmap ();
|
||||
}
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
#include <gtkmm/label.h>
|
||||
#include <gtkmm/entry.h>
|
||||
#include <gtkmm/box.h>
|
||||
#include <gtkmm/checkbutton.h>
|
||||
#include <gtkmm/togglebutton.h>
|
||||
#include <gtkmm/button.h>
|
||||
#include <gtkmm/arrow.h>
|
||||
#include <gtkmm/frame.h>
|
||||
|
@ -37,7 +37,6 @@
|
|||
#include <gtkmm/separator.h>
|
||||
#include <gtkmm/spinbutton.h>
|
||||
|
||||
#include "widgets/ardour_dropdown.h"
|
||||
|
||||
#include "pbd/signals.h"
|
||||
#include "pbd/crossthread.h"
|
||||
|
@ -56,43 +55,27 @@ class AudioRegionView;
|
|||
class AudioRegionEditor : public RegionEditor
|
||||
{
|
||||
public:
|
||||
AudioRegionEditor (ARDOUR::Session*, AudioRegionView*);
|
||||
AudioRegionEditor (ARDOUR::Session*, boost::shared_ptr<ARDOUR::AudioRegion>);
|
||||
~AudioRegionEditor ();
|
||||
|
||||
void peak_amplitude_thread ();
|
||||
void on_unmap ();
|
||||
|
||||
private:
|
||||
|
||||
void region_changed (PBD::PropertyChange const &);
|
||||
void region_fx_changed ();
|
||||
|
||||
void gain_changed ();
|
||||
void gain_adjustment_changed ();
|
||||
|
||||
void refill_region_line ();
|
||||
void show_on_touch_changed ();
|
||||
void show_touched_automation (std::weak_ptr<PBD::Controllable>);
|
||||
boost::shared_ptr<ARDOUR::AudioRegion> _audio_region;
|
||||
|
||||
AudioRegionView* _arv;
|
||||
std::shared_ptr<ARDOUR::AudioRegion> _audio_region;
|
||||
|
||||
Gtk::Label gain_label;
|
||||
Gtk::Label gain_label;
|
||||
Gtk::Adjustment gain_adjustment;
|
||||
Gtk::SpinButton gain_entry;
|
||||
|
||||
Gtk::Label _polarity_label;
|
||||
Gtk::CheckButton _polarity_toggle;
|
||||
|
||||
Gtk::Label _peak_amplitude_label;
|
||||
Gtk::Entry _peak_amplitude;
|
||||
|
||||
Gtk::Label _region_line_label;
|
||||
ArdourWidgets::ArdourDropdown _region_line;
|
||||
|
||||
Gtk::CheckButton _show_on_touch;
|
||||
PBD::ScopedConnection _ctrl_touched_connection;
|
||||
|
||||
void signal_peak_thread ();
|
||||
pthread_t _peak_amplitude_thread_handle;
|
||||
void peak_amplitude_found (double);
|
||||
|
|
|
@ -117,7 +117,7 @@ RegionPropertiesBox::set_session (Session* s)
|
|||
}
|
||||
|
||||
void
|
||||
RegionPropertiesBox::set_region (std::shared_ptr<Region> r)
|
||||
RegionPropertiesBox::set_region (boost::shared_ptr<Region> r)
|
||||
{
|
||||
set_session (&r->session ());
|
||||
|
||||
|
@ -163,9 +163,9 @@ AudioRegionPropertiesBox::AudioRegionPropertiesBox ()
|
|||
|
||||
label = manage (new Gtk::Label (_("Fades:")));
|
||||
label->set_alignment (1.0, 0.5);
|
||||
fade_in_enable_button.set_text (S_("Fade|In"));
|
||||
fade_in_enable_button.set_text (_("In"));
|
||||
fade_in_enable_button.set_name ("generic button");
|
||||
fade_out_enable_button.set_text (S_("Fade|Out"));
|
||||
fade_out_enable_button.set_text (_("Out"));
|
||||
fade_out_enable_button.set_name ("generic button");
|
||||
audio_t->attach (*label, 0, 1, row, row + 1, Gtk::FILL, Gtk::SHRINK);
|
||||
audio_t->attach (fade_in_enable_button, 1, 2, row, row + 1, Gtk::FILL, Gtk::SHRINK);
|
||||
|
@ -191,7 +191,7 @@ AudioRegionPropertiesBox::~AudioRegionPropertiesBox ()
|
|||
}
|
||||
|
||||
void
|
||||
AudioRegionPropertiesBox::set_region (std::shared_ptr<Region> r)
|
||||
AudioRegionPropertiesBox::set_region (boost::shared_ptr<Region> r)
|
||||
{
|
||||
RegionPropertiesBox::set_region (r);
|
||||
}
|
||||
|
|
|
@ -47,12 +47,12 @@ public:
|
|||
RegionPropertiesBox ();
|
||||
~RegionPropertiesBox ();
|
||||
|
||||
virtual void set_region (std::shared_ptr<ARDOUR::Region>);
|
||||
virtual void set_region (boost::shared_ptr<ARDOUR::Region>);
|
||||
|
||||
void set_session (ARDOUR::Session* s);
|
||||
|
||||
protected:
|
||||
std::shared_ptr<ARDOUR::Region> _region;
|
||||
boost::shared_ptr<ARDOUR::Region> _region;
|
||||
|
||||
Gtk::Label _header_label;
|
||||
|
||||
|
@ -78,7 +78,7 @@ public:
|
|||
AudioRegionPropertiesBox ();
|
||||
~AudioRegionPropertiesBox ();
|
||||
|
||||
virtual void set_region (std::shared_ptr<ARDOUR::Region>);
|
||||
virtual void set_region (boost::shared_ptr<ARDOUR::Region>);
|
||||
|
||||
private:
|
||||
ArdourWidgets::ArdourButton fade_in_enable_button;
|
||||
|
|
|
@ -36,7 +36,6 @@
|
|||
#include "ardour/audioregion.h"
|
||||
#include "ardour/audiosource.h"
|
||||
#include "ardour/profile.h"
|
||||
#include "ardour/region_fx_plugin.h"
|
||||
#include "ardour/session.h"
|
||||
|
||||
#include "pbd/memento_command.h"
|
||||
|
@ -64,7 +63,6 @@
|
|||
#include "public_editor.h"
|
||||
#include "audio_region_editor.h"
|
||||
#include "audio_streamview.h"
|
||||
#include "mergeable_line.h"
|
||||
#include "region_gain_line.h"
|
||||
#include "control_point.h"
|
||||
#include "ghostregion.h"
|
||||
|
@ -113,7 +111,8 @@ static Cairo::RefPtr<Cairo::Pattern> create_pending_peak_pattern() {
|
|||
return p;
|
||||
}
|
||||
|
||||
AudioRegionView::AudioRegionView (ArdourCanvas::Container *parent, RouteTimeAxisView &tv, std::shared_ptr<AudioRegion> r, double spu, uint32_t basic_color)
|
||||
AudioRegionView::AudioRegionView (ArdourCanvas::Container *parent, RouteTimeAxisView &tv, boost::shared_ptr<AudioRegion> r, double spu,
|
||||
uint32_t basic_color)
|
||||
: RegionView (parent, tv, r, spu, basic_color)
|
||||
, fade_in_handle(0)
|
||||
, fade_out_handle(0)
|
||||
|
@ -129,13 +128,10 @@ AudioRegionView::AudioRegionView (ArdourCanvas::Container *parent, RouteTimeAxis
|
|||
, _amplitude_above_axis(1.0)
|
||||
, trim_fade_in_drag_active(false)
|
||||
, trim_fade_out_drag_active(false)
|
||||
, _rfx_id (0)
|
||||
, _rdx_param (UINT32_MAX)
|
||||
, _ignore_line_change (false)
|
||||
{
|
||||
}
|
||||
|
||||
AudioRegionView::AudioRegionView (ArdourCanvas::Container *parent, RouteTimeAxisView &tv, std::shared_ptr<AudioRegion> r, double spu,
|
||||
AudioRegionView::AudioRegionView (ArdourCanvas::Container *parent, RouteTimeAxisView &tv, boost::shared_ptr<AudioRegion> r, double spu,
|
||||
uint32_t basic_color, bool recording, TimeAxisViewItem::Visibility visibility)
|
||||
: RegionView (parent, tv, r, spu, basic_color, recording, visibility)
|
||||
, fade_in_handle(0)
|
||||
|
@ -152,14 +148,11 @@ AudioRegionView::AudioRegionView (ArdourCanvas::Container *parent, RouteTimeAxis
|
|||
, _amplitude_above_axis(1.0)
|
||||
, trim_fade_in_drag_active(false)
|
||||
, trim_fade_out_drag_active(false)
|
||||
, _rfx_id (0)
|
||||
, _rdx_param (UINT32_MAX)
|
||||
, _ignore_line_change (false)
|
||||
{
|
||||
}
|
||||
|
||||
AudioRegionView::AudioRegionView (const AudioRegionView& other, std::shared_ptr<AudioRegion> other_region)
|
||||
: RegionView (other, std::shared_ptr<Region> (other_region))
|
||||
AudioRegionView::AudioRegionView (const AudioRegionView& other, boost::shared_ptr<AudioRegion> other_region)
|
||||
: RegionView (other, boost::shared_ptr<Region> (other_region))
|
||||
, fade_in_handle(0)
|
||||
, fade_out_handle(0)
|
||||
, fade_in_trim_handle(0)
|
||||
|
@ -174,9 +167,6 @@ AudioRegionView::AudioRegionView (const AudioRegionView& other, std::shared_ptr<
|
|||
, _amplitude_above_axis (other._amplitude_above_axis)
|
||||
, trim_fade_in_drag_active(false)
|
||||
, trim_fade_out_drag_active(false)
|
||||
, _rfx_id (0)
|
||||
, _rdx_param (UINT32_MAX)
|
||||
, _ignore_line_change (false)
|
||||
{
|
||||
init (true);
|
||||
}
|
||||
|
@ -241,7 +231,12 @@ AudioRegionView::init (bool wfd)
|
|||
set_fade_visibility (false);
|
||||
}
|
||||
|
||||
set_region_gain_line ();
|
||||
const string line_name = _region->name() + ":gain";
|
||||
|
||||
gain_line.reset (new AudioRegionGainLine (line_name, *this, *group, audio_region()->envelope()));
|
||||
|
||||
update_envelope_visibility ();
|
||||
gain_line->reset ();
|
||||
|
||||
/* streamview will call set_height() */
|
||||
//set_height (trackview.current_height()); // XXX not correct for Layered mode, but set_height() will fix later.
|
||||
|
@ -281,9 +276,6 @@ AudioRegionView::init (bool wfd)
|
|||
|
||||
setup_waveform_visibility ();
|
||||
|
||||
get_canvas_frame()->set_data ("linemerger", (LineMerger*) this);
|
||||
_fx_line->canvas_group().raise_to_top ();
|
||||
|
||||
/* XXX sync mark drag? */
|
||||
}
|
||||
|
||||
|
@ -305,11 +297,11 @@ AudioRegionView::~AudioRegionView ()
|
|||
/* all waveviews etc will be destroyed when the group is destroyed */
|
||||
}
|
||||
|
||||
std::shared_ptr<ARDOUR::AudioRegion>
|
||||
boost::shared_ptr<ARDOUR::AudioRegion>
|
||||
AudioRegionView::audio_region() const
|
||||
{
|
||||
// "Guaranteed" to succeed...
|
||||
return std::dynamic_pointer_cast<AudioRegion>(_region);
|
||||
return boost::dynamic_pointer_cast<AudioRegion>(_region);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -380,30 +372,6 @@ AudioRegionView::fade_out_active_changed ()
|
|||
}
|
||||
}
|
||||
|
||||
uint32_t
|
||||
AudioRegionView::get_fill_color () const
|
||||
{
|
||||
Gtkmm2ext::Color c;
|
||||
const bool opaque = _region->opaque() || trackview.layer_display () == Stacked;
|
||||
|
||||
if (_selected) {
|
||||
c = UIConfiguration::instance().color ("selected region base");
|
||||
} else if (_recregion) {
|
||||
return UIConfiguration::instance().color ("recording rect");
|
||||
} else if (!UIConfiguration::instance().get_color_regions_using_track_color()) {
|
||||
c = UIConfiguration::instance().color (fill_color_name);
|
||||
} else {
|
||||
c = fill_color;
|
||||
}
|
||||
|
||||
if (opaque && ( !_dragging && !_region->muted () )) {
|
||||
return c;
|
||||
} else if (_dragging) {
|
||||
return UIConfiguration::instance().color_mod (c, "dragging region");
|
||||
} else {
|
||||
return Gtkmm2ext::HSV(c).mod (UIConfiguration::instance().modifier ("transparent region base")).color ();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
AudioRegionView::region_scale_amplitude_changed ()
|
||||
|
@ -423,11 +391,10 @@ AudioRegionView::region_renamed ()
|
|||
str = string ("*") + str;
|
||||
}
|
||||
|
||||
std::shared_ptr<AudioRegion> ar (audio_region());
|
||||
const gain_t scale_amplitude = ar->scale_amplitude();
|
||||
if (scale_amplitude != 1.0) {
|
||||
boost::shared_ptr<AudioRegion> ar (audio_region());
|
||||
if (ar->scale_amplitude() != 1.0) {
|
||||
char tmp[32];
|
||||
snprintf (tmp, 32, " (%.1fdB%s)", accurate_coefficient_to_dB (fabsf (scale_amplitude)), scale_amplitude < 0 ? " Ø" : "");
|
||||
snprintf (tmp, 32, " (%.1fdB)", accurate_coefficient_to_dB (ar->scale_amplitude()));
|
||||
str += tmp;
|
||||
}
|
||||
|
||||
|
@ -610,15 +577,15 @@ AudioRegionView::set_height (gdouble height)
|
|||
}
|
||||
}
|
||||
|
||||
if (_fx_line) {
|
||||
if (gain_line) {
|
||||
|
||||
if ((height / nchans) < NAME_HIGHLIGHT_THRESH) {
|
||||
_fx_line->hide ();
|
||||
gain_line->hide ();
|
||||
} else {
|
||||
update_envelope_visibility ();
|
||||
}
|
||||
|
||||
_fx_line->set_height ((uint32_t) rint (height - NAME_HIGHLIGHT_SIZE) - 2);
|
||||
gain_line->set_height ((uint32_t) rint (height - NAME_HIGHLIGHT_SIZE) - 2);
|
||||
}
|
||||
|
||||
reset_fade_shapes ();
|
||||
|
@ -659,7 +626,7 @@ AudioRegionView::reset_fade_in_shape ()
|
|||
}
|
||||
|
||||
void
|
||||
AudioRegionView::reset_fade_in_shape_width (std::shared_ptr<AudioRegion> ar, samplecnt_t width, bool drag_active)
|
||||
AudioRegionView::reset_fade_in_shape_width (boost::shared_ptr<AudioRegion> ar, samplecnt_t width, bool drag_active)
|
||||
{
|
||||
trim_fade_in_drag_active = drag_active;
|
||||
if (fade_in_handle == 0) {
|
||||
|
@ -710,7 +677,7 @@ AudioRegionView::reset_fade_in_shape_width (std::shared_ptr<AudioRegion> ar, sam
|
|||
|
||||
Points points;
|
||||
Points::size_type pi;
|
||||
std::shared_ptr<const Evoral::ControlList> list (audio_region()->fade_in());
|
||||
boost::shared_ptr<const Evoral::ControlList> list (audio_region()->fade_in());
|
||||
Evoral::ControlList::const_iterator x;
|
||||
samplecnt_t length = list->length().samples();
|
||||
|
||||
|
@ -739,7 +706,7 @@ AudioRegionView::reset_fade_out_shape ()
|
|||
}
|
||||
|
||||
void
|
||||
AudioRegionView::reset_fade_out_shape_width (std::shared_ptr<AudioRegion> ar, samplecnt_t width, bool drag_active)
|
||||
AudioRegionView::reset_fade_out_shape_width (boost::shared_ptr<AudioRegion> ar, samplecnt_t width, bool drag_active)
|
||||
{
|
||||
trim_fade_out_drag_active = drag_active;
|
||||
if (fade_out_handle == 0) {
|
||||
|
@ -797,7 +764,7 @@ AudioRegionView::reset_fade_out_shape_width (std::shared_ptr<AudioRegion> ar, sa
|
|||
|
||||
Points points;
|
||||
Points::size_type pi;
|
||||
std::shared_ptr<const Evoral::ControlList> list (audio_region()->fade_out());
|
||||
boost::shared_ptr<const Evoral::ControlList> list (audio_region()->fade_out());
|
||||
Evoral::ControlList::const_iterator x;
|
||||
double length = list->length().samples();
|
||||
|
||||
|
@ -835,7 +802,7 @@ AudioRegionView::get_fade_out_shape_width ()
|
|||
void
|
||||
AudioRegionView::redraw_start_xfade ()
|
||||
{
|
||||
std::shared_ptr<AudioRegion> ar (audio_region());
|
||||
boost::shared_ptr<AudioRegion> ar (audio_region());
|
||||
|
||||
if (!ar->fade_in() || ar->fade_in()->empty()) {
|
||||
return;
|
||||
|
@ -846,7 +813,7 @@ AudioRegionView::redraw_start_xfade ()
|
|||
}
|
||||
|
||||
void
|
||||
AudioRegionView::redraw_start_xfade_to (std::shared_ptr<AudioRegion> ar, samplecnt_t /*width*/, Points& points, double effective_height,
|
||||
AudioRegionView::redraw_start_xfade_to (boost::shared_ptr<AudioRegion> ar, samplecnt_t /*width*/, Points& points, double effective_height,
|
||||
double rect_width)
|
||||
{
|
||||
if (points.size() < 2) {
|
||||
|
@ -874,7 +841,7 @@ AudioRegionView::redraw_start_xfade_to (std::shared_ptr<AudioRegion> ar, samplec
|
|||
|
||||
/* fade out line */
|
||||
|
||||
std::shared_ptr<AutomationList> inverse = ar->inverse_fade_in ();
|
||||
boost::shared_ptr<AutomationList> inverse = ar->inverse_fade_in ();
|
||||
Points ipoints;
|
||||
Points::size_type npoints;
|
||||
|
||||
|
@ -924,7 +891,7 @@ AudioRegionView::redraw_start_xfade_to (std::shared_ptr<AudioRegion> ar, samplec
|
|||
void
|
||||
AudioRegionView::redraw_end_xfade ()
|
||||
{
|
||||
std::shared_ptr<AudioRegion> ar (audio_region());
|
||||
boost::shared_ptr<AudioRegion> ar (audio_region());
|
||||
|
||||
if (!ar->fade_out() || ar->fade_out()->empty()) {
|
||||
return;
|
||||
|
@ -936,7 +903,7 @@ AudioRegionView::redraw_end_xfade ()
|
|||
}
|
||||
|
||||
void
|
||||
AudioRegionView::redraw_end_xfade_to (std::shared_ptr<AudioRegion> ar, samplecnt_t width, Points& points, double effective_height,
|
||||
AudioRegionView::redraw_end_xfade_to (boost::shared_ptr<AudioRegion> ar, samplecnt_t width, Points& points, double effective_height,
|
||||
double rect_edge, double rect_width)
|
||||
{
|
||||
if (points.size() < 2) {
|
||||
|
@ -965,7 +932,7 @@ AudioRegionView::redraw_end_xfade_to (std::shared_ptr<AudioRegion> ar, samplecnt
|
|||
|
||||
/* fade in line */
|
||||
|
||||
std::shared_ptr<AutomationList> inverse = ar->inverse_fade_out ();
|
||||
boost::shared_ptr<AutomationList> inverse = ar->inverse_fade_out ();
|
||||
Points ipoints;
|
||||
Points::size_type npoints;
|
||||
|
||||
|
@ -1085,8 +1052,8 @@ AudioRegionView::set_samples_per_pixel (gdouble fpp)
|
|||
}
|
||||
}
|
||||
|
||||
if (_fx_line) {
|
||||
_fx_line->reset ();
|
||||
if (gain_line) {
|
||||
gain_line->reset ();
|
||||
}
|
||||
|
||||
reset_fade_shapes ();
|
||||
|
@ -1105,7 +1072,12 @@ AudioRegionView::set_colors ()
|
|||
{
|
||||
RegionView::set_colors();
|
||||
|
||||
set_fx_line_colors ();
|
||||
if (gain_line) {
|
||||
gain_line->set_line_color (audio_region()->envelope_active() ?
|
||||
UIConfiguration::instance().color ("gain line") :
|
||||
UIConfiguration::instance().color_mod ("gain line inactive", "gain line inactive"));
|
||||
}
|
||||
|
||||
set_waveform_colors ();
|
||||
|
||||
if (start_xfade_curve) {
|
||||
|
@ -1147,8 +1119,8 @@ AudioRegionView::setup_waveform_visibility ()
|
|||
void
|
||||
AudioRegionView::temporarily_hide_envelope ()
|
||||
{
|
||||
if (_fx_line) {
|
||||
_fx_line->hide ();
|
||||
if (gain_line) {
|
||||
gain_line->hide ();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1158,121 +1130,21 @@ AudioRegionView::unhide_envelope ()
|
|||
update_envelope_visibility ();
|
||||
}
|
||||
|
||||
void
|
||||
AudioRegionView::set_region_gain_line ()
|
||||
{
|
||||
if (_ignore_line_change) {
|
||||
return;
|
||||
}
|
||||
const string line_name = _region->name() + ":gain";
|
||||
_fx_line.reset (new AudioRegionGainLine (line_name, *this, *group, audio_region()->envelope()));
|
||||
_fx_line->set_height ((uint32_t) rint (height() - NAME_HIGHLIGHT_SIZE) - 2);
|
||||
_fx_line->reset ();
|
||||
_region_fx_connection.disconnect ();
|
||||
bool changed = _rfx_id != PBD::ID (0) || _rdx_param != UINT32_MAX;
|
||||
_rfx_id = PBD::ID (0);
|
||||
_rdx_param = UINT32_MAX;
|
||||
|
||||
envelope_active_changed ();
|
||||
if (changed) {
|
||||
region_line_changed (); /* EMIT SIGNAL */
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
AudioRegionView::set_region_fx_line (std::shared_ptr<AutomationControl> ac, std::shared_ptr<RegionFxPlugin> rfx, uint32_t param_id)
|
||||
{
|
||||
const string line_name = _region->name () + ":" + rfx->describe_parameter (Evoral::Parameter (PluginAutomation, 0, param_id));
|
||||
_fx_line.reset (new RegionFxLine (line_name, *this, *group, ac));
|
||||
_fx_line->set_height ((uint32_t) rint (height() - NAME_HIGHLIGHT_SIZE) - 2);
|
||||
_fx_line->reset ();
|
||||
|
||||
rfx->DropReferences.connect (_region_fx_connection, invalidator (*this), boost::bind (&AudioRegionView::set_region_gain_line, this), gui_context ());
|
||||
|
||||
bool changed = _rfx_id != rfx->id () || _rdx_param != param_id;
|
||||
_rfx_id = rfx->id ();
|
||||
_rdx_param = param_id;
|
||||
|
||||
envelope_active_changed ();
|
||||
if (changed) {
|
||||
region_line_changed (); /* EMIT SIGNAL */
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
AudioRegionView::set_region_fx_line (uint32_t plugin_id, uint32_t param_id)
|
||||
{
|
||||
if (_ignore_line_change) {
|
||||
return false;
|
||||
}
|
||||
std::shared_ptr<RegionFxPlugin> rfx = _region->nth_plugin (plugin_id);
|
||||
if (rfx) {
|
||||
std::shared_ptr<Evoral::Control> c = rfx->control (Evoral::Parameter (PluginAutomation, 0, param_id));
|
||||
std::shared_ptr<AutomationControl> ac = std::dynamic_pointer_cast<AutomationControl> (c);
|
||||
if (ac) {
|
||||
set_region_fx_line (ac, rfx, param_id);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
AudioRegionView::set_region_fx_line (std::weak_ptr<PBD::Controllable> wac)
|
||||
{
|
||||
if (_ignore_line_change) {
|
||||
return false;
|
||||
}
|
||||
std::shared_ptr<AutomationControl> ac = std::dynamic_pointer_cast<AutomationControl> (wac.lock ());
|
||||
if (!ac) {
|
||||
return false;
|
||||
}
|
||||
bool found = false;
|
||||
_region->foreach_plugin ([this, ac, &found](std::weak_ptr<RegionFxPlugin> wfx)
|
||||
{
|
||||
std::shared_ptr<RegionFxPlugin> rfx (wfx.lock ());
|
||||
if (!rfx || found) {
|
||||
return;
|
||||
}
|
||||
std::shared_ptr<Plugin> plugin = rfx->plugin ();
|
||||
for (size_t i = 0; i < plugin->parameter_count (); ++i) {
|
||||
if (!plugin->parameter_is_control (i) || !plugin->parameter_is_input (i)) {
|
||||
continue;
|
||||
}
|
||||
const Evoral::Parameter param (PluginAutomation, 0, i);
|
||||
if (ac == std::dynamic_pointer_cast<ARDOUR::AutomationControl> (rfx->control (param))) {
|
||||
set_region_fx_line (ac, rfx, i);
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
return found;
|
||||
}
|
||||
|
||||
bool
|
||||
AudioRegionView::get_region_fx_line (PBD::ID& id, uint32_t& param_id)
|
||||
{
|
||||
id = _rfx_id;
|
||||
param_id = _rdx_param;
|
||||
return _rdx_param != UINT32_MAX && _rfx_id != 0;
|
||||
}
|
||||
|
||||
void
|
||||
AudioRegionView::update_envelope_visibility ()
|
||||
{
|
||||
if (!_fx_line) {
|
||||
if (!gain_line) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (trackview.editor().current_mouse_mode() == Editing::MouseDraw || trackview.editor().current_mouse_mode() == Editing::MouseContent ) {
|
||||
_fx_line->set_visibility (AutomationLine::VisibleAspects(AutomationLine::ControlPoints|AutomationLine::Line));
|
||||
_fx_line->canvas_group().raise_to_top ();
|
||||
gain_line->set_visibility (AutomationLine::VisibleAspects(AutomationLine::ControlPoints|AutomationLine::Line));
|
||||
gain_line->canvas_group().raise_to_top ();
|
||||
} else if (UIConfiguration::instance().get_show_region_gain() || trackview.editor().current_mouse_mode() == Editing::MouseRange ) {
|
||||
_fx_line->set_visibility (AutomationLine::VisibleAspects(AutomationLine::Line));
|
||||
_fx_line->canvas_group().raise_to_top ();
|
||||
gain_line->set_visibility (AutomationLine::VisibleAspects(AutomationLine::Line));
|
||||
gain_line->canvas_group().raise_to_top ();
|
||||
} else {
|
||||
_fx_line->set_visibility (AutomationLine::VisibleAspects(0));
|
||||
gain_line->set_visibility (AutomationLine::VisibleAspects(0));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1473,7 +1345,7 @@ AudioRegionView::peaks_ready_handler (uint32_t which)
|
|||
void
|
||||
AudioRegionView::add_gain_point_event (ArdourCanvas::Item *item, GdkEvent *ev, bool with_guard_points)
|
||||
{
|
||||
if (!_fx_line) {
|
||||
if (!gain_line) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1485,17 +1357,18 @@ AudioRegionView::add_gain_point_event (ArdourCanvas::Item *item, GdkEvent *ev, b
|
|||
|
||||
samplecnt_t const sample_within_region = (samplecnt_t) floor (mx * samples_per_pixel);
|
||||
|
||||
double y = my;
|
||||
|
||||
if (_fx_line->control_points_adjacent (sample_within_region, before_p, after_p)) {
|
||||
/* y is in item frame */
|
||||
double const bx = _fx_line->nth (before_p)->get_x();
|
||||
double const ax = _fx_line->nth (after_p)->get_x();
|
||||
double const click_ratio = (ax - mx) / (ax - bx);
|
||||
|
||||
y = ((_fx_line->nth (before_p)->get_y() * click_ratio) + (_fx_line->nth (after_p)->get_y() * (1 - click_ratio)));
|
||||
if (!gain_line->control_points_adjacent (sample_within_region, before_p, after_p)) {
|
||||
/* no adjacent points */
|
||||
return;
|
||||
}
|
||||
|
||||
/* y is in item frame */
|
||||
double const bx = gain_line->nth (before_p)->get_x();
|
||||
double const ax = gain_line->nth (after_p)->get_x();
|
||||
double const click_ratio = (ax - mx) / (ax - bx);
|
||||
|
||||
double y = ((gain_line->nth (before_p)->get_y() * click_ratio) + (gain_line->nth (after_p)->get_y() * (1 - click_ratio)));
|
||||
|
||||
/* don't create points that can't be seen */
|
||||
|
||||
update_envelope_visibility ();
|
||||
|
@ -1510,37 +1383,55 @@ AudioRegionView::add_gain_point_event (ArdourCanvas::Item *item, GdkEvent *ev, b
|
|||
|
||||
/* compute vertical fractional position */
|
||||
|
||||
y = 1.0 - (y / (_fx_line->height()));
|
||||
y = 1.0 - (y / (gain_line->height()));
|
||||
|
||||
/* map using gain line */
|
||||
|
||||
_fx_line->view_to_model_coord_y (y);
|
||||
gain_line->view_to_model_coord_y (y);
|
||||
|
||||
/* XXX STATEFUL: can't convert to stateful diff until we
|
||||
can represent automation data with it.
|
||||
*/
|
||||
|
||||
XMLNode &before = _fx_line->the_list()->get_state();
|
||||
if (_fx_line->the_list()->editor_add (timepos_t (fx), y, with_guard_points)) {
|
||||
XMLNode &after = _fx_line->the_list()->get_state();
|
||||
XMLNode &before = audio_region()->envelope()->get_state();
|
||||
MementoCommand<AudioRegion>* region_memento = 0;
|
||||
|
||||
if (!audio_region()->envelope_active()) {
|
||||
XMLNode ®ion_before = audio_region()->get_state();
|
||||
audio_region()->set_envelope_active(true);
|
||||
XMLNode ®ion_after = audio_region()->get_state();
|
||||
region_memento = new MementoCommand<AudioRegion>(*(audio_region().get()), ®ion_before, ®ion_after);
|
||||
}
|
||||
|
||||
if (audio_region()->envelope()->editor_add (timepos_t (fx), y, with_guard_points)) {
|
||||
XMLNode &after = audio_region()->envelope()->get_state();
|
||||
std::list<Selectable*> results;
|
||||
|
||||
trackview.editor().begin_reversible_command (_("add gain control point"));
|
||||
|
||||
_fx_line->enable_autoation ();
|
||||
if (region_memento) {
|
||||
trackview.session()->add_command (region_memento);
|
||||
}
|
||||
|
||||
trackview.session()->add_command (new MementoCommand<AutomationList>(*_fx_line->the_list(), &before, &after));
|
||||
trackview.session()->add_command (new MementoCommand<AutomationList>(*audio_region()->envelope().get(), &before, &after));
|
||||
|
||||
_fx_line->get_selectables (region ()->position () + timecnt_t (fx), region ()->position () + timecnt_t (fx), 0.0, 1.0, results);
|
||||
gain_line->get_selectables (region ()->position () + timecnt_t (fx), region ()->position () + timecnt_t (fx), 0.0, 1.0, results);
|
||||
trackview.editor ().get_selection ().set (results);
|
||||
|
||||
trackview.editor ().commit_reversible_command ();
|
||||
trackview.session ()->set_dirty ();
|
||||
} else {
|
||||
delete &before;
|
||||
delete region_memento;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
AudioRegionView::remove_gain_point_event (ArdourCanvas::Item *item, GdkEvent* /*ev*/)
|
||||
{
|
||||
ControlPoint *cp = reinterpret_cast<ControlPoint *> (item->get_data ("control_point"));
|
||||
audio_region()->envelope()->erase (cp->model());
|
||||
}
|
||||
|
||||
GhostRegion*
|
||||
AudioRegionView::add_ghost (TimeAxisView& tv)
|
||||
{
|
||||
|
@ -1604,7 +1495,7 @@ AudioRegionView::entered ()
|
|||
fade_out_handle->raise_to_top ();
|
||||
}
|
||||
if (fade_in_trim_handle) {
|
||||
std::shared_ptr<AudioRegion> ar (audio_region());
|
||||
boost::shared_ptr<AudioRegion> ar (audio_region());
|
||||
if (!ar->locked() && (ar->fade_in()->back()->when > 64 || (ar->can_trim() & Trimmable::FrontTrimEarlier))) {
|
||||
fade_in_trim_handle->show ();
|
||||
fade_in_trim_handle->raise_to_top ();
|
||||
|
@ -1613,7 +1504,7 @@ AudioRegionView::entered ()
|
|||
}
|
||||
}
|
||||
if (fade_out_trim_handle) {
|
||||
std::shared_ptr<AudioRegion> ar (audio_region());
|
||||
boost::shared_ptr<AudioRegion> ar (audio_region());
|
||||
if (!ar->locked() && (ar->fade_out()->back()->when > 64 || (ar->can_trim() & Trimmable::EndTrimLater))) {
|
||||
fade_out_trim_handle->show ();
|
||||
fade_out_trim_handle->raise_to_top ();
|
||||
|
@ -1634,8 +1525,12 @@ AudioRegionView::entered ()
|
|||
void
|
||||
AudioRegionView::exited ()
|
||||
{
|
||||
trackview.editor().set_current_trimmable (std::shared_ptr<Trimmable>());
|
||||
trackview.editor().set_current_movable (std::shared_ptr<Movable>());
|
||||
trackview.editor().set_current_trimmable (boost::shared_ptr<Trimmable>());
|
||||
trackview.editor().set_current_movable (boost::shared_ptr<Movable>());
|
||||
|
||||
// if (gain_line) {
|
||||
// gain_line->remove_visibility (AutomationLine::ControlPoints);
|
||||
// }
|
||||
|
||||
if (fade_in_handle) { fade_in_handle->hide(); }
|
||||
if (fade_out_handle) { fade_out_handle->hide(); }
|
||||
|
@ -1648,8 +1543,12 @@ AudioRegionView::exited ()
|
|||
void
|
||||
AudioRegionView::envelope_active_changed ()
|
||||
{
|
||||
set_fx_line_colors ();
|
||||
update_envelope_visibility ();
|
||||
if (gain_line) {
|
||||
gain_line->set_line_color (audio_region()->envelope_active() ?
|
||||
UIConfiguration::instance().color ("gain line") :
|
||||
UIConfiguration::instance().color_mod ("gain line inactive", "gain line inactive"));
|
||||
update_envelope_visibility ();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -1667,22 +1566,6 @@ AudioRegionView::color_handler ()
|
|||
|
||||
}
|
||||
|
||||
void
|
||||
AudioRegionView::set_fx_line_colors ()
|
||||
{
|
||||
if (!_fx_line) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (_rdx_param != UINT32_MAX && _rfx_id != 0) {
|
||||
_fx_line->set_line_color ("region automation line");
|
||||
} else if (audio_region()->envelope_active()) {
|
||||
_fx_line->set_line_color ("gain line");
|
||||
} else {
|
||||
_fx_line->set_line_color ("gain line inactive", "gain line inactive");
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
AudioRegionView::set_waveform_colors ()
|
||||
{
|
||||
|
@ -1705,18 +1588,18 @@ AudioRegionView::set_some_waveform_colors (vector<ArdourWaveView::WaveView*>& wa
|
|||
/* set outline */
|
||||
outline = UIConfiguration::instance().color ("waveform outline");
|
||||
|
||||
if (_dragging) {
|
||||
outline = UINT_RGBA_CHANGE_A(outline, 0xC0);
|
||||
fill = UINT_RGBA_CHANGE_A(fill, 0xC0);
|
||||
} else if (_selected) {
|
||||
if (_selected) {
|
||||
outline = UINT_RGBA_CHANGE_A(UIConfiguration::instance().color ("selected waveform outline"), 0xC0);
|
||||
fill = UINT_RGBA_CHANGE_A(UIConfiguration::instance().color ("selected waveform fill"), 0xC0);
|
||||
} else if (_dragging) {
|
||||
outline = UINT_RGBA_CHANGE_A(UIConfiguration::instance().color ("waveform outline"), 0xC0);
|
||||
fill = UINT_RGBA_CHANGE_A(UIConfiguration::instance().color ("waveform fill"), 0xC0);
|
||||
} else if (_region->muted()) {
|
||||
outline = UINT_RGBA_CHANGE_A(outline, 0x40);
|
||||
fill = UINT_RGBA_CHANGE_A (UINT_INTERPOLATE(fill_color, UIConfiguration::instance().color ("covered region"), 0.7), 0x40);
|
||||
} else if (!_region->opaque() && trackview.layer_display () != Stacked) {
|
||||
outline = UINT_RGBA_CHANGE_A(outline, 0x80);
|
||||
fill = UINT_RGBA_CHANGE_A(UIConfiguration::instance().color ("waveform fill"), 0x80);
|
||||
outline = UINT_RGBA_CHANGE_A(UIConfiguration::instance().color ("waveform outline"), 80);
|
||||
fill = UINT_INTERPOLATE(fill_color, UIConfiguration::instance().color ("covered region"), 0.7);
|
||||
} else if (!_region->opaque()) {
|
||||
outline = UINT_RGBA_CHANGE_A(UIConfiguration::instance().color ("waveform outline"), 70);
|
||||
fill = UINT_RGBA_CHANGE_A(UIConfiguration::instance().color ("waveform fill"), 70);
|
||||
}
|
||||
|
||||
/* recorded region, override to red */
|
||||
|
@ -1784,7 +1667,7 @@ void
|
|||
AudioRegionView::show_region_editor ()
|
||||
{
|
||||
if (editor == 0) {
|
||||
editor = new AudioRegionEditor (trackview.session(), this);
|
||||
editor = new AudioRegionEditor (trackview.session(), audio_region());
|
||||
}
|
||||
|
||||
editor->present ();
|
||||
|
@ -1942,11 +1825,3 @@ AudioRegionView::parameter_changed (string const & p)
|
|||
setup_waveform_visibility ();
|
||||
}
|
||||
}
|
||||
|
||||
MergeableLine*
|
||||
AudioRegionView::make_merger ()
|
||||
{
|
||||
return new MergeableLine (_fx_line, std::shared_ptr<AutomationControl>(),
|
||||
[this](timepos_t const& t) { return timepos_t (_region->position().distance (t)); },
|
||||
nullptr, nullptr);
|
||||
}
|
||||
|
|
|
@ -38,7 +38,6 @@
|
|||
|
||||
#include "waveview/wave_view.h"
|
||||
|
||||
#include "line_merger.h"
|
||||
#include "region_view.h"
|
||||
#include "time_axis_view_item.h"
|
||||
#include "automation_line.h"
|
||||
|
@ -50,35 +49,35 @@ namespace ARDOUR {
|
|||
};
|
||||
|
||||
class AudioTimeAxisView;
|
||||
class AudioRegionGainLine;
|
||||
class GhostRegion;
|
||||
class AutomationTimeAxisView;
|
||||
class RegionFxLine;
|
||||
class RouteTimeAxisView;
|
||||
|
||||
class AudioRegionView : public RegionView, public LineMerger
|
||||
class AudioRegionView : public RegionView
|
||||
{
|
||||
public:
|
||||
AudioRegionView (ArdourCanvas::Container *,
|
||||
RouteTimeAxisView&,
|
||||
std::shared_ptr<ARDOUR::AudioRegion>,
|
||||
boost::shared_ptr<ARDOUR::AudioRegion>,
|
||||
double initial_samples_per_pixel,
|
||||
uint32_t base_color);
|
||||
|
||||
AudioRegionView (ArdourCanvas::Container *,
|
||||
RouteTimeAxisView&,
|
||||
std::shared_ptr<ARDOUR::AudioRegion>,
|
||||
boost::shared_ptr<ARDOUR::AudioRegion>,
|
||||
double samples_per_pixel,
|
||||
uint32_t base_color,
|
||||
bool recording,
|
||||
TimeAxisViewItem::Visibility);
|
||||
|
||||
AudioRegionView (const AudioRegionView& other, std::shared_ptr<ARDOUR::AudioRegion>);
|
||||
AudioRegionView (const AudioRegionView& other, boost::shared_ptr<ARDOUR::AudioRegion>);
|
||||
|
||||
~AudioRegionView ();
|
||||
|
||||
void init (bool wait_for_data);
|
||||
|
||||
std::shared_ptr<ARDOUR::AudioRegion> audio_region() const;
|
||||
boost::shared_ptr<ARDOUR::AudioRegion> audio_region() const;
|
||||
|
||||
void create_waves ();
|
||||
void delete_waves ();
|
||||
|
@ -91,26 +90,20 @@ public:
|
|||
void temporarily_hide_envelope (); ///< Dangerous!
|
||||
void unhide_envelope (); ///< Dangerous!
|
||||
|
||||
void set_region_gain_line ();
|
||||
void set_ignore_line_change (bool v) { _ignore_line_change = v; };
|
||||
bool set_region_fx_line (uint32_t, uint32_t);
|
||||
bool set_region_fx_line (std::weak_ptr<PBD::Controllable>);
|
||||
bool get_region_fx_line (PBD::ID&, uint32_t&);
|
||||
void update_envelope_visibility ();
|
||||
|
||||
sigc::signal<void> region_line_changed;
|
||||
|
||||
void add_gain_point_event (ArdourCanvas::Item *item, GdkEvent *event, bool with_guard_points);
|
||||
void remove_gain_point_event (ArdourCanvas::Item *item, GdkEvent *event);
|
||||
|
||||
std::shared_ptr<RegionFxLine> fx_line() const { return _fx_line; }
|
||||
boost::shared_ptr<AudioRegionGainLine> get_gain_line() const { return gain_line; }
|
||||
|
||||
void region_changed (const PBD::PropertyChange&);
|
||||
void envelope_active_changed ();
|
||||
|
||||
GhostRegion* add_ghost (TimeAxisView&);
|
||||
|
||||
void reset_fade_in_shape_width (std::shared_ptr<ARDOUR::AudioRegion> ar, samplecnt_t, bool drag_active = false);
|
||||
void reset_fade_out_shape_width (std::shared_ptr<ARDOUR::AudioRegion> ar, samplecnt_t, bool drag_active = false);
|
||||
void reset_fade_in_shape_width (boost::shared_ptr<ARDOUR::AudioRegion> ar, samplecnt_t, bool drag_active = false);
|
||||
void reset_fade_out_shape_width (boost::shared_ptr<ARDOUR::AudioRegion> ar, samplecnt_t, bool drag_active = false);
|
||||
|
||||
samplepos_t get_fade_in_shape_width ();
|
||||
samplepos_t get_fade_out_shape_width ();
|
||||
|
@ -123,9 +116,6 @@ public:
|
|||
|
||||
void show_region_editor ();
|
||||
|
||||
void set_frame_color ();
|
||||
uint32_t get_fill_color () const;
|
||||
|
||||
virtual void entered ();
|
||||
virtual void exited ();
|
||||
|
||||
|
@ -134,8 +124,8 @@ public:
|
|||
void drag_start ();
|
||||
void drag_end ();
|
||||
|
||||
void redraw_start_xfade_to (std::shared_ptr<ARDOUR::AudioRegion>, samplecnt_t, ArdourCanvas::Points&, double, double);
|
||||
void redraw_end_xfade_to (std::shared_ptr<ARDOUR::AudioRegion>, samplecnt_t, ArdourCanvas::Points&, double, double, double);
|
||||
void redraw_start_xfade_to (boost::shared_ptr<ARDOUR::AudioRegion>, samplecnt_t, ArdourCanvas::Points&, double, double);
|
||||
void redraw_end_xfade_to (boost::shared_ptr<ARDOUR::AudioRegion>, samplecnt_t, ArdourCanvas::Points&, double, double, double);
|
||||
void redraw_start_xfade ();
|
||||
void redraw_end_xfade ();
|
||||
|
||||
|
@ -154,8 +144,6 @@ public:
|
|||
return _end_xfade_visible;
|
||||
}
|
||||
|
||||
MergeableLine* make_merger();
|
||||
|
||||
protected:
|
||||
|
||||
/* this constructor allows derived types
|
||||
|
@ -190,7 +178,7 @@ protected:
|
|||
ArdourCanvas::Rectangle* end_xfade_rect;
|
||||
bool _end_xfade_visible;
|
||||
|
||||
std::shared_ptr<RegionFxLine> _fx_line;
|
||||
boost::shared_ptr<AudioRegionGainLine> gain_line;
|
||||
|
||||
double _amplitude_above_axis;
|
||||
|
||||
|
@ -212,8 +200,8 @@ protected:
|
|||
|
||||
void set_colors ();
|
||||
void set_waveform_colors ();
|
||||
void set_fx_line_colors ();
|
||||
void reset_width_dependent_items (double pixel_width);
|
||||
void set_frame_color ();
|
||||
|
||||
void color_handler ();
|
||||
|
||||
|
@ -241,14 +229,6 @@ private:
|
|||
|
||||
bool trim_fade_in_drag_active;
|
||||
bool trim_fade_out_drag_active;
|
||||
|
||||
void set_region_fx_line (std::shared_ptr<ARDOUR::AutomationControl>, std::shared_ptr<ARDOUR::RegionFxPlugin>, uint32_t);
|
||||
|
||||
PBD::ID _rfx_id;
|
||||
uint32_t _rdx_param;
|
||||
bool _ignore_line_change;
|
||||
|
||||
PBD::ScopedConnection _region_fx_connection;
|
||||
};
|
||||
|
||||
#endif /* __gtk_ardour_audio_region_view_h__ */
|
||||
|
|
|
@ -61,13 +61,8 @@ using namespace Editing;
|
|||
AudioStreamView::AudioStreamView (AudioTimeAxisView& tv)
|
||||
: StreamView (tv)
|
||||
{
|
||||
/* use a dedicated group for Audio regions (on top of the grid) */
|
||||
_region_group = new ArdourCanvas::Container (_canvas_group);
|
||||
_region_group->raise_to_top ();
|
||||
_region_group->set_render_with_alpha (UIConfiguration::instance().modifier ("region alpha").a());
|
||||
|
||||
_amplitude_above_axis = 1.0;
|
||||
color_handler ();
|
||||
_amplitude_above_axis = 1.0;
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -91,10 +86,10 @@ AudioStreamView::set_amplitude_above_axis (gdouble app)
|
|||
}
|
||||
|
||||
RegionView*
|
||||
AudioStreamView::create_region_view (std::shared_ptr<Region> r, bool wait_for_waves, bool recording)
|
||||
AudioStreamView::create_region_view (boost::shared_ptr<Region> r, bool wait_for_waves, bool recording)
|
||||
{
|
||||
AudioRegionView *region_view = 0;
|
||||
std::shared_ptr<AudioRegion> region = std::dynamic_pointer_cast<AudioRegion> (r);
|
||||
boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (r);
|
||||
|
||||
if (region == 0) {
|
||||
return 0;
|
||||
|
@ -105,14 +100,14 @@ AudioStreamView::create_region_view (std::shared_ptr<Region> r, bool wait_for_wa
|
|||
case NonLayered:
|
||||
case Normal:
|
||||
if (recording) {
|
||||
region_view = new AudioRegionView (_region_group, _trackview, region,
|
||||
region_view = new AudioRegionView (_canvas_group, _trackview, region,
|
||||
_samples_per_pixel, region_color, recording, TimeAxisViewItem::Visibility(
|
||||
TimeAxisViewItem::ShowFrame |
|
||||
TimeAxisViewItem::HideFrameRight |
|
||||
TimeAxisViewItem::HideFrameLeft |
|
||||
TimeAxisViewItem::HideFrameTB));
|
||||
} else {
|
||||
region_view = new AudioRegionView (_region_group, _trackview, region,
|
||||
region_view = new AudioRegionView (_canvas_group, _trackview, region,
|
||||
_samples_per_pixel, region_color);
|
||||
}
|
||||
break;
|
||||
|
@ -139,7 +134,7 @@ AudioStreamView::create_region_view (std::shared_ptr<Region> r, bool wait_for_wa
|
|||
}
|
||||
|
||||
RegionView*
|
||||
AudioStreamView::add_region_view_internal (std::shared_ptr<Region> r, bool wait_for_waves, bool recording)
|
||||
AudioStreamView::add_region_view_internal (boost::shared_ptr<Region> r, bool wait_for_waves, bool recording)
|
||||
{
|
||||
RegionView *region_view = create_region_view (r, wait_for_waves, recording);
|
||||
|
||||
|
@ -151,23 +146,13 @@ AudioStreamView::add_region_view_internal (std::shared_ptr<Region> r, bool wait_
|
|||
|
||||
/* catch region going away */
|
||||
|
||||
r->DropReferences.connect (*this, invalidator (*this), boost::bind (&AudioStreamView::remove_region_view, this, std::weak_ptr<Region> (r)), gui_context());
|
||||
r->DropReferences.connect (*this, invalidator (*this), boost::bind (&AudioStreamView::remove_region_view, this, boost::weak_ptr<Region> (r)), gui_context());
|
||||
|
||||
RegionViewAdded (region_view);
|
||||
|
||||
return region_view;
|
||||
}
|
||||
|
||||
void
|
||||
AudioStreamView::set_layer_display (LayerDisplay d)
|
||||
{
|
||||
StreamView::set_layer_display (d);
|
||||
|
||||
for (auto& rv : region_views) {
|
||||
rv->set_frame_color ();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
AudioStreamView::redisplay_track ()
|
||||
{
|
||||
|
@ -221,15 +206,15 @@ AudioStreamView::setup_rec_box ()
|
|||
SourceList sources;
|
||||
|
||||
rec_data_ready_connections.drop_connections ();
|
||||
std::shared_ptr<AudioTrack> tr = _trackview.audio_track();
|
||||
boost::shared_ptr<AudioTrack> tr = _trackview.audio_track();
|
||||
|
||||
for (uint32_t n = 0; n < tr->n_channels().n_audio(); ++n) {
|
||||
std::shared_ptr<AudioFileSource> src = tr->write_source (n);
|
||||
boost::shared_ptr<AudioFileSource> src = tr->write_source (n);
|
||||
if (src) {
|
||||
sources.push_back (src);
|
||||
src->PeakRangeReady.connect (rec_data_ready_connections,
|
||||
invalidator (*this),
|
||||
boost::bind (&AudioStreamView::rec_peak_range_ready, this, _1, _2, std::weak_ptr<Source>(src)),
|
||||
boost::bind (&AudioStreamView::rec_peak_range_ready, this, _1, _2, boost::weak_ptr<Source>(src)),
|
||||
gui_context());
|
||||
}
|
||||
}
|
||||
|
@ -249,8 +234,8 @@ AudioStreamView::setup_rec_box ()
|
|||
plist.add (Properties::name, string());
|
||||
plist.add (Properties::layer, 0);
|
||||
|
||||
std::shared_ptr<AudioRegion> region (
|
||||
std::dynamic_pointer_cast<AudioRegion>(RegionFactory::create (sources, plist, false)));
|
||||
boost::shared_ptr<AudioRegion> region (
|
||||
boost::dynamic_pointer_cast<AudioRegion>(RegionFactory::create (sources, plist, false)));
|
||||
|
||||
assert(region);
|
||||
region->set_position (timepos_t (_trackview.session()->transport_sample()));
|
||||
|
@ -259,7 +244,7 @@ AudioStreamView::setup_rec_box ()
|
|||
|
||||
/* start a new rec box */
|
||||
|
||||
std::shared_ptr<AudioTrack> at = _trackview.audio_track();
|
||||
boost::shared_ptr<AudioTrack> at = _trackview.audio_track();
|
||||
samplepos_t const sample_pos = at->current_capture_start ();
|
||||
|
||||
create_rec_box(sample_pos, 0);
|
||||
|
@ -276,16 +261,49 @@ AudioStreamView::setup_rec_box ()
|
|||
|
||||
// cerr << "\tNOT rolling, rec_rects = " << rec_rects.size() << " rec_regions = " << rec_regions.size() << endl;
|
||||
|
||||
cleanup_rec_box ();
|
||||
if (!rec_rects.empty() || !rec_regions.empty()) {
|
||||
|
||||
/* disconnect rapid update */
|
||||
screen_update_connection.disconnect();
|
||||
rec_data_ready_connections.drop_connections ();
|
||||
rec_updating = false;
|
||||
rec_active = false;
|
||||
|
||||
/* remove temp regions */
|
||||
|
||||
for (list<pair<boost::shared_ptr<Region>,RegionView*> >::iterator iter = rec_regions.begin(); iter != rec_regions.end(); ) {
|
||||
list<pair<boost::shared_ptr<Region>,RegionView*> >::iterator tmp;
|
||||
|
||||
tmp = iter;
|
||||
++tmp;
|
||||
|
||||
(*iter).first->drop_references ();
|
||||
|
||||
iter = tmp;
|
||||
}
|
||||
|
||||
rec_regions.clear();
|
||||
|
||||
// cerr << "\tclear " << rec_rects.size() << " rec rects\n";
|
||||
|
||||
/* transport stopped, clear boxes */
|
||||
for (vector<RecBoxInfo>::iterator iter=rec_rects.begin(); iter != rec_rects.end(); ++iter) {
|
||||
RecBoxInfo &rect = (*iter);
|
||||
delete rect.rectangle;
|
||||
}
|
||||
|
||||
rec_rects.clear();
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
AudioStreamView::rec_peak_range_ready (samplepos_t start, samplecnt_t cnt, std::weak_ptr<Source> weak_src)
|
||||
AudioStreamView::rec_peak_range_ready (samplepos_t start, samplecnt_t cnt, boost::weak_ptr<Source> weak_src)
|
||||
{
|
||||
ENSURE_GUI_THREAD (*this, &AudioStreamView::rec_peak_range_ready, start, cnt, weak_src)
|
||||
|
||||
std::shared_ptr<Source> src (weak_src.lock());
|
||||
boost::shared_ptr<Source> src (weak_src.lock());
|
||||
|
||||
if (!src) {
|
||||
return;
|
||||
|
@ -314,9 +332,9 @@ AudioStreamView::update_rec_regions (samplepos_t start, samplecnt_t cnt)
|
|||
|
||||
uint32_t n = 0;
|
||||
|
||||
for (list<pair<std::shared_ptr<Region>,RegionView*> >::iterator iter = rec_regions.begin(); iter != rec_regions.end(); n++) {
|
||||
for (list<pair<boost::shared_ptr<Region>,RegionView*> >::iterator iter = rec_regions.begin(); iter != rec_regions.end(); n++) {
|
||||
|
||||
list<pair<std::shared_ptr<Region>,RegionView*> >::iterator tmp = iter;
|
||||
list<pair<boost::shared_ptr<Region>,RegionView*> >::iterator tmp = iter;
|
||||
++tmp;
|
||||
|
||||
assert (n < rec_rects.size());
|
||||
|
@ -327,7 +345,7 @@ AudioStreamView::update_rec_regions (samplepos_t start, samplecnt_t cnt)
|
|||
continue;
|
||||
}
|
||||
|
||||
std::shared_ptr<AudioRegion> region = std::dynamic_pointer_cast<AudioRegion>(iter->first);
|
||||
boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion>(iter->first);
|
||||
|
||||
if (!region) {
|
||||
iter = tmp;
|
||||
|
@ -422,7 +440,7 @@ AudioStreamView::hide_all_fades ()
|
|||
* second is the AudioRegionViews that end xfades were hidden for.
|
||||
*/
|
||||
pair<list<AudioRegionView*>, list<AudioRegionView*> >
|
||||
AudioStreamView::hide_xfades_with (std::shared_ptr<AudioRegion> ar)
|
||||
AudioStreamView::hide_xfades_with (boost::shared_ptr<AudioRegion> ar)
|
||||
{
|
||||
list<AudioRegionView*> start_hidden;
|
||||
list<AudioRegionView*> end_hidden;
|
||||
|
@ -452,8 +470,6 @@ AudioStreamView::hide_xfades_with (std::shared_ptr<AudioRegion> ar)
|
|||
void
|
||||
AudioStreamView::color_handler ()
|
||||
{
|
||||
_region_group->set_render_with_alpha (UIConfiguration::instance().modifier ("region alpha").a());
|
||||
|
||||
//case cAudioTrackBase:
|
||||
if (_trackview.is_track()) {
|
||||
canvas_rect->set_fill_color (UIConfiguration::instance().color_mod ("audio track base", "audio track base"));
|
||||
|
@ -470,8 +486,8 @@ AudioStreamView::set_selected_points (PointSelection& points)
|
|||
{
|
||||
for (list<RegionView *>::iterator i = region_views.begin(); i != region_views.end(); ++i) {
|
||||
AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*i);
|
||||
if (arv && arv->fx_line ()) {
|
||||
arv->fx_line ()->set_selected_points (points);
|
||||
if (arv && arv->get_gain_line ()) {
|
||||
arv->get_gain_line ()->set_selected_points (points);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -22,11 +22,11 @@
|
|||
#ifndef __ardour_audio_streamview_h__
|
||||
#define __ardour_audio_streamview_h__
|
||||
|
||||
#include <cmath>
|
||||
#include <list>
|
||||
#include <memory>
|
||||
#include <map>
|
||||
#include <cmath>
|
||||
|
||||
#include <boost/weak_ptr.hpp>
|
||||
|
||||
#include "ardour/location.h"
|
||||
#include "point_selection.h"
|
||||
|
@ -62,24 +62,20 @@ public:
|
|||
void show_all_fades ();
|
||||
void hide_all_fades ();
|
||||
|
||||
std::pair<std::list<AudioRegionView*>, std::list<AudioRegionView*> > hide_xfades_with (std::shared_ptr<ARDOUR::AudioRegion> ar);
|
||||
std::pair<std::list<AudioRegionView*>, std::list<AudioRegionView*> > hide_xfades_with (boost::shared_ptr<ARDOUR::AudioRegion> ar);
|
||||
|
||||
RegionView* create_region_view (std::shared_ptr<ARDOUR::Region>, bool, bool);
|
||||
RegionView* create_region_view (boost::shared_ptr<ARDOUR::Region>, bool, bool);
|
||||
void set_selected_points (PointSelection&);
|
||||
|
||||
void reload_waves ();
|
||||
|
||||
void set_layer_display (LayerDisplay);
|
||||
|
||||
ArdourCanvas::Container* region_canvas () const { return _region_group; }
|
||||
|
||||
private:
|
||||
void setup_rec_box ();
|
||||
void rec_peak_range_ready (samplepos_t start, ARDOUR::samplecnt_t cnt, std::weak_ptr<ARDOUR::Source> src);
|
||||
void rec_peak_range_ready (samplepos_t start, ARDOUR::samplecnt_t cnt, boost::weak_ptr<ARDOUR::Source> src);
|
||||
void update_rec_regions (ARDOUR::samplepos_t, ARDOUR::samplecnt_t);
|
||||
|
||||
RegionView* add_region_view_internal (std::shared_ptr<ARDOUR::Region>, bool wait_for_waves, bool recording = false);
|
||||
void remove_audio_region_view (std::shared_ptr<ARDOUR::AudioRegion> );
|
||||
RegionView* add_region_view_internal (boost::shared_ptr<ARDOUR::Region>, bool wait_for_waves, bool recording = false);
|
||||
void remove_audio_region_view (boost::shared_ptr<ARDOUR::AudioRegion> );
|
||||
|
||||
void redisplay_track ();
|
||||
|
||||
|
@ -87,9 +83,7 @@ private:
|
|||
|
||||
double _amplitude_above_axis;
|
||||
|
||||
std::map<std::shared_ptr<ARDOUR::Source>, bool> rec_data_ready_map;
|
||||
|
||||
ArdourCanvas::Container* _region_group;
|
||||
std::map<boost::shared_ptr<ARDOUR::Source>, bool> rec_data_ready_map;
|
||||
|
||||
bool outline_region;
|
||||
};
|
||||
|
|
|
@ -79,7 +79,7 @@ AudioTimeAxisView::AudioTimeAxisView (PublicEditor& ed, Session* sess, ArdourCan
|
|||
}
|
||||
|
||||
void
|
||||
AudioTimeAxisView::set_route (std::shared_ptr<Route> rt)
|
||||
AudioTimeAxisView::set_route (boost::shared_ptr<Route> rt)
|
||||
{
|
||||
_route = rt;
|
||||
|
||||
|
|
|
@ -70,7 +70,7 @@ public:
|
|||
AudioTimeAxisView (PublicEditor&, ARDOUR::Session*, ArdourCanvas::Canvas& canvas);
|
||||
virtual ~AudioTimeAxisView ();
|
||||
|
||||
void set_route (std::shared_ptr<ARDOUR::Route>);
|
||||
void set_route (boost::shared_ptr<ARDOUR::Route>);
|
||||
|
||||
AudioStreamView* audio_view();
|
||||
|
||||
|
|
|
@ -166,7 +166,7 @@ void
|
|||
AudioTriggerPropertiesBox::MultiplyTempo(float mult)
|
||||
{
|
||||
TriggerPtr trigger (tref.trigger());
|
||||
std::shared_ptr<AudioTrigger> at = std::dynamic_pointer_cast<AudioTrigger> (trigger);
|
||||
boost::shared_ptr<AudioTrigger> at = boost::dynamic_pointer_cast<AudioTrigger> (trigger);
|
||||
if (at) {
|
||||
at->set_segment_tempo (at->segment_tempo () * mult);
|
||||
}
|
||||
|
@ -176,7 +176,7 @@ void
|
|||
AudioTriggerPropertiesBox::toggle_stretch ()
|
||||
{
|
||||
TriggerPtr trigger (tref.trigger());
|
||||
std::shared_ptr<AudioTrigger> at = std::dynamic_pointer_cast<AudioTrigger> (trigger);
|
||||
boost::shared_ptr<AudioTrigger> at = boost::dynamic_pointer_cast<AudioTrigger> (trigger);
|
||||
if (at) {
|
||||
at->set_stretchable (!at->stretchable ());
|
||||
}
|
||||
|
@ -186,7 +186,7 @@ void
|
|||
AudioTriggerPropertiesBox::set_stretch_mode (Trigger::StretchMode sm)
|
||||
{
|
||||
TriggerPtr trigger (tref.trigger());
|
||||
std::shared_ptr<AudioTrigger> at = std::dynamic_pointer_cast<AudioTrigger> (trigger);
|
||||
boost::shared_ptr<AudioTrigger> at = boost::dynamic_pointer_cast<AudioTrigger> (trigger);
|
||||
if (at) {
|
||||
at->set_stretch_mode (sm);
|
||||
}
|
||||
|
@ -205,7 +205,7 @@ void
|
|||
AudioTriggerPropertiesBox::on_trigger_changed (const PBD::PropertyChange& pc)
|
||||
{
|
||||
TriggerPtr trigger (tref.trigger());
|
||||
std::shared_ptr<AudioTrigger> at = std::dynamic_pointer_cast<AudioTrigger> (trigger);
|
||||
boost::shared_ptr<AudioTrigger> at = boost::dynamic_pointer_cast<AudioTrigger> (trigger);
|
||||
if (!at) {
|
||||
return;
|
||||
}
|
||||
|
@ -234,7 +234,7 @@ AudioTriggerPropertiesBox::on_trigger_changed (const PBD::PropertyChange& pc)
|
|||
sprintf(buf, "%3.2f", at->segment_tempo ());
|
||||
_abpm_label.set_text (buf);
|
||||
|
||||
ArdourWidgets::set_tooltip (_abpm_label, string_compose (_("Clip Tempo, used for stretching. Estimated tempo (from file) was: %1"), trigger->estimated_tempo ()));
|
||||
ArdourWidgets::set_tooltip (_abpm_label, string_compose ("Clip Tempo, used for stretching. Estimated tempo (from file) was: %1", trigger->estimated_tempo ()));
|
||||
|
||||
int beats = round(at->segment_beatcnt());
|
||||
|
||||
|
@ -290,7 +290,7 @@ AudioTriggerPropertiesBox::beats_changed ()
|
|||
}
|
||||
|
||||
TriggerPtr trigger (tref.trigger());
|
||||
std::shared_ptr<AudioTrigger> at = std::dynamic_pointer_cast<AudioTrigger> (trigger);
|
||||
boost::shared_ptr<AudioTrigger> at = boost::dynamic_pointer_cast<AudioTrigger> (trigger);
|
||||
if (at) {
|
||||
at->set_segment_beatcnt (_beat_adjustment.get_value());
|
||||
}
|
||||
|
@ -299,7 +299,7 @@ AudioTriggerPropertiesBox::beats_changed ()
|
|||
void
|
||||
AudioTriggerPropertiesBox::start_clock_changed ()
|
||||
{
|
||||
trigger()->set_start(_start_clock.last_when());
|
||||
trigger()->set_start(_start_clock.current_time());
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -51,7 +51,7 @@ using namespace ArdourWidgets;
|
|||
using PBD::Controllable;
|
||||
|
||||
AutomationBarController::AutomationBarController (
|
||||
std::shared_ptr<AutomationControl> ac,
|
||||
boost::shared_ptr<AutomationControl> ac,
|
||||
Adjustment* adj)
|
||||
: ArdourWidgets::BarController (*adj, ac)
|
||||
, _controllable (ac)
|
||||
|
@ -69,7 +69,7 @@ AutomationBarController::~AutomationBarController()
|
|||
{
|
||||
}
|
||||
|
||||
AutomationController::AutomationController(std::shared_ptr<AutomationControl> ac,
|
||||
AutomationController::AutomationController(boost::shared_ptr<AutomationControl> ac,
|
||||
Adjustment* adj,
|
||||
bool use_knob)
|
||||
: _widget(NULL)
|
||||
|
@ -140,10 +140,10 @@ AutomationController::~AutomationController()
|
|||
{
|
||||
}
|
||||
|
||||
std::shared_ptr<AutomationController>
|
||||
boost::shared_ptr<AutomationController>
|
||||
AutomationController::create(const Evoral::Parameter& param,
|
||||
const ParameterDescriptor& desc,
|
||||
std::shared_ptr<AutomationControl> ac,
|
||||
boost::shared_ptr<AutomationControl> ac,
|
||||
bool use_knob)
|
||||
{
|
||||
const double lo = ac->internal_to_interface(desc.lower, true);
|
||||
|
@ -160,7 +160,7 @@ AutomationController::create(const Evoral::Parameter& param,
|
|||
|
||||
assert (ac);
|
||||
assert(ac->parameter() == param);
|
||||
return std::shared_ptr<AutomationController>(new AutomationController(ac, adjustment, use_knob));
|
||||
return boost::shared_ptr<AutomationController>(new AutomationController(ac, adjustment, use_knob));
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -212,14 +212,14 @@ AutomationController::value_adjusted ()
|
|||
}
|
||||
|
||||
void
|
||||
AutomationController::start_touch (int state)
|
||||
AutomationController::start_touch()
|
||||
{
|
||||
_grabbed = true;
|
||||
_controllable->start_touch (timepos_t (_controllable->session().transport_sample()));
|
||||
}
|
||||
|
||||
void
|
||||
AutomationController::end_touch (int state)
|
||||
AutomationController::end_touch ()
|
||||
{
|
||||
_controllable->stop_touch (timepos_t (_controllable->session().transport_sample()));
|
||||
if (_grabbed) {
|
||||
|
@ -229,20 +229,20 @@ AutomationController::end_touch (int state)
|
|||
}
|
||||
|
||||
bool
|
||||
AutomationController::button_press (GdkEventButton* ev)
|
||||
AutomationController::button_press (GdkEventButton*)
|
||||
{
|
||||
ArdourButton* but = dynamic_cast<ArdourButton*>(_widget);
|
||||
if (but) {
|
||||
start_touch (ev->state);
|
||||
start_touch ();
|
||||
_controllable->set_value (but->get_active () ? 0.0 : 1.0, Controllable::UseGroup);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
AutomationController::button_release (GdkEventButton* ev)
|
||||
AutomationController::button_release (GdkEventButton*)
|
||||
{
|
||||
end_touch (ev->state);
|
||||
end_touch ();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -284,7 +284,7 @@ AutomationController::set_freq_beats(double beats)
|
|||
const ARDOUR::ParameterDescriptor& desc = _controllable->desc();
|
||||
const ARDOUR::Session& session = _controllable->session();
|
||||
const samplepos_t pos = session.transport_sample();
|
||||
const Temporal::Tempo& tempo = Temporal::TempoMap::use()->metric_at (timepos_t (pos)).tempo();
|
||||
const Temporal::Tempo& tempo = Temporal::TempoMap::use()->metric_at (pos).tempo();
|
||||
const double bpm = tempo.note_types_per_minute();
|
||||
const double bps = bpm / 60.0;
|
||||
const double freq = bps / beats;
|
||||
|
@ -314,7 +314,7 @@ AutomationController::on_button_release(GdkEventButton* ev)
|
|||
MenuList& items = menu->items();
|
||||
items.push_back(MenuElem(_("Select Note..."),
|
||||
sigc::mem_fun(*this, &AutomationController::run_note_select_dialog)));
|
||||
menu->popup(ev->button, ev->time);
|
||||
menu->popup(1, ev->time);
|
||||
return true;
|
||||
} else if (desc.unit == ARDOUR::ParameterDescriptor::HZ) {
|
||||
Gtk::Menu* menu = ARDOUR_UI_UTILS::shared_popup_menu ();
|
||||
|
@ -338,7 +338,7 @@ AutomationController::on_button_release(GdkEventButton* ev)
|
|||
(double)beats)));
|
||||
}
|
||||
}
|
||||
menu->popup(ev->button, ev->time);
|
||||
menu->popup(1, ev->time);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
#undef NO
|
||||
#endif
|
||||
|
||||
#include <memory>
|
||||
#include <boost/shared_ptr.hpp>
|
||||
|
||||
#include <gtkmm/alignment.h>
|
||||
|
||||
|
@ -51,26 +51,26 @@ namespace Gtk {
|
|||
|
||||
class AutomationBarController : public ArdourWidgets::BarController {
|
||||
public:
|
||||
AutomationBarController(std::shared_ptr<ARDOUR::AutomationControl> ac,
|
||||
AutomationBarController(boost::shared_ptr<ARDOUR::AutomationControl> ac,
|
||||
Gtk::Adjustment* adj);
|
||||
~AutomationBarController();
|
||||
private:
|
||||
std::string get_label (double&);
|
||||
std::shared_ptr<ARDOUR::AutomationControl> _controllable;
|
||||
boost::shared_ptr<ARDOUR::AutomationControl> _controllable;
|
||||
};
|
||||
|
||||
/** A BarController which displays the value and allows control of an AutomationControl */
|
||||
class AutomationController : public Gtk::Alignment {
|
||||
public:
|
||||
static std::shared_ptr<AutomationController> create (
|
||||
static boost::shared_ptr<AutomationController> create (
|
||||
const Evoral::Parameter& param,
|
||||
const ARDOUR::ParameterDescriptor& desc,
|
||||
std::shared_ptr<ARDOUR::AutomationControl> ac,
|
||||
boost::shared_ptr<ARDOUR::AutomationControl> ac,
|
||||
bool use_knob = false);
|
||||
|
||||
~AutomationController();
|
||||
|
||||
std::shared_ptr<ARDOUR::AutomationControl> controllable() { return _controllable; }
|
||||
boost::shared_ptr<ARDOUR::AutomationControl> controllable() { return _controllable; }
|
||||
|
||||
void disable_vertical_scroll();
|
||||
|
||||
|
@ -84,12 +84,12 @@ public:
|
|||
void stop_updating ();
|
||||
|
||||
private:
|
||||
AutomationController (std::shared_ptr<ARDOUR::AutomationControl> ac,
|
||||
AutomationController (boost::shared_ptr<ARDOUR::AutomationControl> ac,
|
||||
Gtk::Adjustment* adj,
|
||||
bool use_knob);
|
||||
|
||||
void start_touch(int);
|
||||
void end_touch(int);
|
||||
void start_touch();
|
||||
void end_touch();
|
||||
bool button_press(GdkEventButton*);
|
||||
bool button_release(GdkEventButton*);
|
||||
|
||||
|
@ -99,7 +99,7 @@ private:
|
|||
bool on_button_release(GdkEventButton* ev);
|
||||
|
||||
Gtk::Widget* _widget;
|
||||
std::shared_ptr<ARDOUR::AutomationControl> _controllable;
|
||||
boost::shared_ptr<ARDOUR::AutomationControl> _controllable;
|
||||
Gtk::Adjustment* _adjustment;
|
||||
sigc::connection _screen_update_connection;
|
||||
PBD::ScopedConnectionList _changed_connections;
|
||||
|
|
|
@ -87,33 +87,32 @@ using namespace Temporal;
|
|||
AutomationLine::AutomationLine (const string& name,
|
||||
TimeAxisView& tv,
|
||||
ArdourCanvas::Item& parent,
|
||||
std::shared_ptr<AutomationList> al,
|
||||
boost::shared_ptr<AutomationList> al,
|
||||
const ParameterDescriptor& desc)
|
||||
: trackview (tv)
|
||||
, _name (name)
|
||||
, _height (0)
|
||||
, _line_color ("automation line")
|
||||
, _view_index_offset (0)
|
||||
, alist (al)
|
||||
, _visible (Line)
|
||||
, terminal_points_can_slide (true)
|
||||
, update_pending (false)
|
||||
, have_reset_timeout (false)
|
||||
, no_draw (false)
|
||||
, _is_boolean (false)
|
||||
, _parent_group (parent)
|
||||
, _offset (0)
|
||||
, _maximum_time (timepos_t::max (al->time_domain()))
|
||||
, _fill (false)
|
||||
, _desc (desc)
|
||||
{
|
||||
_visible = Line;
|
||||
|
||||
update_pending = false;
|
||||
have_timeout = false;
|
||||
no_draw = false;
|
||||
_is_boolean = false;
|
||||
terminal_points_can_slide = true;
|
||||
_height = 0;
|
||||
|
||||
group = new ArdourCanvas::Container (&parent, ArdourCanvas::Duple(0, 1.5));
|
||||
CANVAS_DEBUG_NAME (group, "region gain envelope group");
|
||||
|
||||
line = new ArdourCanvas::PolyLine (group);
|
||||
CANVAS_DEBUG_NAME (line, "region gain envelope line");
|
||||
line->set_data ("line", this);
|
||||
line->set_data ("trackview", &trackview);
|
||||
line->set_outline_width (2.0);
|
||||
line->set_covers_threshold (4.0);
|
||||
|
||||
|
@ -167,7 +166,7 @@ AutomationLine::update_visibility ()
|
|||
when automation points have been removed (the line will still follow the shape of the
|
||||
old points).
|
||||
*/
|
||||
if (line_points.size() >= 2) {
|
||||
if (control_points.size() >= 2) {
|
||||
line->show();
|
||||
} else {
|
||||
line->hide ();
|
||||
|
@ -211,7 +210,6 @@ AutomationLine::get_uses_gain_mapping () const
|
|||
case BusSendLevel:
|
||||
case EnvelopeAutomation:
|
||||
case TrimAutomation:
|
||||
case SurroundSendLevel:
|
||||
case InsertReturnLevel:
|
||||
return true;
|
||||
default:
|
||||
|
@ -265,23 +263,14 @@ AutomationLine::set_height (guint32 h)
|
|||
}
|
||||
|
||||
void
|
||||
AutomationLine::set_line_color (string color_name, std::string color_mod)
|
||||
AutomationLine::set_line_color (uint32_t color)
|
||||
{
|
||||
_line_color = color_name;
|
||||
_line_color_mod = color_mod;
|
||||
|
||||
uint32_t color = UIConfiguration::instance().color (color_name);
|
||||
_line_color = color;
|
||||
line->set_outline_color (color);
|
||||
|
||||
Gtkmm2ext::SVAModifier mod = UIConfiguration::instance().modifier (color_mod.empty () ? "automation line fill" : color_mod);
|
||||
Gtkmm2ext::SVAModifier mod = UIConfiguration::instance().modifier ("automation line fill");
|
||||
|
||||
line->set_fill_color ((color & 0xffffff00) + mod.a() * 255);
|
||||
}
|
||||
|
||||
uint32_t
|
||||
AutomationLine::get_line_color() const
|
||||
{
|
||||
return UIConfiguration::instance().color (_line_color);
|
||||
line->set_fill_color ((color & 0xffffff00) + mod.a()*255);
|
||||
}
|
||||
|
||||
ControlPoint*
|
||||
|
@ -305,7 +294,7 @@ AutomationLine::nth (uint32_t n) const
|
|||
}
|
||||
|
||||
void
|
||||
AutomationLine::modify_points_y (std::vector<ControlPoint*> const& cps, double y)
|
||||
AutomationLine::modify_point_y (ControlPoint& cp, double y)
|
||||
{
|
||||
/* clamp y-coord appropriately. y is supposed to be a normalized fraction (0.0-1.0),
|
||||
and needs to be converted to a canvas unit distance.
|
||||
|
@ -319,16 +308,13 @@ AutomationLine::modify_points_y (std::vector<ControlPoint*> const& cps, double y
|
|||
trackview.editor().session()->add_command (
|
||||
new MementoCommand<AutomationList> (memento_command_binder(), &get_state(), 0));
|
||||
|
||||
cp.move_to (cp.get_x(), y, ControlPoint::Full);
|
||||
|
||||
alist->freeze ();
|
||||
for (auto const& cp : cps) {
|
||||
cp->move_to (cp->get_x(), y, ControlPoint::Full);
|
||||
sync_model_with_view_point (*cp);
|
||||
}
|
||||
sync_model_with_view_point (cp);
|
||||
alist->thaw ();
|
||||
|
||||
for (auto const& cp : cps) {
|
||||
reset_line_coords (*cp);
|
||||
}
|
||||
reset_line_coords (cp);
|
||||
|
||||
if (line_points.size() > 1) {
|
||||
line->set_steps (line_points, is_stepped());
|
||||
|
@ -347,8 +333,8 @@ void
|
|||
AutomationLine::reset_line_coords (ControlPoint& cp)
|
||||
{
|
||||
if (cp.view_index() < line_points.size()) {
|
||||
line_points[cp.view_index() + _view_index_offset].x = cp.get_x ();
|
||||
line_points[cp.view_index() + _view_index_offset].y = cp.get_y ();
|
||||
line_points[cp.view_index()].x = cp.get_x ();
|
||||
line_points[cp.view_index()].y = cp.get_y ();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -358,8 +344,8 @@ AutomationLine::sync_model_with_view_points (list<ControlPoint*> cp)
|
|||
update_pending = true;
|
||||
|
||||
bool moved = false;
|
||||
for (auto const & vp : cp) {
|
||||
moved = sync_model_with_view_point (*vp) || moved;
|
||||
for (list<ControlPoint*>::iterator i = cp.begin(); i != cp.end(); ++i) {
|
||||
moved = sync_model_with_view_point (**i) || moved;
|
||||
}
|
||||
|
||||
return moved;
|
||||
|
@ -396,7 +382,7 @@ AutomationLine::delta_to_string (double delta) const
|
|||
if (!get_uses_gain_mapping () && _desc.logarithmic) {
|
||||
return "x " + ARDOUR::value_as_string (_desc, delta);
|
||||
} else {
|
||||
return u8"\u0394 " + ARDOUR::value_as_string (_desc, delta);
|
||||
return "\u0394 " + ARDOUR::value_as_string (_desc, delta);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -415,7 +401,6 @@ AutomationLine::string_to_fraction (string const & s) const
|
|||
case BusSendLevel:
|
||||
case EnvelopeAutomation:
|
||||
case TrimAutomation:
|
||||
case SurroundSendLevel:
|
||||
case InsertReturnLevel:
|
||||
if (s == "-inf") { /* translation */
|
||||
v = 0;
|
||||
|
@ -426,7 +411,8 @@ AutomationLine::string_to_fraction (string const & s) const
|
|||
default:
|
||||
break;
|
||||
}
|
||||
return model_to_view_coord_y (v);
|
||||
model_to_view_coord_y (v);
|
||||
return v;
|
||||
}
|
||||
|
||||
/** Start dragging a single point, possibly adding others if the supplied point is selected and there
|
||||
|
@ -501,7 +487,7 @@ struct ControlPointSorter
|
|||
};
|
||||
|
||||
AutomationLine::ContiguousControlPoints::ContiguousControlPoints (AutomationLine& al)
|
||||
: line (al), before_x (timepos_t (line.the_list()->time_domain())), after_x (timepos_t::max (line.the_list()->time_domain()))
|
||||
: line (al), before_x (0), after_x (DBL_MAX)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -518,8 +504,8 @@ AutomationLine::ContiguousControlPoints::compute_x_bounds (PublicEditor& e)
|
|||
*/
|
||||
|
||||
if (front()->view_index() > 0) {
|
||||
before_x = (*line.nth (front()->view_index() - 1)->model())->when;
|
||||
before_x += timepos_t (64);
|
||||
before_x = line.nth (front()->view_index() - 1)->get_x();
|
||||
before_x += e.sample_to_pixel_unrounded (64);
|
||||
}
|
||||
|
||||
/* if our last point has a point after it in the line,
|
||||
|
@ -527,65 +513,52 @@ AutomationLine::ContiguousControlPoints::compute_x_bounds (PublicEditor& e)
|
|||
*/
|
||||
|
||||
if (back()->view_index() < (line.npoints() - 1)) {
|
||||
after_x = (*line.nth (back()->view_index() + 1)->model())->when;
|
||||
after_x.shift_earlier (timepos_t (64));
|
||||
after_x = line.nth (back()->view_index() + 1)->get_x();
|
||||
after_x -= e.sample_to_pixel_unrounded (64);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Temporal::timecnt_t
|
||||
AutomationLine::ContiguousControlPoints::clamp_dt (timecnt_t const & dt, timepos_t const & line_limit)
|
||||
double
|
||||
AutomationLine::ContiguousControlPoints::clamp_dx (double dx)
|
||||
{
|
||||
if (empty()) {
|
||||
return dt;
|
||||
return dx;
|
||||
}
|
||||
|
||||
/* get the maximum distance we can move any of these points along the x-axis
|
||||
*/
|
||||
|
||||
ControlPoint* reference_point;
|
||||
double tx; /* possible position a point would move to, given dx */
|
||||
ControlPoint* cp;
|
||||
|
||||
if (dt.magnitude() > 0) {
|
||||
if (dx > 0) {
|
||||
/* check the last point, since we're moving later in time */
|
||||
reference_point = back();
|
||||
cp = back();
|
||||
} else {
|
||||
/* check the first point, since we're moving earlier in time */
|
||||
reference_point = front();
|
||||
cp = front();
|
||||
}
|
||||
|
||||
/* possible position the "reference" point would move to, given dx */
|
||||
Temporal::timepos_t possible_pos = (*reference_point->model())->when + dt; // new possible position if we just add the motion
|
||||
|
||||
/* Now clamp that position so that:
|
||||
*
|
||||
* - it is not before the origin (zero)
|
||||
* - it is not beyond the line's own limit (e.g. for region automation)
|
||||
* - it is not before the preceding point
|
||||
* - it is not after the following point
|
||||
*/
|
||||
|
||||
possible_pos = max (possible_pos, Temporal::timepos_t (possible_pos.time_domain()));
|
||||
possible_pos = min (possible_pos, line_limit);
|
||||
|
||||
possible_pos = max (possible_pos, before_x); // can't move later than following point
|
||||
possible_pos = min (possible_pos, after_x); // can't move earlier than preceding point
|
||||
|
||||
return (*reference_point->model())->when.distance (possible_pos);
|
||||
tx = cp->get_x() + dx; // new possible position if we just add the motion
|
||||
tx = max (tx, before_x); // can't move later than following point
|
||||
tx = min (tx, after_x); // can't move earlier than preceding point
|
||||
return tx - cp->get_x ();
|
||||
}
|
||||
|
||||
void
|
||||
AutomationLine::ContiguousControlPoints::move (timecnt_t const & dt, double dvalue)
|
||||
AutomationLine::ContiguousControlPoints::move (double dx, double dvalue)
|
||||
{
|
||||
for (auto & cp : *this) {
|
||||
for (std::list<ControlPoint*>::iterator i = begin(); i != end(); ++i) {
|
||||
// compute y-axis delta
|
||||
double view_y = 1.0 - cp->get_y() / line.height();
|
||||
double view_y = 1.0 - (*i)->get_y() / line.height();
|
||||
line.view_to_model_coord_y (view_y);
|
||||
line.apply_delta (view_y, dvalue);
|
||||
view_y = line.model_to_view_coord_y (view_y);
|
||||
line.model_to_view_coord_y (view_y);
|
||||
view_y = (1.0 - view_y) * line.height();
|
||||
|
||||
cp->move_to (line.dt_to_dx ((*cp->model())->when, dt), view_y, ControlPoint::Full);
|
||||
line.reset_line_coords (*cp);
|
||||
(*i)->move_to ((*i)->get_x() + dx, view_y, ControlPoint::Full);
|
||||
line.reset_line_coords (**i);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -596,6 +569,8 @@ AutomationLine::ContiguousControlPoints::move (timecnt_t const & dt, double dval
|
|||
void
|
||||
AutomationLine::start_drag_common (double x, float fraction)
|
||||
{
|
||||
_drag_x = x;
|
||||
_drag_distance = 0;
|
||||
_last_drag_fraction = fraction;
|
||||
_drag_had_movement = false;
|
||||
did_push = false;
|
||||
|
@ -605,39 +580,20 @@ AutomationLine::start_drag_common (double x, float fraction)
|
|||
_drag_points.sort (ControlPointSorter());
|
||||
}
|
||||
|
||||
/** Takes a relative-to-origin position, moves it by dt, and returns a
|
||||
* relative-to-origin pixel count.
|
||||
*/
|
||||
double
|
||||
AutomationLine::dt_to_dx (timepos_t const & pos, timecnt_t const & dt)
|
||||
{
|
||||
/* convert a shift of pos by dt into an absolute timepos */
|
||||
timepos_t const new_pos ((pos + dt + get_origin()).shift_earlier (offset()));
|
||||
/* convert to pixels */
|
||||
double px = trackview.editor().time_to_pixel_unrounded (new_pos);
|
||||
/* convert back to pixels-relative-to-origin */
|
||||
px -= trackview.editor().time_to_pixel_unrounded (get_origin());
|
||||
return px;
|
||||
}
|
||||
|
||||
/** Should be called to indicate motion during a drag.
|
||||
* @param x New x position of the drag in canvas units relative to origin, or undefined if ignore_x == true.
|
||||
* @param x New x position of the drag in canvas units, or undefined if ignore_x == true.
|
||||
* @param fraction New y fraction.
|
||||
* @return x position and y fraction that were actually used (once clamped).
|
||||
*/
|
||||
pair<float, float>
|
||||
AutomationLine::drag_motion (timecnt_t const & pdt, float fraction, bool ignore_x, bool with_push, uint32_t& final_index)
|
||||
AutomationLine::drag_motion (double const x, float fraction, bool ignore_x, bool with_push, uint32_t& final_index)
|
||||
{
|
||||
if (_drag_points.empty()) {
|
||||
return pair<double,float> (fraction, _desc.is_linear () ? 0 : 1);
|
||||
}
|
||||
|
||||
timecnt_t dt (pdt);
|
||||
|
||||
if (ignore_x) {
|
||||
dt = timecnt_t (pdt.time_domain());
|
||||
}
|
||||
|
||||
double dx = ignore_x ? 0 : (x - _drag_x);
|
||||
double dy = fraction - _last_drag_fraction;
|
||||
|
||||
if (!_drag_had_movement) {
|
||||
|
@ -668,8 +624,8 @@ AutomationLine::drag_motion (timecnt_t const & pdt, float fraction, bool ignore_
|
|||
contiguous_points.pop_back ();
|
||||
}
|
||||
|
||||
for (auto const & ccp : contiguous_points) {
|
||||
ccp->compute_x_bounds (trackview.editor());
|
||||
for (vector<CCP>::iterator ccp = contiguous_points.begin(); ccp != contiguous_points.end(); ++ccp) {
|
||||
(*ccp)->compute_x_bounds (trackview.editor());
|
||||
}
|
||||
_drag_had_movement = true;
|
||||
}
|
||||
|
@ -682,10 +638,9 @@ AutomationLine::drag_motion (timecnt_t const & pdt, float fraction, bool ignore_
|
|||
* since all later points will move too.
|
||||
*/
|
||||
|
||||
if (dt.is_negative() || (dt.is_positive() && !with_push)) {
|
||||
const timepos_t line_limit = get_origin() + maximum_time() + _offset;
|
||||
for (auto const & ccp : contiguous_points){
|
||||
dt = ccp->clamp_dt (dt, line_limit);
|
||||
if (dx < 0 || ((dx > 0) && !with_push)) {
|
||||
for (vector<CCP>::iterator ccp = contiguous_points.begin(); ccp != contiguous_points.end(); ++ccp) {
|
||||
dx = (*ccp)->clamp_dx (dx);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -719,22 +674,18 @@ AutomationLine::drag_motion (timecnt_t const & pdt, float fraction, bool ignore_
|
|||
}
|
||||
}
|
||||
|
||||
if (!dt.is_zero() || dy) {
|
||||
if (dx || dy) {
|
||||
/* and now move each section */
|
||||
|
||||
|
||||
for (vector<CCP>::iterator ccp = contiguous_points.begin(); ccp != contiguous_points.end(); ++ccp) {
|
||||
(*ccp)->move (dt, delta_value);
|
||||
(*ccp)->move (dx, delta_value);
|
||||
}
|
||||
|
||||
if (with_push) {
|
||||
final_index = contiguous_points.back()->back()->view_index () + 1;
|
||||
ControlPoint* p;
|
||||
uint32_t i = final_index;
|
||||
|
||||
while ((p = nth (i)) != 0 && p->can_slide()) {
|
||||
|
||||
p->move_to (dt_to_dx ((*p->model())->when, dt), p->get_y(), ControlPoint::Full);
|
||||
p->move_to (p->get_x() + dx, p->get_y(), ControlPoint::Full);
|
||||
reset_line_coords (*p);
|
||||
++i;
|
||||
}
|
||||
|
@ -760,6 +711,8 @@ AutomationLine::drag_motion (timecnt_t const & pdt, float fraction, bool ignore_
|
|||
}
|
||||
|
||||
double const result_frac = _last_drag_fraction + dy;
|
||||
_drag_distance += dx;
|
||||
_drag_x += dx;
|
||||
_last_drag_fraction = result_frac;
|
||||
did_push = with_push;
|
||||
|
||||
|
@ -821,38 +774,31 @@ AutomationLine::sync_model_with_view_point (ControlPoint& cp)
|
|||
* is the RegionView's top-left corner.
|
||||
*/
|
||||
double view_x = cp.get_x();
|
||||
double view_y = 1.0 - cp.get_y() / (double)_height;
|
||||
|
||||
/* model time is relative to the Region (regardless of region->start offset) */
|
||||
timepos_t model_time = (*cp.model())->when;
|
||||
|
||||
const timepos_t origin (get_origin());
|
||||
|
||||
/* convert to absolute time on timeline */
|
||||
const timepos_t absolute_time = model_time + origin;
|
||||
const timepos_t absolute_time = model_time + get_origin();
|
||||
|
||||
/* now convert to pixels relative to start of region, which matches view_x */
|
||||
const double model_x = trackview.editor().time_to_pixel_unrounded (absolute_time) - trackview.editor().time_to_pixel_unrounded (origin);
|
||||
/* now convert it back to match the view_x (RegioView pixel pos) */
|
||||
const double model_x = trackview.editor().time_to_pixel_unrounded (absolute_time.earlier (_offset).earlier (get_origin ()));
|
||||
|
||||
if (view_x != model_x) {
|
||||
|
||||
/* convert the current position in the view (units:
|
||||
* region-relative pixels) into samples, then use that to
|
||||
* create a timecnt_t that measures the distance from the
|
||||
* origin for this line.
|
||||
/* convert the current position in the view (units: pixels)
|
||||
* into samples, then use that to create a timecnt_t that
|
||||
* measures the distance from the origin for this line.
|
||||
*
|
||||
* Note that the offset and origin is irrelevant here,
|
||||
* pixel_to_sample() islinear only depending on zoom level.
|
||||
*/
|
||||
|
||||
const timepos_t view_samples (trackview.editor().pixel_to_sample (view_x));
|
||||
const timecnt_t view_samples (trackview.editor().pixel_to_sample (view_x));
|
||||
|
||||
/* measure distance from RegionView origin (this preserves time domain) */
|
||||
|
||||
if (model_time.time_domain() == Temporal::AudioTime) {
|
||||
model_time = timepos_t (timecnt_t (view_samples, origin).samples());
|
||||
} else {
|
||||
model_time = timepos_t (timecnt_t (view_samples, origin).beats());
|
||||
}
|
||||
model_time = timepos_t (the_list()->time_domain()).distance (timepos_t (view_samples));
|
||||
|
||||
/* convert RegionView to Region position (account for region->start() _offset) */
|
||||
model_time += _offset;
|
||||
|
@ -860,13 +806,12 @@ AutomationLine::sync_model_with_view_point (ControlPoint& cp)
|
|||
|
||||
update_pending = true;
|
||||
|
||||
double view_y = 1.0 - cp.get_y() / (double)_height;
|
||||
view_to_model_coord_y (view_y);
|
||||
|
||||
alist->modify (cp.model(), model_time, view_y);
|
||||
|
||||
/* convert back from model to view y for clamping position (for integer/boolean/etc) */
|
||||
view_y = model_to_view_coord_y (view_y);
|
||||
model_to_view_coord_y (view_y);
|
||||
const double point_y = _height - (view_y * _height);
|
||||
if (point_y != cp.get_y()) {
|
||||
cp.move_to (cp.get_x(), point_y, ControlPoint::Full);
|
||||
|
@ -964,8 +909,8 @@ void
|
|||
AutomationLine::get_selectables (timepos_t const & start, timepos_t const & end, double botfrac, double topfrac, list<Selectable*>& results)
|
||||
{
|
||||
/* convert fractions to display coordinates with 0 at the top of the track */
|
||||
double const bot_track = (1 - topfrac) * trackview.current_height (); // this should StreamView::child_height () for RegionGain
|
||||
double const top_track = (1 - botfrac) * trackview.current_height (); // --"--
|
||||
double const bot_track = (1 - topfrac) * trackview.current_height ();
|
||||
double const top_track = (1 - botfrac) * trackview.current_height ();
|
||||
|
||||
for (auto const & cp : control_points) {
|
||||
|
||||
|
@ -1006,7 +951,7 @@ AutomationLine::set_selected_points (PointSelection const & points)
|
|||
void
|
||||
AutomationLine::set_colors ()
|
||||
{
|
||||
set_line_color (_line_color, _line_color_mod);
|
||||
set_line_color (UIConfiguration::instance().color ("automation line"));
|
||||
for (vector<ControlPoint*>::iterator i = control_points.begin(); i != control_points.end(); ++i) {
|
||||
(*i)->set_color ();
|
||||
}
|
||||
|
@ -1023,16 +968,6 @@ AutomationLine::list_changed ()
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
AutomationLine::tempo_map_changed ()
|
||||
{
|
||||
if (alist->time_domain() != Temporal::BeatTime) {
|
||||
return;
|
||||
}
|
||||
|
||||
reset ();
|
||||
}
|
||||
|
||||
void
|
||||
AutomationLine::reset_callback (const Evoral::ControlList& events)
|
||||
{
|
||||
|
@ -1046,7 +981,6 @@ AutomationLine::reset_callback (const Evoral::ControlList& events)
|
|||
}
|
||||
control_points.clear ();
|
||||
line->hide();
|
||||
line_points.clear ();
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1059,62 +993,40 @@ AutomationLine::reset_callback (const Evoral::ControlList& events)
|
|||
line->hide ();
|
||||
np = events.size();
|
||||
|
||||
Evoral::ControlList& e (const_cast<Evoral::ControlList&> (events));
|
||||
AutomationList::iterator preceding (e.end());
|
||||
AutomationList::iterator following (e.end());
|
||||
Evoral::ControlList& e = const_cast<Evoral::ControlList&> (events);
|
||||
|
||||
for (AutomationList::iterator ai = e.begin(); ai != e.end(); ++ai, ++pi) {
|
||||
|
||||
/* drop points outside our range */
|
||||
double ty = (*ai)->value;
|
||||
|
||||
if (((*ai)->when < _offset)) {
|
||||
preceding = ai;
|
||||
continue;
|
||||
}
|
||||
/* convert from model coordinates to canonical view coordinates */
|
||||
|
||||
if ((*ai)->when >= _offset + _maximum_time) {
|
||||
following = ai;
|
||||
break;
|
||||
}
|
||||
|
||||
double ty = model_to_view_coord_y ((*ai)->value);
|
||||
timepos_t tx = model_to_view_coord (**ai, ty);
|
||||
|
||||
if (isnan_local (ty)) {
|
||||
warning << string_compose (_("Ignoring illegal points on AutomationLine \"%1\""), _name) << endmsg;
|
||||
warning << string_compose (_("Ignoring illegal points on AutomationLine \"%1\""),
|
||||
_name) << endmsg;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (tx >= timepos_t::max (tx.time_domain()) || tx.is_negative () || tx >= _maximum_time) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* convert x-coordinate to a canvas unit coordinate (this takes
|
||||
* zoom and scroll into account).
|
||||
*/
|
||||
|
||||
double px = trackview.editor().time_to_pixel_unrounded (tx);
|
||||
|
||||
/* convert from canonical view height (0..1.0) to actual
|
||||
* height coordinates (using X11's top-left rooted system)
|
||||
*/
|
||||
|
||||
ty = _height - (ty * _height);
|
||||
|
||||
/* tx is currently the distance of this point from
|
||||
* _offset, which may be either:
|
||||
*
|
||||
* a) zero, for an automation line not connected to a
|
||||
* region
|
||||
*
|
||||
* b) some non-zero value, corresponding to the start
|
||||
* of the region within its source(s). Remember that
|
||||
* this start is an offset within the source, not a
|
||||
* position on the timeline.
|
||||
*
|
||||
* We need to convert tx to a global position, and to
|
||||
* do that we need to measure the distance from the
|
||||
* result of get_origin(), which tells ut the timeline
|
||||
* position of _offset
|
||||
*/
|
||||
|
||||
timecnt_t tx = model_to_view_coord_x ((*ai)->when);
|
||||
|
||||
/* convert x-coordinate to a canvas unit coordinate (this takes
|
||||
* zoom and scroll into account).
|
||||
*/
|
||||
|
||||
double px = trackview.editor().duration_to_pixels_unrounded (tx);
|
||||
add_visible_control_point (vp, pi, px, ty, ai, np);
|
||||
|
||||
vp++;
|
||||
}
|
||||
|
||||
|
@ -1130,64 +1042,23 @@ AutomationLine::reset_callback (const Evoral::ControlList& events)
|
|||
control_points.back()->set_can_slide(false);
|
||||
}
|
||||
|
||||
if (vp) {
|
||||
if (vp > 1) {
|
||||
|
||||
/* reset the line coordinates given to the CanvasLine */
|
||||
|
||||
/* 2 extra in case we need hidden points for line start and end */
|
||||
|
||||
line_points.resize (vp + 2, ArdourCanvas::Duple (0, 0));
|
||||
|
||||
ArdourCanvas::Points::size_type n = 0;
|
||||
|
||||
/* potentially insert front hidden (line) point to make the line draw from
|
||||
* zero to the first actual point
|
||||
*/
|
||||
|
||||
_view_index_offset = 0;
|
||||
|
||||
if (control_points[0]->get_x() != 0 && preceding != e.end()) {
|
||||
double ty = model_to_view_coord_y (e.unlocked_eval (_offset));
|
||||
|
||||
if (isnan_local (ty)) {
|
||||
warning << string_compose (_("Ignoring illegal points on AutomationLine \"%1\""), _name) << endmsg;
|
||||
|
||||
|
||||
} else {
|
||||
line_points[n].y = _height - (ty * _height);
|
||||
line_points[n].x = 0;
|
||||
_view_index_offset = 1;
|
||||
++n;
|
||||
}
|
||||
while (line_points.size() < vp) {
|
||||
line_points.push_back (ArdourCanvas::Duple (0,0));
|
||||
}
|
||||
|
||||
for (auto const & cp : control_points) {
|
||||
line_points[n].x = cp->get_x();
|
||||
line_points[n].y = cp->get_y();
|
||||
++n;
|
||||
while (line_points.size() > vp) {
|
||||
line_points.pop_back ();
|
||||
}
|
||||
|
||||
/* potentially insert final hidden (line) point to make the line draw
|
||||
* from the last point to the very end
|
||||
*/
|
||||
|
||||
double px = trackview.editor().duration_to_pixels_unrounded (model_to_view_coord_x (_offset + _maximum_time));
|
||||
|
||||
if (control_points[control_points.size() - 1]->get_x() != px && following != e.end()) {
|
||||
double ty = model_to_view_coord_y (e.unlocked_eval (_offset + _maximum_time));
|
||||
|
||||
if (isnan_local (ty)) {
|
||||
warning << string_compose (_("Ignoring illegal points on AutomationLine \"%1\""), _name) << endmsg;
|
||||
|
||||
|
||||
} else {
|
||||
line_points[n].y = _height - (ty * _height);
|
||||
line_points[n].x = px;
|
||||
++n;
|
||||
}
|
||||
for (uint32_t n = 0; n < vp; ++n) {
|
||||
line_points[n].x = control_points[n]->get_x();
|
||||
line_points[n].y = control_points[n]->get_y();
|
||||
}
|
||||
|
||||
line_points.resize (n);
|
||||
line->set_steps (line_points, is_stepped());
|
||||
|
||||
update_visibility ();
|
||||
|
@ -1201,7 +1072,7 @@ AutomationLine::reset ()
|
|||
{
|
||||
DEBUG_TRACE (DEBUG::Automation, "\t\tLINE RESET\n");
|
||||
update_pending = false;
|
||||
have_reset_timeout = false;
|
||||
have_timeout = false;
|
||||
|
||||
if (no_draw) {
|
||||
return;
|
||||
|
@ -1226,10 +1097,10 @@ AutomationLine::queue_reset ()
|
|||
if (trackview.editor().session()->transport_rolling() && alist->automation_write()) {
|
||||
/* automation write pass ... defer to a timeout */
|
||||
/* redraw in 1/4 second */
|
||||
if (!have_reset_timeout) {
|
||||
if (!have_timeout) {
|
||||
DEBUG_TRACE (DEBUG::Automation, "\tqueue timeout\n");
|
||||
Glib::signal_timeout().connect (sigc::bind_return (sigc::mem_fun (*this, &AutomationLine::reset), false), 250);
|
||||
have_reset_timeout = true;
|
||||
have_timeout = true;
|
||||
} else {
|
||||
DEBUG_TRACE (DEBUG::Automation, "\ttimeout already queued, change ignored\n");
|
||||
}
|
||||
|
@ -1250,7 +1121,7 @@ AutomationLine::clear ()
|
|||
}
|
||||
|
||||
void
|
||||
AutomationLine::set_list (std::shared_ptr<ARDOUR::AutomationList> list)
|
||||
AutomationLine::set_list (boost::shared_ptr<ARDOUR::AutomationList> list)
|
||||
{
|
||||
alist = list;
|
||||
queue_reset ();
|
||||
|
@ -1358,8 +1229,8 @@ AutomationLine::apply_delta (double& val, double delta) const
|
|||
val = _desc.apply_delta (val, delta);
|
||||
}
|
||||
|
||||
double
|
||||
AutomationLine::model_to_view_coord_y (double y) const
|
||||
void
|
||||
AutomationLine::model_to_view_coord_y (double& y) const
|
||||
{
|
||||
if (alist->default_interpolation () != alist->interpolation()) {
|
||||
switch (alist->interpolation()) {
|
||||
|
@ -1368,7 +1239,8 @@ AutomationLine::model_to_view_coord_y (double y) const
|
|||
assert (alist->default_interpolation () == AutomationList::Linear);
|
||||
break;
|
||||
case AutomationList::Linear:
|
||||
return (y - _desc.lower) / (_desc.upper - _desc.lower);
|
||||
y = (y - _desc.lower) / (_desc.upper - _desc.lower);
|
||||
return;
|
||||
default:
|
||||
/* types that default to linear, can't be use
|
||||
* Logarithmic or Exponential interpolation.
|
||||
|
@ -1378,22 +1250,15 @@ AutomationLine::model_to_view_coord_y (double y) const
|
|||
break;
|
||||
}
|
||||
}
|
||||
return _desc.to_interface (y);
|
||||
y = _desc.to_interface (y);
|
||||
}
|
||||
|
||||
timecnt_t
|
||||
AutomationLine::model_to_view_coord_x (timepos_t const & when) const
|
||||
timepos_t
|
||||
AutomationLine::model_to_view_coord (Evoral::ControlEvent const & ev, double& y) const
|
||||
{
|
||||
/* @param when is a distance (with implicit origin) from the start of the
|
||||
* source. So we subtract the offset (from the region if this is
|
||||
* related to a region; zero otherwise) to get the distance (again,
|
||||
* implicit origin) from the start of the line.
|
||||
*
|
||||
* Then we construct a timecnt_t from this duration, and the origin of
|
||||
* the line on the timeline.
|
||||
*/
|
||||
|
||||
return timecnt_t (when.earlier (_offset), get_origin());
|
||||
Temporal::timepos_t w (ev.when);
|
||||
model_to_view_coord_y (y);
|
||||
return (w).earlier (_offset);
|
||||
}
|
||||
|
||||
/** Called when our list has announced that its interpolation style has changed */
|
||||
|
@ -1453,18 +1318,6 @@ AutomationLine::add_visible_control_point (uint32_t view_index, uint32_t pi, dou
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
AutomationLine::dump (std::ostream& ostr) const
|
||||
{
|
||||
for (auto const & cp : control_points) {
|
||||
if (cp->model() != alist->end()) {
|
||||
ostr << '#' << cp->view_index() << " @ " << cp->get_x() << ", " << cp->get_y() << " for " << (*cp->model())->value << " @ " << (*(cp->model()))->when << std::endl;
|
||||
} else {
|
||||
ostr << "dead point\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
AutomationLine::connect_to_list ()
|
||||
{
|
||||
|
@ -1521,6 +1374,10 @@ AutomationLine::session_position (timepos_t const & when) const
|
|||
void
|
||||
AutomationLine::set_offset (timepos_t const & off)
|
||||
{
|
||||
if (_offset == off) {
|
||||
return;
|
||||
}
|
||||
|
||||
_offset = off;
|
||||
reset ();
|
||||
}
|
||||
|
|
|
@ -68,7 +68,7 @@ public:
|
|||
AutomationLine (const std::string& name,
|
||||
TimeAxisView& tv,
|
||||
ArdourCanvas::Item& parent,
|
||||
std::shared_ptr<ARDOUR::AutomationList> al,
|
||||
boost::shared_ptr<ARDOUR::AutomationList> al,
|
||||
const ARDOUR::ParameterDescriptor& desc);
|
||||
|
||||
|
||||
|
@ -92,9 +92,8 @@ public:
|
|||
virtual void start_drag_single (ControlPoint*, double, float);
|
||||
virtual void start_drag_line (uint32_t, uint32_t, float);
|
||||
virtual void start_drag_multiple (std::list<ControlPoint*>, float, XMLNode *);
|
||||
virtual std::pair<float, float> drag_motion (Temporal::timecnt_t const &, float, bool, bool with_push, uint32_t& final_index);
|
||||
virtual std::pair<float, float> drag_motion (double, float, bool, bool with_push, uint32_t& final_index);
|
||||
virtual void end_drag (bool with_push, uint32_t final_index);
|
||||
virtual void end_draw_merge () {}
|
||||
|
||||
ControlPoint* nth (uint32_t);
|
||||
ControlPoint const * nth (uint32_t) const;
|
||||
|
@ -104,8 +103,8 @@ public:
|
|||
bool visible() const { return _visible != VisibleAspects(0); }
|
||||
guint32 height() const { return _height; }
|
||||
|
||||
void set_line_color (std::string color, std::string mod = "");
|
||||
uint32_t get_line_color() const;
|
||||
void set_line_color (uint32_t);
|
||||
uint32_t get_line_color() const { return _line_color; }
|
||||
|
||||
void set_visibility (VisibleAspects);
|
||||
void add_visibility (VisibleAspects);
|
||||
|
@ -115,7 +114,6 @@ public:
|
|||
void set_height (guint32);
|
||||
|
||||
bool get_uses_gain_mapping () const;
|
||||
void tempo_map_changed ();
|
||||
|
||||
TimeAxisView& trackview;
|
||||
|
||||
|
@ -128,17 +126,15 @@ public:
|
|||
std::string fraction_to_string (double) const;
|
||||
std::string delta_to_string (double) const;
|
||||
double string_to_fraction (std::string const &) const;
|
||||
|
||||
void view_to_model_coord_y (double &) const;
|
||||
|
||||
double model_to_view_coord_y (double) const;
|
||||
Temporal::timecnt_t model_to_view_coord_x (Temporal::timepos_t const &) const;
|
||||
Temporal::timepos_t model_to_view_coord (Evoral::ControlEvent const &, double& y) const;
|
||||
void model_to_view_coord_y (double &) const;
|
||||
|
||||
double compute_delta (double from, double to) const;
|
||||
void apply_delta (double& val, double delta) const;
|
||||
|
||||
void set_list(std::shared_ptr<ARDOUR::AutomationList> list);
|
||||
std::shared_ptr<ARDOUR::AutomationList> the_list() const { return alist; }
|
||||
void set_list(boost::shared_ptr<ARDOUR::AutomationList> list);
|
||||
boost::shared_ptr<ARDOUR::AutomationList> the_list() const { return alist; }
|
||||
|
||||
void track_entered();
|
||||
void track_exited();
|
||||
|
@ -150,7 +146,7 @@ public:
|
|||
int set_state (const XMLNode&, int version);
|
||||
void set_colors();
|
||||
|
||||
void modify_points_y (std::vector<ControlPoint*> const&, double);
|
||||
void modify_point_y (ControlPoint&, double);
|
||||
|
||||
virtual MementoCommandBinder<ARDOUR::AutomationList>* memento_command_binder ();
|
||||
|
||||
|
@ -166,24 +162,20 @@ public:
|
|||
void set_width (Temporal::timecnt_t const &);
|
||||
|
||||
Temporal::timepos_t session_position (Temporal::timepos_t const &) const;
|
||||
void dump (std::ostream&) const;
|
||||
|
||||
double dt_to_dx (Temporal::timepos_t const &, Temporal::timecnt_t const &);
|
||||
|
||||
protected:
|
||||
|
||||
std::string _name;
|
||||
guint32 _height;
|
||||
std::string _line_color;
|
||||
std::string _line_color_mod;
|
||||
uint32_t _view_index_offset;
|
||||
std::shared_ptr<ARDOUR::AutomationList> alist;
|
||||
uint32_t _line_color;
|
||||
|
||||
boost::shared_ptr<ARDOUR::AutomationList> alist;
|
||||
|
||||
VisibleAspects _visible;
|
||||
|
||||
bool terminal_points_can_slide;
|
||||
bool update_pending;
|
||||
bool have_reset_timeout;
|
||||
bool have_timeout;
|
||||
bool no_draw;
|
||||
bool _is_boolean;
|
||||
/** true if we did a push at any point during the current drag */
|
||||
|
@ -198,18 +190,18 @@ protected:
|
|||
class ContiguousControlPoints : public std::list<ControlPoint*> {
|
||||
public:
|
||||
ContiguousControlPoints (AutomationLine& al);
|
||||
Temporal::timecnt_t clamp_dt (Temporal::timecnt_t const & dx, Temporal::timepos_t const & region_limit);
|
||||
void move (Temporal::timecnt_t const &, double dvalue);
|
||||
double clamp_dx (double dx);
|
||||
void move (double dx, double dvalue);
|
||||
void compute_x_bounds (PublicEditor& e);
|
||||
private:
|
||||
AutomationLine& line;
|
||||
Temporal::timepos_t before_x;
|
||||
Temporal::timepos_t after_x;
|
||||
double before_x;
|
||||
double after_x;
|
||||
};
|
||||
|
||||
friend class ContiguousControlPoints;
|
||||
|
||||
typedef std::shared_ptr<ContiguousControlPoints> CCP;
|
||||
typedef boost::shared_ptr<ContiguousControlPoints> CCP;
|
||||
std::vector<CCP> contiguous_points;
|
||||
|
||||
bool sync_model_with_view_point (ControlPoint&);
|
||||
|
@ -225,6 +217,8 @@ private:
|
|||
std::list<ControlPoint*> _drag_points; ///< points we are dragging
|
||||
std::list<ControlPoint*> _push_points; ///< additional points we are dragging if "push" is enabled
|
||||
bool _drag_had_movement; ///< true if the drag has seen movement, otherwise false
|
||||
double _drag_x; ///< last x position of the drag, in units
|
||||
double _drag_distance; ///< total x movement of the drag, in canvas units
|
||||
double _last_drag_fraction; ///< last y position of the drag, as a fraction
|
||||
/** offset from the start of the automation list to the start of the line, so that
|
||||
* a +ve offset means that the 0 on the line is at _offset in the list
|
||||
|
@ -249,7 +243,6 @@ private:
|
|||
const ARDOUR::ParameterDescriptor _desc;
|
||||
|
||||
friend class AudioRegionGainLine;
|
||||
friend class RegionFxLine;
|
||||
};
|
||||
|
||||
#endif /* __ardour_automation_line_h__ */
|
||||
|
|
|
@ -38,7 +38,6 @@
|
|||
#include "editor.h"
|
||||
#include "editor_drag.h"
|
||||
#include "gui_thread.h"
|
||||
#include "mergeable_line.h"
|
||||
#include "midi_automation_line.h"
|
||||
#include "public_editor.h"
|
||||
#include "ui_config.h"
|
||||
|
@ -49,9 +48,9 @@ using namespace Temporal;
|
|||
|
||||
AutomationRegionView::AutomationRegionView (ArdourCanvas::Container* parent,
|
||||
AutomationTimeAxisView& time_axis,
|
||||
std::shared_ptr<ARDOUR::Region> region,
|
||||
boost::shared_ptr<ARDOUR::Region> region,
|
||||
const Evoral::Parameter& param,
|
||||
std::shared_ptr<ARDOUR::AutomationList> list,
|
||||
boost::shared_ptr<ARDOUR::AutomationList> list,
|
||||
double spu,
|
||||
uint32_t basic_color)
|
||||
: RegionView(parent, time_axis, region, spu, basic_color, true)
|
||||
|
@ -88,18 +87,17 @@ AutomationRegionView::init (bool /*wfd*/)
|
|||
|
||||
set_height (trackview.current_height());
|
||||
|
||||
fill_color_name = "midi frame base";
|
||||
set_colors ();
|
||||
|
||||
get_canvas_frame()->set_data ("linemerger", (LineMerger*) this);
|
||||
}
|
||||
|
||||
void
|
||||
AutomationRegionView::create_line (std::shared_ptr<ARDOUR::AutomationList> list)
|
||||
AutomationRegionView::create_line (boost::shared_ptr<ARDOUR::AutomationList> list)
|
||||
{
|
||||
_line = std::shared_ptr<AutomationLine> (new MidiAutomationLine(
|
||||
_line = boost::shared_ptr<AutomationLine> (new MidiAutomationLine(
|
||||
ARDOUR::EventTypeMap::instance().to_symbol(list->parameter()),
|
||||
trackview, *get_canvas_group(), list,
|
||||
std::dynamic_pointer_cast<ARDOUR::MidiRegion> (_region),
|
||||
boost::dynamic_pointer_cast<ARDOUR::MidiRegion> (_region),
|
||||
_parameter));
|
||||
_line->set_colors();
|
||||
_line->set_height ((uint32_t)rint(trackview.current_height() - 2.5 - NAME_HIGHLIGHT_SIZE));
|
||||
|
@ -112,11 +110,12 @@ uint32_t
|
|||
AutomationRegionView::get_fill_color() const
|
||||
{
|
||||
const std::string mod_name = (_dragging ? "dragging region" :
|
||||
trackview.editor().internal_editing() ? "editable region" : fill_color_name);
|
||||
trackview.editor().internal_editing() ? "editable region" :
|
||||
"midi frame base");
|
||||
if (_selected) {
|
||||
return UIConfiguration::instance().color_mod ("selected region base", mod_name);
|
||||
} else if (high_enough_for_name || !UIConfiguration::instance().get_color_regions_using_track_color()) {
|
||||
return UIConfiguration::instance().color_mod (fill_color_name, mod_name);
|
||||
return UIConfiguration::instance().color_mod ("midi frame base", mod_name);
|
||||
}
|
||||
return UIConfiguration::instance().color_mod (fill_color, mod_name);
|
||||
}
|
||||
|
@ -135,40 +134,49 @@ AutomationRegionView::canvas_group_event (GdkEvent* ev)
|
|||
return false;
|
||||
}
|
||||
|
||||
PublicEditor& e = trackview.editor ();
|
||||
|
||||
if (trackview.editor().internal_editing() &&
|
||||
ev->type == GDK_BUTTON_RELEASE &&
|
||||
ev->button.button == 1 &&
|
||||
e.current_mouse_mode() == Editing::MouseDraw &&
|
||||
!e.drags()->active()) {
|
||||
|
||||
double x = ev->button.x;
|
||||
double y = ev->button.y;
|
||||
|
||||
/* convert to item coordinates in the time axis view */
|
||||
automation_view()->canvas_display()->canvas_to_item (x, y);
|
||||
|
||||
/* clamp y */
|
||||
y = std::max (y, 0.0);
|
||||
y = std::min (y, _height - NAME_HIGHLIGHT_SIZE);
|
||||
|
||||
/* guard points only if primary modifier is used */
|
||||
bool with_guard_points = Gtkmm2ext::Keyboard::modifier_state_equals (ev->button.state, Gtkmm2ext::Keyboard::PrimaryModifier);
|
||||
|
||||
/* the time domain doesn't matter here, because the automation
|
||||
* list will force the position to its own time domain when
|
||||
* adding the point.
|
||||
*/
|
||||
|
||||
const timepos_t pos = timepos_t (e.pixel_to_sample (x) - _region->position_sample() + _region->start_sample());
|
||||
|
||||
add_automation_event (ev, pos, y, with_guard_points);
|
||||
return true;
|
||||
}
|
||||
|
||||
return RegionView::canvas_group_event (ev);
|
||||
}
|
||||
|
||||
void
|
||||
AutomationRegionView::add_automation_event (GdkEvent* ev)
|
||||
{
|
||||
double x = ev->button.x;
|
||||
double y = ev->button.y;
|
||||
|
||||
/* convert to item coordinates in the time axis view */
|
||||
automation_view()->canvas_display()->canvas_to_item (x, y);
|
||||
|
||||
/* clamp y */
|
||||
y = std::max (y, 0.0);
|
||||
y = std::min (y, _height - NAME_HIGHLIGHT_SIZE);
|
||||
|
||||
/* the time domain doesn't matter here, because the automation
|
||||
* list will force the position to its own time domain when
|
||||
* adding the point.
|
||||
*/
|
||||
|
||||
PublicEditor& e = trackview.editor ();
|
||||
|
||||
add_automation_event (timepos_t (e.pixel_to_sample (x)), y, false);
|
||||
}
|
||||
|
||||
/** @param when Position is global time position
|
||||
/** @param when Position in samples, where 0 is the start of the region.
|
||||
* @param y y position, relative to our TimeAxisView.
|
||||
*/
|
||||
void
|
||||
AutomationRegionView::add_automation_event (timepos_t const & w, double y, bool with_guard_points)
|
||||
AutomationRegionView::add_automation_event (GdkEvent *, timepos_t const & w, double y, bool with_guard_points)
|
||||
{
|
||||
std::shared_ptr<Evoral::Control> c = _region->control(_parameter, true);
|
||||
std::shared_ptr<ARDOUR::AutomationControl> ac = std::dynamic_pointer_cast<ARDOUR::AutomationControl>(c);
|
||||
boost::shared_ptr<Evoral::Control> c = _region->control(_parameter, true);
|
||||
boost::shared_ptr<ARDOUR::AutomationControl> ac = boost::dynamic_pointer_cast<ARDOUR::AutomationControl>(c);
|
||||
timepos_t when (w); /* the non-const copy */
|
||||
|
||||
if (!_line) {
|
||||
|
@ -184,7 +192,7 @@ AutomationRegionView::add_automation_event (timepos_t const & w, double y, bool
|
|||
|
||||
/* snap time */
|
||||
|
||||
when = snap_region_time_to_region_time (_region->source_position().distance (when), false);
|
||||
when = snap_region_time_to_region_time (_region->start().distance (when), false) + _region->start ();
|
||||
|
||||
/* map using line */
|
||||
|
||||
|
@ -192,9 +200,9 @@ AutomationRegionView::add_automation_event (timepos_t const & w, double y, bool
|
|||
|
||||
if (c->list()->size () == 0) {
|
||||
/* we need the MidiTrack::MidiControl, not the region's (midi model source) control */
|
||||
std::shared_ptr<ARDOUR::MidiTrack> mt = std::dynamic_pointer_cast<ARDOUR::MidiTrack> (view->parent_stripable ());
|
||||
boost::shared_ptr<ARDOUR::MidiTrack> mt = boost::dynamic_pointer_cast<ARDOUR::MidiTrack> (view->parent_stripable ());
|
||||
assert (mt);
|
||||
std::shared_ptr<Evoral::Control> mc = mt->control(_parameter);
|
||||
boost::shared_ptr<Evoral::Control> mc = mt->control(_parameter);
|
||||
assert (mc);
|
||||
y = mc->get_double ();
|
||||
} else if (UIConfiguration::instance().get_new_automation_points_on_lane()) {
|
||||
|
@ -227,12 +235,12 @@ bool
|
|||
AutomationRegionView::paste (timepos_t const & pos,
|
||||
unsigned paste_count,
|
||||
float times,
|
||||
std::shared_ptr<const ARDOUR::AutomationList> slist)
|
||||
boost::shared_ptr<const ARDOUR::AutomationList> slist)
|
||||
{
|
||||
using namespace ARDOUR;
|
||||
|
||||
AutomationTimeAxisView* const view = automation_view();
|
||||
std::shared_ptr<ARDOUR::AutomationList> my_list = _line->the_list();
|
||||
boost::shared_ptr<ARDOUR::AutomationList> my_list = _line->the_list();
|
||||
|
||||
if (view->session()->transport_rolling() && my_list->automation_write()) {
|
||||
/* do not paste if this control is in write mode and we're rolling */
|
||||
|
@ -245,19 +253,13 @@ AutomationRegionView::paste (timepos_t const & pos
|
|||
/* add multi-paste offset if applicable */
|
||||
p += view->editor ().get_paste_offset (pos, paste_count > 0 ? 1 : 0, len);
|
||||
|
||||
timepos_t model_pos = pos;
|
||||
|
||||
/* potentially snap */
|
||||
|
||||
view->editor().snap_to (model_pos, Temporal::RoundNearest);
|
||||
|
||||
/* convert timeline position to model's (source-relative) position */
|
||||
|
||||
model_pos = timepos_t (_region->source_position().distance (model_pos));
|
||||
/* convert sample-position to model's unit and position */
|
||||
timepos_t model_pos = timepos_t (source_relative_distance (timecnt_t (p, timepos_t()), slist->time_domain()));
|
||||
|
||||
XMLNode& before = my_list->get_state();
|
||||
my_list->paste (*slist, model_pos);
|
||||
view->session()->add_command(new MementoCommand<ARDOUR::AutomationList>(_line->memento_command_binder(), &before, &my_list->get_state()));
|
||||
view->session()->add_command(
|
||||
new MementoCommand<ARDOUR::AutomationList>(_line->memento_command_binder(), &before, &my_list->get_state()));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -289,10 +291,11 @@ AutomationRegionView::reset_width_dependent_items (double pixel_width)
|
|||
RegionView::reset_width_dependent_items(pixel_width);
|
||||
|
||||
if (_line) {
|
||||
_line->reset ();
|
||||
_line->reset();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
AutomationRegionView::region_resized (const PBD::PropertyChange& what_changed)
|
||||
{
|
||||
|
@ -311,16 +314,6 @@ AutomationRegionView::region_resized (const PBD::PropertyChange& what_changed)
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
AutomationRegionView::tempo_map_changed ()
|
||||
{
|
||||
if (_line) {
|
||||
_line->tempo_map_changed ();
|
||||
}
|
||||
|
||||
set_position (_region->position(), 0, 0);
|
||||
set_duration (_region->length(), 0);
|
||||
}
|
||||
|
||||
void
|
||||
AutomationRegionView::entered ()
|
||||
|
@ -338,28 +331,3 @@ AutomationRegionView::exited ()
|
|||
_line->track_exited();
|
||||
}
|
||||
}
|
||||
void
|
||||
AutomationRegionView::set_selected (bool yn)
|
||||
{
|
||||
/* don't call RegionView::set_selected() because for automation
|
||||
* regionviews, we don't use visual "clues" to indicate selection.
|
||||
*/
|
||||
|
||||
if (yn && _parameter.type() == ARDOUR::MidiCCAutomation) {
|
||||
group->raise_to_top ();
|
||||
}
|
||||
}
|
||||
|
||||
timepos_t
|
||||
AutomationRegionView::drawn_time_filter (timepos_t const & t)
|
||||
{
|
||||
return timepos_t (_region->absolute_time_to_source_beats (t));
|
||||
}
|
||||
|
||||
MergeableLine*
|
||||
AutomationRegionView::make_merger()
|
||||
{
|
||||
std::shared_ptr<Evoral::Control> c = _region->control(_parameter, true);
|
||||
std::shared_ptr<ARDOUR::AutomationControl> ac = std::dynamic_pointer_cast<ARDOUR::AutomationControl>(c);
|
||||
return new MergeableLine (_line, ac, boost::bind (&AutomationRegionView::drawn_time_filter, this, _1), nullptr, nullptr);
|
||||
}
|
||||
|
|
|
@ -27,7 +27,6 @@
|
|||
#include "automation_time_axis.h"
|
||||
#include "automation_line.h"
|
||||
#include "enums.h"
|
||||
#include "line_merger.h"
|
||||
|
||||
namespace ARDOUR {
|
||||
class AutomationList;
|
||||
|
@ -36,14 +35,14 @@ namespace ARDOUR {
|
|||
|
||||
class TimeAxisView;
|
||||
|
||||
class AutomationRegionView : public RegionView, public LineMerger
|
||||
class AutomationRegionView : public RegionView
|
||||
{
|
||||
public:
|
||||
AutomationRegionView(ArdourCanvas::Container*,
|
||||
AutomationTimeAxisView&,
|
||||
std::shared_ptr<ARDOUR::Region>,
|
||||
boost::shared_ptr<ARDOUR::Region>,
|
||||
const Evoral::Parameter& parameter,
|
||||
std::shared_ptr<ARDOUR::AutomationList>,
|
||||
boost::shared_ptr<ARDOUR::AutomationList>,
|
||||
double initial_samples_per_pixel,
|
||||
uint32_t basic_color);
|
||||
|
||||
|
@ -51,17 +50,15 @@ public:
|
|||
|
||||
void init (bool wfd);
|
||||
|
||||
void set_selected (bool yn);
|
||||
|
||||
bool paste (Temporal::timepos_t const & pos,
|
||||
unsigned paste_count,
|
||||
float times,
|
||||
std::shared_ptr<const ARDOUR::AutomationList> slist);
|
||||
boost::shared_ptr<const ARDOUR::AutomationList> slist);
|
||||
|
||||
inline AutomationTimeAxisView* automation_view() const
|
||||
{ return dynamic_cast<AutomationTimeAxisView*>(&trackview); }
|
||||
|
||||
std::shared_ptr<AutomationLine> line() { return _line; }
|
||||
boost::shared_ptr<AutomationLine> line() { return _line; }
|
||||
|
||||
// We are a ghost. Meta ghosts? Crazy talk.
|
||||
virtual GhostRegion* add_ghost(TimeAxisView&) { return 0; }
|
||||
|
@ -71,19 +68,12 @@ public:
|
|||
void set_height (double);
|
||||
void reset_width_dependent_items(double pixel_width);
|
||||
|
||||
void tempo_map_changed ();
|
||||
|
||||
MergeableLine* make_merger ();
|
||||
|
||||
void add_automation_event (GdkEvent* event);
|
||||
Temporal::timepos_t drawn_time_filter (Temporal::timepos_t const &);
|
||||
|
||||
protected:
|
||||
void create_line(std::shared_ptr<ARDOUR::AutomationList> list);
|
||||
void create_line(boost::shared_ptr<ARDOUR::AutomationList> list);
|
||||
bool set_position(Temporal::timepos_t const & pos, void* src, double* ignored);
|
||||
void region_resized (const PBD::PropertyChange&);
|
||||
bool canvas_group_event(GdkEvent* ev);
|
||||
void add_automation_event (Temporal::timepos_t const & when, double y, bool with_guard_points);
|
||||
void add_automation_event (GdkEvent* event, Temporal::timepos_t const & when, double y, bool with_guard_points);
|
||||
void mouse_mode_changed ();
|
||||
void entered();
|
||||
void exited();
|
||||
|
@ -91,7 +81,7 @@ protected:
|
|||
|
||||
private:
|
||||
Evoral::Parameter _parameter;
|
||||
std::shared_ptr<AutomationLine> _line;
|
||||
boost::shared_ptr<AutomationLine> _line;
|
||||
PBD::ScopedConnection _mouse_mode_connection;
|
||||
};
|
||||
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
#include "ardour/automation_list.h"
|
||||
#include "evoral/Parameter.h"
|
||||
|
||||
class AutomationSelection : public std::list<std::shared_ptr<ARDOUR::AutomationList> > {
|
||||
class AutomationSelection : public std::list<boost::shared_ptr<ARDOUR::AutomationList> > {
|
||||
public:
|
||||
const_iterator
|
||||
get_nth(const Evoral::Parameter& param, size_t nth) const {
|
||||
|
|
|
@ -73,38 +73,38 @@ AutomationStreamView::~AutomationStreamView ()
|
|||
|
||||
|
||||
RegionView*
|
||||
AutomationStreamView::add_region_view_internal (std::shared_ptr<Region> region, bool /*wait_for_data*/, bool /*recording*/)
|
||||
AutomationStreamView::add_region_view_internal (boost::shared_ptr<Region> region, bool /*wait_for_data*/, bool /*recording*/)
|
||||
{
|
||||
if (!region) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::shared_ptr<AutomationList> list;
|
||||
|
||||
const std::shared_ptr<AutomationControl> control = std::dynamic_pointer_cast<AutomationControl> (
|
||||
const boost::shared_ptr<AutomationControl> control = boost::dynamic_pointer_cast<AutomationControl> (
|
||||
region->control (_automation_view.parameter(), true)
|
||||
);
|
||||
|
||||
boost::shared_ptr<AutomationList> list;
|
||||
if (control) {
|
||||
list = std::dynamic_pointer_cast<AutomationList>(control->list());
|
||||
list = boost::dynamic_pointer_cast<AutomationList>(control->list());
|
||||
if (control->list() && !list) {
|
||||
error << _("unable to display automation region for control without list") << endmsg;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
RegionView *region_view;
|
||||
AutomationRegionView *region_view;
|
||||
std::list<RegionView *>::iterator i;
|
||||
|
||||
for (auto const & rv : region_views) {
|
||||
if (rv->region() == region) {
|
||||
for (i = region_views.begin(); i != region_views.end(); ++i) {
|
||||
if ((*i)->region() == region) {
|
||||
|
||||
/* great. we already have an AutomationRegionView for this Region. use it again. */
|
||||
AutomationRegionView* arv = dynamic_cast<AutomationRegionView*>(rv);;
|
||||
AutomationRegionView* arv = dynamic_cast<AutomationRegionView*>(*i);;
|
||||
|
||||
if (arv->line()) {
|
||||
arv->line()->set_list (list);
|
||||
}
|
||||
rv->set_valid (true);
|
||||
(*i)->set_valid (true);
|
||||
display_region (arv);
|
||||
|
||||
return 0;
|
||||
|
@ -125,14 +125,12 @@ AutomationStreamView::add_region_view_internal (std::shared_ptr<Region> region,
|
|||
display_region (region_view);
|
||||
|
||||
/* catch regionview going away */
|
||||
region->DropReferences.connect (*this, invalidator (*this), boost::bind (&AutomationStreamView::remove_region_view, this, std::weak_ptr<Region>(region)), gui_context());
|
||||
region->DropReferences.connect (*this, invalidator (*this), boost::bind (&AutomationStreamView::remove_region_view, this, boost::weak_ptr<Region>(region)), gui_context());
|
||||
|
||||
/* setup automation state for this region */
|
||||
if (_automation_view.parameter().type() != MidiVelocityAutomation) {
|
||||
std::shared_ptr<AutomationLine> line = dynamic_cast<AutomationRegionView*>(region_view)->line ();
|
||||
if (line && line->the_list()) {
|
||||
line->the_list()->set_automation_state (automation_state ());
|
||||
}
|
||||
boost::shared_ptr<AutomationLine> line = region_view->line ();
|
||||
if (line && line->the_list()) {
|
||||
line->the_list()->set_automation_state (automation_state ());
|
||||
}
|
||||
|
||||
RegionViewAdded (region_view);
|
||||
|
@ -141,11 +139,9 @@ AutomationStreamView::add_region_view_internal (std::shared_ptr<Region> region,
|
|||
}
|
||||
|
||||
void
|
||||
AutomationStreamView::display_region (RegionView* region_view)
|
||||
AutomationStreamView::display_region(AutomationRegionView* region_view)
|
||||
{
|
||||
if (_automation_view.parameter().type() != MidiVelocityAutomation) {
|
||||
dynamic_cast<AutomationRegionView*>(region_view)->line().reset();
|
||||
}
|
||||
region_view->line().reset();
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -156,9 +152,9 @@ AutomationStreamView::set_automation_state (AutoState state)
|
|||
if (region_views.empty()) {
|
||||
_pending_automation_state = state;
|
||||
} else {
|
||||
list<std::shared_ptr<AutomationLine> > lines = get_lines ();
|
||||
list<boost::shared_ptr<AutomationLine> > lines = get_lines ();
|
||||
|
||||
for (list<std::shared_ptr<AutomationLine> >::iterator i = lines.begin(); i != lines.end(); ++i) {
|
||||
for (list<boost::shared_ptr<AutomationLine> >::iterator i = lines.begin(); i != lines.end(); ++i) {
|
||||
if ((*i)->the_list()) {
|
||||
(*i)->the_list()->set_automation_state (state);
|
||||
}
|
||||
|
@ -211,7 +207,7 @@ AutomationStreamView::automation_state () const
|
|||
return _pending_automation_state;
|
||||
}
|
||||
|
||||
std::shared_ptr<AutomationLine> line = ((AutomationRegionView*) region_views.front())->line ();
|
||||
boost::shared_ptr<AutomationLine> line = ((AutomationRegionView*) region_views.front())->line ();
|
||||
if (!line || !line->the_list()) {
|
||||
return Off;
|
||||
}
|
||||
|
@ -222,9 +218,9 @@ AutomationStreamView::automation_state () const
|
|||
bool
|
||||
AutomationStreamView::has_automation () const
|
||||
{
|
||||
list<std::shared_ptr<AutomationLine> > lines = get_lines ();
|
||||
list<boost::shared_ptr<AutomationLine> > lines = get_lines ();
|
||||
|
||||
for (list<std::shared_ptr<AutomationLine> >::iterator i = lines.begin(); i != lines.end(); ++i) {
|
||||
for (list<boost::shared_ptr<AutomationLine> >::iterator i = lines.begin(); i != lines.end(); ++i) {
|
||||
if ((*i)->npoints() > 0) {
|
||||
return true;
|
||||
}
|
||||
|
@ -239,9 +235,9 @@ AutomationStreamView::has_automation () const
|
|||
void
|
||||
AutomationStreamView::set_interpolation (AutomationList::InterpolationStyle s)
|
||||
{
|
||||
list<std::shared_ptr<AutomationLine> > lines = get_lines ();
|
||||
list<boost::shared_ptr<AutomationLine> > lines = get_lines ();
|
||||
|
||||
for (list<std::shared_ptr<AutomationLine> >::iterator i = lines.begin(); i != lines.end(); ++i) {
|
||||
for (list<boost::shared_ptr<AutomationLine> >::iterator i = lines.begin(); i != lines.end(); ++i) {
|
||||
(*i)->the_list()->set_interpolation (s);
|
||||
}
|
||||
}
|
||||
|
@ -264,9 +260,9 @@ AutomationStreamView::interpolation () const
|
|||
void
|
||||
AutomationStreamView::clear ()
|
||||
{
|
||||
list<std::shared_ptr<AutomationLine> > lines = get_lines ();
|
||||
list<boost::shared_ptr<AutomationLine> > lines = get_lines ();
|
||||
|
||||
for (list<std::shared_ptr<AutomationLine> >::iterator i = lines.begin(); i != lines.end(); ++i) {
|
||||
for (list<boost::shared_ptr<AutomationLine> >::iterator i = lines.begin(); i != lines.end(); ++i) {
|
||||
(*i)->clear ();
|
||||
}
|
||||
}
|
||||
|
@ -292,17 +288,17 @@ AutomationStreamView::get_selectables (timepos_t const & start, timepos_t const
|
|||
void
|
||||
AutomationStreamView::set_selected_points (PointSelection& ps)
|
||||
{
|
||||
list<std::shared_ptr<AutomationLine> > lines = get_lines ();
|
||||
list<boost::shared_ptr<AutomationLine> > lines = get_lines ();
|
||||
|
||||
for (list<std::shared_ptr<AutomationLine> >::iterator i = lines.begin(); i != lines.end(); ++i) {
|
||||
for (list<boost::shared_ptr<AutomationLine> >::iterator i = lines.begin(); i != lines.end(); ++i) {
|
||||
(*i)->set_selected_points (ps);
|
||||
}
|
||||
}
|
||||
|
||||
list<std::shared_ptr<AutomationLine> >
|
||||
list<boost::shared_ptr<AutomationLine> >
|
||||
AutomationStreamView::get_lines () const
|
||||
{
|
||||
list<std::shared_ptr<AutomationLine> > lines;
|
||||
list<boost::shared_ptr<AutomationLine> > lines;
|
||||
|
||||
for (list<RegionView*>::const_iterator i = region_views.begin(); i != region_views.end(); ++i) {
|
||||
AutomationRegionView* arv = dynamic_cast<AutomationRegionView*> (*i);
|
||||
|
@ -318,7 +314,7 @@ bool
|
|||
AutomationStreamView::paste (timepos_t const & pos,
|
||||
unsigned paste_count,
|
||||
float times,
|
||||
std::shared_ptr<ARDOUR::AutomationList> alist)
|
||||
boost::shared_ptr<ARDOUR::AutomationList> alist)
|
||||
{
|
||||
/* XXX: not sure how best to pick this; for now, just use the last region which starts before pos */
|
||||
|
||||
|
@ -337,7 +333,7 @@ AutomationStreamView::paste (timepos_t const & pos,
|
|||
prev = i;
|
||||
}
|
||||
|
||||
std::shared_ptr<Region> r = (*prev)->region ();
|
||||
boost::shared_ptr<Region> r = (*prev)->region ();
|
||||
|
||||
/* If *prev doesn't cover pos, it's no good */
|
||||
if (r->position() > pos || ((r->position() + r->length()) < pos)) {
|
||||
|
|
|
@ -66,18 +66,18 @@ public:
|
|||
void get_selectables (Temporal::timepos_t const &, Temporal::timepos_t const &, double, double, std::list<Selectable*> &, bool within = false);
|
||||
void set_selected_points (PointSelection &);
|
||||
|
||||
std::list<std::shared_ptr<AutomationLine> > get_lines () const;
|
||||
std::list<boost::shared_ptr<AutomationLine> > get_lines () const;
|
||||
|
||||
bool paste (Temporal::timepos_t const & pos,
|
||||
unsigned paste_count,
|
||||
float times,
|
||||
std::shared_ptr<ARDOUR::AutomationList> list);
|
||||
boost::shared_ptr<ARDOUR::AutomationList> list);
|
||||
|
||||
private:
|
||||
void setup_rec_box ();
|
||||
|
||||
RegionView* add_region_view_internal (std::shared_ptr<ARDOUR::Region>, bool wait_for_data, bool recording = false);
|
||||
void display_region (RegionView* region_view);
|
||||
RegionView* add_region_view_internal (boost::shared_ptr<ARDOUR::Region>, bool wait_for_data, bool recording = false);
|
||||
void display_region(AutomationRegionView* region_view);
|
||||
|
||||
void color_handler ();
|
||||
|
||||
|
|
|
@ -56,9 +56,7 @@
|
|||
|
||||
#include "automation_time_axis.h"
|
||||
#include "automation_streamview.h"
|
||||
#include "ghostregion.h"
|
||||
#include "gui_thread.h"
|
||||
#include "mergeable_line.h"
|
||||
#include "route_time_axis.h"
|
||||
#include "automation_line.h"
|
||||
#include "paste_context.h"
|
||||
|
@ -85,6 +83,7 @@ using namespace Editing;
|
|||
Pango::FontDescription AutomationTimeAxisView::name_font;
|
||||
bool AutomationTimeAxisView::have_name_font = false;
|
||||
|
||||
|
||||
/** \a a the automatable object this time axis is to display data for.
|
||||
* For route/track automation (e.g. gain) pass the route for both \r and \a.
|
||||
* For route child (e.g. plugin) automation, pass the child for \a.
|
||||
|
@ -92,9 +91,9 @@ bool AutomationTimeAxisView::have_name_font = false;
|
|||
*/
|
||||
AutomationTimeAxisView::AutomationTimeAxisView (
|
||||
Session* s,
|
||||
std::shared_ptr<Stripable> strip,
|
||||
std::shared_ptr<Automatable> a,
|
||||
std::shared_ptr<AutomationControl> c,
|
||||
boost::shared_ptr<Stripable> strip,
|
||||
boost::shared_ptr<Automatable> a,
|
||||
boost::shared_ptr<AutomationControl> c,
|
||||
Evoral::Parameter p,
|
||||
PublicEditor& e,
|
||||
TimeAxisView& parent,
|
||||
|
@ -113,7 +112,6 @@ AutomationTimeAxisView::AutomationTimeAxisView (
|
|||
, _view (show_regions ? new AutomationStreamView (*this) : 0)
|
||||
, auto_dropdown ()
|
||||
, _show_regions (show_regions)
|
||||
, _velocity_mode (VelocityModeLollipops)
|
||||
{
|
||||
//concatenate plugin name and param name into the tooltip
|
||||
string tipname = nomparent;
|
||||
|
@ -167,7 +165,6 @@ AutomationTimeAxisView::AutomationTimeAxisView (
|
|||
_base_rect->set_outline (false);
|
||||
_base_rect->set_fill_color (UIConfiguration::instance().color_mod (fill_color_name, "automation track fill"));
|
||||
_base_rect->set_data ("trackview", this);
|
||||
_base_rect->set_data ("linemerger", (LineMerger*) this);
|
||||
_base_rect->Event.connect (sigc::bind (sigc::mem_fun (_editor, &PublicEditor::canvas_automation_track_event), _base_rect, this));
|
||||
if (!a) {
|
||||
_base_rect->lower_to_bottom();
|
||||
|
@ -233,13 +230,8 @@ AutomationTimeAxisView::AutomationTimeAxisView (
|
|||
/* add the buttons */
|
||||
controls_table.set_border_width (0);
|
||||
controls_table.attach (hide_button, 1, 2, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 0, 0);
|
||||
|
||||
if (show_automation_controls()) {
|
||||
controls_table.attach (name_label, 2, 3, 1, 3, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 2, 0);
|
||||
controls_table.attach (auto_dropdown, 3, 4, 2, 3, Gtk::SHRINK, Gtk::SHRINK, 0, 0);
|
||||
} else {
|
||||
controls_table.attach (name_label, 3, 4, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 2, 0);
|
||||
}
|
||||
controls_table.attach (name_label, 2, 3, 1, 3, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 2, 0);
|
||||
controls_table.attach (auto_dropdown, 3, 4, 2, 3, Gtk::SHRINK, Gtk::SHRINK, 0, 0);
|
||||
|
||||
Gtk::DrawingArea *blank0 = manage (new Gtk::DrawingArea());
|
||||
Gtk::DrawingArea *blank1 = manage (new Gtk::DrawingArea());
|
||||
|
@ -280,7 +272,7 @@ AutomationTimeAxisView::AutomationTimeAxisView (
|
|||
name_label.show ();
|
||||
hide_button.show ();
|
||||
|
||||
if (show_automation_controls() && _controller) {
|
||||
if (_controller) {
|
||||
_controller->disable_vertical_scroll ();
|
||||
controls_table.attach (*_controller.get(), 2, 4, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 0, 0);
|
||||
}
|
||||
|
@ -295,39 +287,6 @@ AutomationTimeAxisView::AutomationTimeAxisView (
|
|||
controls_ebox.set_name (controls_base_unselected_name);
|
||||
time_axis_frame.set_name (controls_base_unselected_name);
|
||||
|
||||
add_contents (show_regions);
|
||||
|
||||
/* make sure labels etc. are correct */
|
||||
|
||||
automation_state_changed ();
|
||||
UIConfiguration::instance().ColorsChanged.connect (sigc::mem_fun (*this, &AutomationTimeAxisView::color_handler));
|
||||
|
||||
_stripable->DropReferences.connect (
|
||||
_stripable_connections, invalidator (*this), boost::bind (&AutomationTimeAxisView::route_going_away, this), gui_context ()
|
||||
);
|
||||
|
||||
set_velocity_mode (_velocity_mode, true);
|
||||
}
|
||||
|
||||
AutomationTimeAxisView::~AutomationTimeAxisView ()
|
||||
{
|
||||
if (_stripable) {
|
||||
cleanup_gui_properties ();
|
||||
}
|
||||
delete _view;
|
||||
CatchDeletion (this);
|
||||
}
|
||||
|
||||
bool
|
||||
AutomationTimeAxisView::show_automation_controls() const
|
||||
{
|
||||
return (_parameter.type() != MidiVelocityAutomation) || (velocity_mode() != VelocityModeLollipops);
|
||||
}
|
||||
|
||||
void
|
||||
AutomationTimeAxisView::add_contents (bool show_regions)
|
||||
{
|
||||
|
||||
/* ask for notifications of any new RegionViews */
|
||||
if (show_regions) {
|
||||
|
||||
|
@ -340,7 +299,7 @@ AutomationTimeAxisView::add_contents (bool show_regions)
|
|||
|
||||
assert (_control);
|
||||
|
||||
std::shared_ptr<AutomationLine> line (
|
||||
boost::shared_ptr<AutomationLine> line (
|
||||
new AutomationLine (
|
||||
ARDOUR::EventTypeMap::instance().to_symbol(_parameter),
|
||||
*this,
|
||||
|
@ -350,11 +309,29 @@ AutomationTimeAxisView::add_contents (bool show_regions)
|
|||
)
|
||||
);
|
||||
|
||||
line->set_line_color ("processor automation line");
|
||||
line->set_line_color (UIConfiguration::instance().color ("processor automation line"));
|
||||
line->set_fill (true);
|
||||
line->queue_reset ();
|
||||
add_line (line);
|
||||
}
|
||||
|
||||
/* make sure labels etc. are correct */
|
||||
|
||||
automation_state_changed ();
|
||||
UIConfiguration::instance().ColorsChanged.connect (sigc::mem_fun (*this, &AutomationTimeAxisView::color_handler));
|
||||
|
||||
_stripable->DropReferences.connect (
|
||||
_stripable_connections, invalidator (*this), boost::bind (&AutomationTimeAxisView::route_going_away, this), gui_context ()
|
||||
);
|
||||
}
|
||||
|
||||
AutomationTimeAxisView::~AutomationTimeAxisView ()
|
||||
{
|
||||
if (_stripable) {
|
||||
cleanup_gui_properties ();
|
||||
}
|
||||
delete _view;
|
||||
CatchDeletion (this);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -373,7 +350,8 @@ AutomationTimeAxisView::set_automation_state (AutoState state)
|
|||
|
||||
if (_automatable) {
|
||||
_automatable->set_parameter_automation_state (_parameter, state);
|
||||
} else if (_control) {
|
||||
}
|
||||
else if (_control) {
|
||||
_control->set_automation_state (state);
|
||||
_session->set_dirty ();
|
||||
}
|
||||
|
@ -601,7 +579,7 @@ AutomationTimeAxisView::update_name_from_param ()
|
|||
* -> instrument_info().get_controller_name()
|
||||
* It does not work with parent/plug_name for plugins.
|
||||
*/
|
||||
std::shared_ptr<ARDOUR::Route> r = std::dynamic_pointer_cast<ARDOUR::Route> (_stripable);
|
||||
boost::shared_ptr<ARDOUR::Route> r = boost::dynamic_pointer_cast<ARDOUR::Route> (_stripable);
|
||||
if (!r) {
|
||||
return;
|
||||
}
|
||||
|
@ -639,7 +617,7 @@ AutomationTimeAxisView::hide_clicked ()
|
|||
string
|
||||
AutomationTimeAxisView::automation_state_off_string () const
|
||||
{
|
||||
if (parameter_is_midi(_parameter.type ()) || _parameter == Evoral::Parameter (MidiVelocityAutomation)) {
|
||||
if (parameter_is_midi(_parameter.type ())) {
|
||||
return S_("Automation|Off");
|
||||
}
|
||||
|
||||
|
@ -659,135 +637,118 @@ AutomationTimeAxisView::build_display_menu ()
|
|||
|
||||
MenuList& items = display_menu->items();
|
||||
|
||||
if (_parameter == Evoral::Parameter (MidiVelocityAutomation)) {
|
||||
RadioMenuItem::Group mode_group;
|
||||
items.push_back (RadioMenuElem (mode_group, _("Lollipops"), sigc::bind (sigc::mem_fun (*this, &AutomationTimeAxisView::set_velocity_mode), VelocityModeLollipops, false)));
|
||||
if (velocity_mode() == VelocityModeLollipops) {
|
||||
dynamic_cast<Gtk::CheckMenuItem*> (&items.back())->set_active (true);
|
||||
}
|
||||
items.push_back (RadioMenuElem (mode_group, _("Line"), sigc::bind (sigc::mem_fun (*this, &AutomationTimeAxisView::set_velocity_mode), VelocityModeLine, false)));
|
||||
if (velocity_mode() == VelocityModeLine) {
|
||||
dynamic_cast<Gtk::CheckMenuItem*> (&items.back())->set_active (true);
|
||||
}
|
||||
items.push_back (SeparatorElem());
|
||||
}
|
||||
|
||||
items.push_back (MenuElem (_("Hide"), sigc::mem_fun(*this, &AutomationTimeAxisView::hide_clicked)));
|
||||
items.push_back (SeparatorElem());
|
||||
items.push_back (MenuElem (_("Clear"), sigc::mem_fun(*this, &AutomationTimeAxisView::clear_clicked)));
|
||||
items.push_back (SeparatorElem());
|
||||
|
||||
if (_parameter != Evoral::Parameter (MidiVelocityAutomation)) {
|
||||
/* state menu */
|
||||
|
||||
items.push_back (MenuElem (_("Clear"), sigc::mem_fun(*this, &AutomationTimeAxisView::clear_clicked)));
|
||||
items.push_back (SeparatorElem());
|
||||
Menu* auto_state_menu = manage (new Menu);
|
||||
auto_state_menu->set_name ("ArdourContextMenu");
|
||||
MenuList& as_items = auto_state_menu->items();
|
||||
|
||||
/* state menu */
|
||||
as_items.push_back (CheckMenuElem (automation_state_off_string(), sigc::bind (
|
||||
sigc::mem_fun(*this, &AutomationTimeAxisView::set_automation_state),
|
||||
(AutoState) ARDOUR::Off)));
|
||||
auto_off_item = dynamic_cast<Gtk::CheckMenuItem*>(&as_items.back());
|
||||
|
||||
Menu* auto_state_menu = manage (new Menu);
|
||||
auto_state_menu->set_name ("ArdourContextMenu");
|
||||
MenuList& as_items = auto_state_menu->items();
|
||||
as_items.push_back (CheckMenuElem (_("Play"), sigc::bind (
|
||||
sigc::mem_fun(*this, &AutomationTimeAxisView::set_automation_state),
|
||||
(AutoState) Play)));
|
||||
auto_play_item = dynamic_cast<Gtk::CheckMenuItem*>(&as_items.back());
|
||||
|
||||
as_items.push_back (CheckMenuElem (automation_state_off_string(), sigc::bind (
|
||||
if (!parameter_is_midi(_parameter.type ())) {
|
||||
as_items.push_back (CheckMenuElem (_("Write"), sigc::bind (
|
||||
sigc::mem_fun(*this, &AutomationTimeAxisView::set_automation_state),
|
||||
(AutoState) ARDOUR::Off)));
|
||||
auto_off_item = dynamic_cast<Gtk::CheckMenuItem*>(&as_items.back());
|
||||
(AutoState) Write)));
|
||||
auto_write_item = dynamic_cast<Gtk::CheckMenuItem*>(&as_items.back());
|
||||
|
||||
as_items.push_back (CheckMenuElem (_("Play"), sigc::bind (
|
||||
as_items.push_back (CheckMenuElem (_("Touch"), sigc::bind (
|
||||
sigc::mem_fun(*this, &AutomationTimeAxisView::set_automation_state),
|
||||
(AutoState) Play)));
|
||||
auto_play_item = dynamic_cast<Gtk::CheckMenuItem*>(&as_items.back());
|
||||
(AutoState) Touch)));
|
||||
auto_touch_item = dynamic_cast<Gtk::CheckMenuItem*>(&as_items.back());
|
||||
|
||||
if (!parameter_is_midi(_parameter.type ())) {
|
||||
as_items.push_back (CheckMenuElem (_("Write"), sigc::bind (
|
||||
sigc::mem_fun(*this, &AutomationTimeAxisView::set_automation_state),
|
||||
(AutoState) Write)));
|
||||
auto_write_item = dynamic_cast<Gtk::CheckMenuItem*>(&as_items.back());
|
||||
|
||||
as_items.push_back (CheckMenuElem (_("Touch"), sigc::bind (
|
||||
sigc::mem_fun(*this, &AutomationTimeAxisView::set_automation_state),
|
||||
(AutoState) Touch)));
|
||||
auto_touch_item = dynamic_cast<Gtk::CheckMenuItem*>(&as_items.back());
|
||||
|
||||
as_items.push_back (CheckMenuElem (_("Latch"), sigc::bind (
|
||||
sigc::mem_fun(*this, &AutomationTimeAxisView::set_automation_state),
|
||||
(AutoState) Latch)));
|
||||
auto_latch_item = dynamic_cast<Gtk::CheckMenuItem*>(&as_items.back());
|
||||
}
|
||||
|
||||
items.push_back (MenuElem (_("State"), *auto_state_menu));
|
||||
|
||||
/* mode menu */
|
||||
|
||||
/* current interpolation state */
|
||||
AutomationList::InterpolationStyle const s = _view ? _view->interpolation() : _control->list()->interpolation ();
|
||||
|
||||
if (ARDOUR::parameter_is_midi((AutomationType)_parameter.type())) {
|
||||
|
||||
Menu* auto_mode_menu = manage (new Menu);
|
||||
auto_mode_menu->set_name ("ArdourContextMenu");
|
||||
MenuList& am_items = auto_mode_menu->items();
|
||||
|
||||
RadioMenuItem::Group group;
|
||||
|
||||
am_items.push_back (RadioMenuElem (group, _("Discrete"), sigc::bind (
|
||||
sigc::mem_fun(*this, &AutomationTimeAxisView::set_interpolation),
|
||||
AutomationList::Discrete)));
|
||||
mode_discrete_item = dynamic_cast<Gtk::CheckMenuItem*>(&am_items.back());
|
||||
|
||||
am_items.push_back (RadioMenuElem (group, _("Linear"), sigc::bind (
|
||||
sigc::mem_fun(*this, &AutomationTimeAxisView::set_interpolation),
|
||||
AutomationList::Linear)));
|
||||
mode_line_item = dynamic_cast<Gtk::CheckMenuItem*>(&am_items.back());
|
||||
|
||||
items.push_back (MenuElem (_("Mode"), *auto_mode_menu));
|
||||
|
||||
} else {
|
||||
|
||||
Menu* auto_mode_menu = manage (new Menu);
|
||||
auto_mode_menu->set_name ("ArdourContextMenu");
|
||||
MenuList& am_items = auto_mode_menu->items();
|
||||
bool have_options = false;
|
||||
|
||||
RadioMenuItem::Group group;
|
||||
|
||||
am_items.push_back (RadioMenuElem (group, _("Linear"), sigc::bind (
|
||||
sigc::mem_fun(*this, &AutomationTimeAxisView::set_interpolation),
|
||||
AutomationList::Linear)));
|
||||
mode_line_item = dynamic_cast<Gtk::CheckMenuItem*>(&am_items.back());
|
||||
|
||||
if (_control->desc().logarithmic) {
|
||||
am_items.push_back (RadioMenuElem (group, _("Logarithmic"), sigc::bind (
|
||||
sigc::mem_fun(*this, &AutomationTimeAxisView::set_interpolation),
|
||||
AutomationList::Logarithmic)));
|
||||
mode_log_item = dynamic_cast<Gtk::CheckMenuItem*>(&am_items.back());
|
||||
have_options = true;
|
||||
} else {
|
||||
mode_log_item = 0;
|
||||
}
|
||||
|
||||
if (_line->get_uses_gain_mapping () && !_control->desc().logarithmic) {
|
||||
am_items.push_back (RadioMenuElem (group, _("Exponential"), sigc::bind (
|
||||
sigc::mem_fun(*this, &AutomationTimeAxisView::set_interpolation),
|
||||
AutomationList::Exponential)));
|
||||
mode_exp_item = dynamic_cast<Gtk::CheckMenuItem*>(&am_items.back());
|
||||
have_options = true;
|
||||
} else {
|
||||
mode_exp_item = 0;
|
||||
}
|
||||
|
||||
if (have_options) {
|
||||
items.push_back (MenuElem (_("Interpolation"), *auto_mode_menu));
|
||||
} else {
|
||||
mode_line_item = 0;
|
||||
delete auto_mode_menu;
|
||||
auto_mode_menu = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* make sure the automation menu state is correct */
|
||||
|
||||
automation_state_changed ();
|
||||
interpolation_changed (s);
|
||||
as_items.push_back (CheckMenuElem (_("Latch"), sigc::bind (
|
||||
sigc::mem_fun(*this, &AutomationTimeAxisView::set_automation_state),
|
||||
(AutoState) Latch)));
|
||||
auto_latch_item = dynamic_cast<Gtk::CheckMenuItem*>(&as_items.back());
|
||||
}
|
||||
|
||||
items.push_back (MenuElem (_("State"), *auto_state_menu));
|
||||
|
||||
/* mode menu */
|
||||
|
||||
/* current interpolation state */
|
||||
AutomationList::InterpolationStyle const s = _view ? _view->interpolation() : _control->list()->interpolation ();
|
||||
|
||||
if (ARDOUR::parameter_is_midi((AutomationType)_parameter.type())) {
|
||||
|
||||
Menu* auto_mode_menu = manage (new Menu);
|
||||
auto_mode_menu->set_name ("ArdourContextMenu");
|
||||
MenuList& am_items = auto_mode_menu->items();
|
||||
|
||||
RadioMenuItem::Group group;
|
||||
|
||||
am_items.push_back (RadioMenuElem (group, _("Discrete"), sigc::bind (
|
||||
sigc::mem_fun(*this, &AutomationTimeAxisView::set_interpolation),
|
||||
AutomationList::Discrete)));
|
||||
mode_discrete_item = dynamic_cast<Gtk::CheckMenuItem*>(&am_items.back());
|
||||
|
||||
am_items.push_back (RadioMenuElem (group, _("Linear"), sigc::bind (
|
||||
sigc::mem_fun(*this, &AutomationTimeAxisView::set_interpolation),
|
||||
AutomationList::Linear)));
|
||||
mode_line_item = dynamic_cast<Gtk::CheckMenuItem*>(&am_items.back());
|
||||
|
||||
items.push_back (MenuElem (_("Mode"), *auto_mode_menu));
|
||||
|
||||
} else {
|
||||
|
||||
Menu* auto_mode_menu = manage (new Menu);
|
||||
auto_mode_menu->set_name ("ArdourContextMenu");
|
||||
MenuList& am_items = auto_mode_menu->items();
|
||||
bool have_options = false;
|
||||
|
||||
RadioMenuItem::Group group;
|
||||
|
||||
am_items.push_back (RadioMenuElem (group, _("Linear"), sigc::bind (
|
||||
sigc::mem_fun(*this, &AutomationTimeAxisView::set_interpolation),
|
||||
AutomationList::Linear)));
|
||||
mode_line_item = dynamic_cast<Gtk::CheckMenuItem*>(&am_items.back());
|
||||
|
||||
if (_control->desc().logarithmic) {
|
||||
am_items.push_back (RadioMenuElem (group, _("Logarithmic"), sigc::bind (
|
||||
sigc::mem_fun(*this, &AutomationTimeAxisView::set_interpolation),
|
||||
AutomationList::Logarithmic)));
|
||||
mode_log_item = dynamic_cast<Gtk::CheckMenuItem*>(&am_items.back());
|
||||
have_options = true;
|
||||
} else {
|
||||
mode_log_item = 0;
|
||||
}
|
||||
|
||||
if (_line->get_uses_gain_mapping () && !_control->desc().logarithmic) {
|
||||
am_items.push_back (RadioMenuElem (group, _("Exponential"), sigc::bind (
|
||||
sigc::mem_fun(*this, &AutomationTimeAxisView::set_interpolation),
|
||||
AutomationList::Exponential)));
|
||||
mode_exp_item = dynamic_cast<Gtk::CheckMenuItem*>(&am_items.back());
|
||||
have_options = true;
|
||||
} else {
|
||||
mode_exp_item = 0;
|
||||
}
|
||||
|
||||
if (have_options) {
|
||||
items.push_back (MenuElem (_("Interpolation"), *auto_mode_menu));
|
||||
} else {
|
||||
mode_line_item = 0;
|
||||
delete auto_mode_menu;
|
||||
auto_mode_menu = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* make sure the automation menu state is correct */
|
||||
|
||||
automation_state_changed ();
|
||||
interpolation_changed (s);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -797,7 +758,7 @@ AutomationTimeAxisView::add_automation_event (GdkEvent* event, timepos_t const &
|
|||
return;
|
||||
}
|
||||
|
||||
std::shared_ptr<AutomationList> list = _line->the_list ();
|
||||
boost::shared_ptr<AutomationList> list = _line->the_list ();
|
||||
|
||||
if (list->in_write_pass()) {
|
||||
/* do not allow the GUI to add automation events during an
|
||||
|
@ -873,7 +834,7 @@ AutomationTimeAxisView::paste (timepos_t const & pos, const Selection& selection
|
|||
bool
|
||||
AutomationTimeAxisView::paste_one (timepos_t const & pos, unsigned paste_count, float times, const Selection& selection, ItemCounts& counts, bool greedy)
|
||||
{
|
||||
std::shared_ptr<AutomationList> alist(_line->the_list());
|
||||
boost::shared_ptr<AutomationList> alist(_line->the_list());
|
||||
|
||||
if (_session->transport_rolling() && alist->automation_write()) {
|
||||
/* do not paste if this control is in write mode and we're rolling */
|
||||
|
@ -987,7 +948,7 @@ AutomationTimeAxisView::clear_lines ()
|
|||
}
|
||||
|
||||
void
|
||||
AutomationTimeAxisView::add_line (std::shared_ptr<AutomationLine> line)
|
||||
AutomationTimeAxisView::add_line (boost::shared_ptr<AutomationLine> line)
|
||||
{
|
||||
if (_control && line) {
|
||||
assert(line->the_list() == _control->list());
|
||||
|
@ -1017,7 +978,7 @@ AutomationTimeAxisView::propagate_time_selection () const
|
|||
/* MIDI automation is part of the MIDI region. It is always
|
||||
* implicily selected with the parent, regardless of TAV selection
|
||||
*/
|
||||
return parameter_is_midi(_parameter.type ()) || _parameter == Evoral::Parameter (MidiVelocityAutomation);
|
||||
return parameter_is_midi(_parameter.type ());
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -1077,10 +1038,10 @@ AutomationTimeAxisView::has_automation () const
|
|||
return ( (_line && _line->npoints() > 0) || (_view && _view->has_automation()) );
|
||||
}
|
||||
|
||||
list<std::shared_ptr<AutomationLine> >
|
||||
list<boost::shared_ptr<AutomationLine> >
|
||||
AutomationTimeAxisView::lines () const
|
||||
{
|
||||
list<std::shared_ptr<AutomationLine> > lines;
|
||||
list<boost::shared_ptr<AutomationLine> > lines;
|
||||
|
||||
if (_line) {
|
||||
lines.push_back (_line);
|
||||
|
@ -1160,14 +1121,14 @@ AutomationTimeAxisView::parse_state_id (
|
|||
void
|
||||
AutomationTimeAxisView::cut_copy_clear (Selection& selection, CutCopyOp op)
|
||||
{
|
||||
list<std::shared_ptr<AutomationLine> > lines;
|
||||
list<boost::shared_ptr<AutomationLine> > lines;
|
||||
if (_line) {
|
||||
lines.push_back (_line);
|
||||
} else if (_view) {
|
||||
lines = _view->get_lines ();
|
||||
}
|
||||
|
||||
for (list<std::shared_ptr<AutomationLine> >::iterator i = lines.begin(); i != lines.end(); ++i) {
|
||||
for (list<boost::shared_ptr<AutomationLine> >::iterator i = lines.begin(); i != lines.end(); ++i) {
|
||||
cut_copy_clear_one (**i, selection, op);
|
||||
}
|
||||
}
|
||||
|
@ -1175,8 +1136,8 @@ AutomationTimeAxisView::cut_copy_clear (Selection& selection, CutCopyOp op)
|
|||
void
|
||||
AutomationTimeAxisView::cut_copy_clear_one (AutomationLine& line, Selection& selection, CutCopyOp op)
|
||||
{
|
||||
std::shared_ptr<Evoral::ControlList> what_we_got;
|
||||
std::shared_ptr<AutomationList> alist (line.the_list());
|
||||
boost::shared_ptr<Evoral::ControlList> what_we_got;
|
||||
boost::shared_ptr<AutomationList> alist (line.the_list());
|
||||
|
||||
XMLNode &before = alist->get_state();
|
||||
|
||||
|
@ -1215,7 +1176,7 @@ AutomationTimeAxisView::cut_copy_clear_one (AutomationLine& line, Selection& sel
|
|||
for (AutomationList::iterator x = what_we_got->begin(); x != what_we_got->end(); ++x) {
|
||||
timepos_t when = (*x)->when;
|
||||
double val = (*x)->value;
|
||||
val = line.model_to_view_coord_y (val);
|
||||
line.model_to_view_coord (**x, val);
|
||||
(*x)->when = when;
|
||||
(*x)->value = val;
|
||||
}
|
||||
|
@ -1228,7 +1189,7 @@ AutomationTimeAxisView::presentation_info () const
|
|||
return _stripable->presentation_info();
|
||||
}
|
||||
|
||||
std::shared_ptr<Stripable>
|
||||
boost::shared_ptr<Stripable>
|
||||
AutomationTimeAxisView::stripable () const
|
||||
{
|
||||
return _stripable;
|
||||
|
@ -1239,53 +1200,3 @@ AutomationTimeAxisView::color () const
|
|||
{
|
||||
return gdk_color_from_rgb (_stripable->presentation_info().color());
|
||||
}
|
||||
|
||||
void
|
||||
AutomationTimeAxisView::set_velocity_mode (VelocityMode vm, bool force)
|
||||
{
|
||||
if (_parameter.type() != MidiVelocityAutomation) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (vm == _velocity_mode && !force) {
|
||||
return;
|
||||
}
|
||||
|
||||
_velocity_mode = vm;
|
||||
switch (_velocity_mode) {
|
||||
case VelocityModeLollipops:
|
||||
_ghost_group->show ();
|
||||
_ghost_group->raise_to_top ();
|
||||
break;
|
||||
case VelocityModeLine:
|
||||
_ghost_group->hide ();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
AutomationTimeAxisView::set_selected_regionviews (RegionSelection& rs)
|
||||
{
|
||||
if (_view) {
|
||||
_view->set_selected_regionviews (rs);
|
||||
}
|
||||
|
||||
if (_parameter.type() != MidiVelocityAutomation) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (auto & ghost : ghosts) {
|
||||
if (std::find (rs.begin(), rs.end(), &ghost->parent_rv) != rs.end()) {
|
||||
ghost->set_selected (true);
|
||||
} else {
|
||||
ghost->set_selected (false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MergeableLine*
|
||||
AutomationTimeAxisView::make_merger ()
|
||||
{
|
||||
return new MergeableLine (_line, _control, nullptr, boost::bind (&AutomationTimeAxisView::set_automation_state, this, _1), boost::bind (RouteTimeAxisView::signal_ctrl_touched, false));
|
||||
}
|
||||
|
||||
|
|
|
@ -27,10 +27,11 @@
|
|||
#define __ardour_gtk_automation_time_axis_h__
|
||||
|
||||
#include <list>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
|
||||
#include <boost/shared_ptr.hpp>
|
||||
|
||||
#include "ardour/types.h"
|
||||
#include "ardour/automatable.h"
|
||||
#include "ardour/automation_list.h"
|
||||
|
@ -40,7 +41,6 @@
|
|||
#include "widgets/ardour_button.h"
|
||||
#include "widgets/ardour_dropdown.h"
|
||||
|
||||
#include "line_merger.h"
|
||||
#include "time_axis_view.h"
|
||||
#include "automation_controller.h"
|
||||
|
||||
|
@ -61,13 +61,13 @@ class AutomationStreamView;
|
|||
class AutomationController;
|
||||
class ItemCounts;
|
||||
|
||||
class AutomationTimeAxisView : public TimeAxisView, public LineMerger
|
||||
class AutomationTimeAxisView : public TimeAxisView
|
||||
{
|
||||
public:
|
||||
AutomationTimeAxisView (ARDOUR::Session*,
|
||||
std::shared_ptr<ARDOUR::Stripable>,
|
||||
std::shared_ptr<ARDOUR::Automatable>,
|
||||
std::shared_ptr<ARDOUR::AutomationControl>,
|
||||
boost::shared_ptr<ARDOUR::Stripable>,
|
||||
boost::shared_ptr<ARDOUR::Automatable>,
|
||||
boost::shared_ptr<ARDOUR::AutomationControl>,
|
||||
Evoral::Parameter,
|
||||
PublicEditor&,
|
||||
TimeAxisView& parent,
|
||||
|
@ -84,7 +84,7 @@ public:
|
|||
Gdk::Color color () const;
|
||||
void update_name_from_param ();
|
||||
|
||||
std::shared_ptr<ARDOUR::Stripable> stripable() const;
|
||||
boost::shared_ptr<ARDOUR::Stripable> stripable() const;
|
||||
ARDOUR::PresentationInfo const & presentation_info () const;
|
||||
|
||||
void add_automation_event (GdkEvent *, Temporal::timepos_t const &, double, bool with_guard_points);
|
||||
|
@ -92,12 +92,10 @@ public:
|
|||
void clear_lines ();
|
||||
|
||||
/** @return Our AutomationLine, if this view has one, or 0 if it uses AutomationRegionViews */
|
||||
std::shared_ptr<AutomationLine> line() { return _line; }
|
||||
boost::shared_ptr<AutomationLine> line() { return _line; }
|
||||
|
||||
/** @return All AutomationLines associated with this view */
|
||||
std::list<std::shared_ptr<AutomationLine> > lines () const;
|
||||
|
||||
AutomationStreamView* automation_view() const { return _view; }
|
||||
std::list<boost::shared_ptr<AutomationLine> > lines () const;
|
||||
|
||||
void set_selected_points (PointSelection&);
|
||||
void get_selectables (Temporal::timepos_t const &, Temporal::timepos_t const &, double top, double bot, std::list<Selectable *>&, bool within = false);
|
||||
|
@ -116,19 +114,19 @@ public:
|
|||
std::string state_id() const;
|
||||
static bool parse_state_id (std::string const &, PBD::ID &, bool &, Evoral::Parameter &);
|
||||
|
||||
std::shared_ptr<ARDOUR::AutomationControl> control() const { return _control; }
|
||||
std::shared_ptr<AutomationController> controller() const { return _controller; }
|
||||
boost::shared_ptr<ARDOUR::AutomationControl> control() const { return _control; }
|
||||
boost::shared_ptr<AutomationController> controller() const { return _controller; }
|
||||
Evoral::Parameter parameter () const {
|
||||
return _parameter;
|
||||
}
|
||||
|
||||
ArdourCanvas::Rectangle& base_item () const {
|
||||
return *_base_rect;
|
||||
ArdourCanvas::Item* base_item () const {
|
||||
return _base_rect;
|
||||
}
|
||||
|
||||
bool has_automation () const;
|
||||
|
||||
std::shared_ptr<ARDOUR::Stripable> parent_stripable () {
|
||||
boost::shared_ptr<ARDOUR::Stripable> parent_stripable () {
|
||||
return _stripable;
|
||||
}
|
||||
|
||||
|
@ -138,35 +136,23 @@ public:
|
|||
|
||||
void set_automation_state (ARDOUR::AutoState);
|
||||
|
||||
enum VelocityMode {
|
||||
VelocityModeLollipops,
|
||||
VelocityModeLine
|
||||
};
|
||||
|
||||
VelocityMode velocity_mode () const { return _velocity_mode; }
|
||||
void set_velocity_mode (VelocityMode, bool force = false);
|
||||
|
||||
void set_selected_regionviews (RegionSelection&);
|
||||
|
||||
MergeableLine* make_merger ();
|
||||
|
||||
protected:
|
||||
/* Note that for MIDI controller "automation" (in regions), all of these
|
||||
* may be set. In this case, _automatable is likely _route so the
|
||||
* controller will send immediate events out the route's MIDI port. */
|
||||
|
||||
/** parent strip */
|
||||
std::shared_ptr<ARDOUR::Stripable> _stripable;
|
||||
boost::shared_ptr<ARDOUR::Stripable> _stripable;
|
||||
/** control */
|
||||
std::shared_ptr<ARDOUR::AutomationControl> _control;
|
||||
boost::shared_ptr<ARDOUR::AutomationControl> _control;
|
||||
/** control owner; may be _stripable, something else (e.g. a pan control), or NULL */
|
||||
std::shared_ptr<ARDOUR::Automatable> _automatable;
|
||||
boost::shared_ptr<ARDOUR::Automatable> _automatable;
|
||||
/** controller owner */
|
||||
std::shared_ptr<AutomationController> _controller;
|
||||
boost::shared_ptr<AutomationController> _controller;
|
||||
Evoral::Parameter _parameter;
|
||||
|
||||
ArdourCanvas::Rectangle* _base_rect;
|
||||
std::shared_ptr<AutomationLine> _line;
|
||||
boost::shared_ptr<AutomationLine> _line;
|
||||
|
||||
std::string _name;
|
||||
|
||||
|
@ -193,7 +179,7 @@ protected:
|
|||
|
||||
bool _show_regions;
|
||||
|
||||
void add_line (std::shared_ptr<AutomationLine>);
|
||||
void add_line (boost::shared_ptr<AutomationLine>);
|
||||
|
||||
void clear_clicked ();
|
||||
void hide_clicked ();
|
||||
|
@ -214,7 +200,6 @@ protected:
|
|||
void automation_state_changed ();
|
||||
|
||||
void set_interpolation (ARDOUR::AutomationList::InterpolationStyle);
|
||||
|
||||
void interpolation_changed (ARDOUR::AutomationList::InterpolationStyle);
|
||||
|
||||
PBD::ScopedConnectionList _list_connections;
|
||||
|
@ -231,12 +216,6 @@ protected:
|
|||
|
||||
std::string automation_state_off_string () const;
|
||||
|
||||
virtual void add_contents (bool show_regions);
|
||||
|
||||
VelocityMode _velocity_mode;
|
||||
|
||||
bool show_automation_controls () const;
|
||||
|
||||
private:
|
||||
int set_state_2X (const XMLNode &, int);
|
||||
};
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
#ifndef __gtk2_ardour_axis_provider_h__
|
||||
#define __gtk2_ardour_axis_provider_h__
|
||||
|
||||
#include <memory>
|
||||
#include <boost/shared_ptr.hpp>
|
||||
|
||||
namespace ARDOUR {
|
||||
class Stripable;
|
||||
|
@ -33,8 +33,8 @@ class AxisViewProvider
|
|||
{
|
||||
public:
|
||||
virtual ~AxisViewProvider () {}
|
||||
virtual AxisView* axis_view_by_stripable (std::shared_ptr<ARDOUR::Stripable>) const = 0;
|
||||
virtual AxisView* axis_view_by_control (std::shared_ptr<ARDOUR::AutomationControl>) const = 0;
|
||||
virtual AxisView* axis_view_by_stripable (boost::shared_ptr<ARDOUR::Stripable>) const = 0;
|
||||
virtual AxisView* axis_view_by_control (boost::shared_ptr<ARDOUR::AutomationControl>) const = 0;
|
||||
};
|
||||
|
||||
#endif /* __gtk2_ardour_axis_provider_h__ */
|
||||
|
|
|
@ -52,6 +52,8 @@ using namespace Gtkmm2ext;
|
|||
using namespace ARDOUR;
|
||||
using namespace ARDOUR_UI_UTILS;
|
||||
|
||||
list<Gdk::Color> AxisView::used_colors;
|
||||
|
||||
AxisView::AxisView ()
|
||||
{
|
||||
}
|
||||
|
@ -61,9 +63,9 @@ AxisView::~AxisView()
|
|||
}
|
||||
|
||||
Gdk::Color
|
||||
AxisView::round_robin_palette_color ()
|
||||
AxisView::unique_random_color()
|
||||
{
|
||||
return ARDOUR_UI_UTILS::round_robin_palette_color ();
|
||||
return ::unique_random_color (used_colors);
|
||||
}
|
||||
|
||||
string
|
||||
|
@ -151,15 +153,12 @@ AxisView::set_name_ellipsize_mode ()
|
|||
switch (UIConfiguration::instance().get_time_axis_name_ellipsize_mode()) {
|
||||
case -1:
|
||||
name_label.set_ellipsize (Pango::ELLIPSIZE_START);
|
||||
inactive_label.set_ellipsize (Pango::ELLIPSIZE_START);
|
||||
break;
|
||||
case 1:
|
||||
name_label.set_ellipsize (Pango::ELLIPSIZE_END);
|
||||
inactive_label.set_ellipsize (Pango::ELLIPSIZE_END);
|
||||
break;
|
||||
default:
|
||||
name_label.set_ellipsize (Pango::ELLIPSIZE_MIDDLE);
|
||||
inactive_label.set_ellipsize (Pango::ELLIPSIZE_MIDDLE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -62,8 +62,8 @@ public:
|
|||
|
||||
sigc::signal<void> Hiding;
|
||||
|
||||
virtual std::shared_ptr<ARDOUR::Stripable> stripable() const = 0;
|
||||
virtual std::shared_ptr<ARDOUR::AutomationControl> control() const { return std::shared_ptr<ARDOUR::AutomationControl>(); }
|
||||
virtual boost::shared_ptr<ARDOUR::Stripable> stripable() const = 0;
|
||||
virtual boost::shared_ptr<ARDOUR::AutomationControl> control() const { return boost::shared_ptr<ARDOUR::AutomationControl>(); }
|
||||
|
||||
virtual std::string state_id() const = 0;
|
||||
/* for now, we always return properties in string form.
|
||||
|
@ -122,12 +122,19 @@ public:
|
|||
static GUIObjectState& gui_object_state();
|
||||
void clear_property_cache() { property_hashtable.clear(); }
|
||||
|
||||
static Gdk::Color round_robin_palette_color ();
|
||||
/**
|
||||
* Generate a new random TrackView color, unique from those colors already used.
|
||||
*
|
||||
* @return the unique random color.
|
||||
*/
|
||||
static Gdk::Color unique_random_color();
|
||||
|
||||
protected:
|
||||
AxisView ();
|
||||
virtual ~AxisView();
|
||||
|
||||
static std::list<Gdk::Color> used_colors;
|
||||
|
||||
Gtk::Label name_label;
|
||||
void set_name_ellipsize_mode ();
|
||||
|
||||
|
|
|
@ -29,13 +29,11 @@ using namespace ARDOUR;
|
|||
using namespace PBD;
|
||||
using namespace Temporal;
|
||||
|
||||
BBTMarkerDialog::BBTMarkerDialog (timepos_t const & pos, BBT_Time const& bbt)
|
||||
BBTMarkerDialog::BBTMarkerDialog (timepos_t const & pos)
|
||||
: ArdourDialog (_("New Music Time"))
|
||||
, _point (0)
|
||||
, _position (pos)
|
||||
, _bbt (bbt)
|
||||
, bar_label (_("Bar"))
|
||||
, beat_label (_("Beat"))
|
||||
, entry_label (_("BBT"))
|
||||
, name_label (_("Name"))
|
||||
|
||||
{
|
||||
|
@ -46,9 +44,7 @@ BBTMarkerDialog::BBTMarkerDialog (MusicTimePoint& p)
|
|||
: ArdourDialog (_("Edit Music Time"))
|
||||
, _point (&p)
|
||||
, _position (timepos_t::from_superclock (p.sclock()))
|
||||
, _bbt (TempoMap::use()->bbt_at (_position).round_to_beat ())
|
||||
, bar_label (_("Bar"))
|
||||
, beat_label (_("Beat"))
|
||||
, entry_label (_("BBT"))
|
||||
, name_label (_("Name"))
|
||||
{
|
||||
init (false);
|
||||
|
@ -57,24 +53,22 @@ BBTMarkerDialog::BBTMarkerDialog (MusicTimePoint& p)
|
|||
void
|
||||
BBTMarkerDialog::init (bool add)
|
||||
{
|
||||
BBT_Time bbt = TempoMap::use()->bbt_at (_position).round_to_beat ();
|
||||
|
||||
bar_entry.set_range (1, 9999);
|
||||
beat_entry.set_range (1, 9999); // XXX (1, time-signature denominator at _position) ?!
|
||||
beat_entry.set_range (1, 9999);
|
||||
bar_entry.set_digits (0);
|
||||
beat_entry.set_digits (0);
|
||||
|
||||
bar_label.set_alignment(Gtk::ALIGN_END, Gtk::ALIGN_CENTER);
|
||||
beat_label.set_alignment(Gtk::ALIGN_END, Gtk::ALIGN_CENTER);
|
||||
bbt_box.pack_start (entry_label);
|
||||
bbt_box.pack_start (bar_entry);
|
||||
bbt_box.pack_start (beat_entry);
|
||||
|
||||
bbt_box.pack_start (bar_label, true, true, 2);
|
||||
bbt_box.pack_start (bar_entry, true, true, 2);
|
||||
bbt_box.pack_start (beat_label, true, true, 2);
|
||||
bbt_box.pack_start (beat_entry, true, true, 2);
|
||||
bar_entry.set_value (bbt.bars);
|
||||
beat_entry.set_value (bbt.beats);
|
||||
|
||||
bar_entry.set_value (_bbt.bars);
|
||||
beat_entry.set_value (_bbt.beats);
|
||||
|
||||
name_box.pack_start (name_label, true, true, 4);
|
||||
name_box.pack_start (name_entry, true, true);
|
||||
name_box.pack_start (name_label);
|
||||
name_box.pack_start (name_entry);
|
||||
|
||||
if (_point) {
|
||||
name_entry.set_text (_point->name());
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
class BBTMarkerDialog : public ArdourDialog
|
||||
{
|
||||
public:
|
||||
BBTMarkerDialog (Temporal::timepos_t const &, Temporal::BBT_Time const&);
|
||||
BBTMarkerDialog (Temporal::timepos_t const &);
|
||||
BBTMarkerDialog (Temporal::MusicTimePoint&);
|
||||
|
||||
Temporal::timepos_t position() const;
|
||||
|
@ -43,14 +43,12 @@ public:
|
|||
private:
|
||||
void init (bool add);
|
||||
Temporal::MusicTimePoint* _point;
|
||||
Temporal::timepos_t _position;
|
||||
Temporal::BBT_Time _bbt;
|
||||
Temporal::timepos_t _position;
|
||||
|
||||
Gtk::HBox bbt_box;
|
||||
Gtk::SpinButton bar_entry;
|
||||
Gtk::SpinButton beat_entry;
|
||||
Gtk::Label bar_label;
|
||||
Gtk::Label beat_label;
|
||||
Gtk::Label entry_label;
|
||||
|
||||
Gtk::HBox name_box;
|
||||
Gtk::Entry name_entry;
|
||||
|
|
|
@ -67,7 +67,7 @@ using std::endl;
|
|||
|
||||
const double _step_dimen = 32;
|
||||
|
||||
BBGUI::BBGUI (std::shared_ptr<BeatBox> bb)
|
||||
BBGUI::BBGUI (boost::shared_ptr<BeatBox> bb)
|
||||
: ArdourDialog (_("BeatBox"))
|
||||
, bbox (bb)
|
||||
, horizontal_adjustment (0.0, 0.0, 800.0)
|
||||
|
@ -178,7 +178,7 @@ void
|
|||
BBGUI::export_as_region ()
|
||||
{
|
||||
std::string path = bbox->session().new_midi_source_path (bbox->owner()->name());
|
||||
std::shared_ptr<Source> src = bbox->sequencer().write_to_source (bbox->session(), path);
|
||||
boost::shared_ptr<Source> src = bbox->sequencer().write_to_source (bbox->session(), path);
|
||||
|
||||
if (!src) {
|
||||
return;
|
||||
|
@ -195,7 +195,7 @@ BBGUI::export_as_region ()
|
|||
plist.add (ARDOUR::Properties::whole_file, true);
|
||||
plist.add (ARDOUR::Properties::external, false);
|
||||
|
||||
std::shared_ptr<Region> region = RegionFactory::create (src, plist, true);
|
||||
boost::shared_ptr<Region> region = RegionFactory::create (src, plist, true);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -601,9 +601,9 @@ void
|
|||
SequencerStepIndicator::set_text ()
|
||||
{
|
||||
if (number == sv.sequencer().end_step() - 1) {
|
||||
text->set (u8"\u21a9");
|
||||
text->set ("\u21a9");
|
||||
} else if (number == sv.sequencer().start_step()) {
|
||||
text->set (u8"\u21aa");
|
||||
text->set ("\u21aa");
|
||||
} else {
|
||||
text->set (string_compose ("%1", number+1));
|
||||
}
|
||||
|
|
|
@ -20,8 +20,8 @@
|
|||
#ifndef __gtk2_ardour_beatbox_gui_h__
|
||||
#define __gtk2_ardour_beatbox_gui_h__
|
||||
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <boost/shared_ptr.hpp>
|
||||
|
||||
#include <gtkmm/radiobutton.h>
|
||||
#include <gtkmm/togglebutton.h>
|
||||
|
@ -252,7 +252,7 @@ class SequencerStepIndicator : public ArdourCanvas::Rectangle, public sigc::trac
|
|||
|
||||
class BBGUI : public ArdourDialog {
|
||||
public:
|
||||
BBGUI (std::shared_ptr<ARDOUR::BeatBox> bb);
|
||||
BBGUI (boost::shared_ptr<ARDOUR::BeatBox> bb);
|
||||
~BBGUI ();
|
||||
|
||||
double width() const { return _width; }
|
||||
|
@ -263,7 +263,7 @@ class BBGUI : public ArdourDialog {
|
|||
void on_unmap ();
|
||||
|
||||
private:
|
||||
std::shared_ptr<ARDOUR::BeatBox> bbox;
|
||||
boost::shared_ptr<ARDOUR::BeatBox> bbox;
|
||||
double _width;
|
||||
double _height;
|
||||
|
||||
|
|
|
@ -54,6 +54,7 @@ using namespace std;
|
|||
|
||||
extern void set_language_preference (); // cocoacarbon.mm
|
||||
extern void no_app_nap (); // cocoacarbon.mm
|
||||
extern int query_darwin_version (); // cocoacarbon.mm
|
||||
|
||||
static void
|
||||
setup_logging (void)
|
||||
|
@ -98,6 +99,13 @@ fixup_bundle_environment (int argc, char* argv[], string & localedir)
|
|||
setup_logging ();
|
||||
}
|
||||
|
||||
if (query_darwin_version () >= 19) {
|
||||
/* on Catalina, do not use NSGLView */
|
||||
g_setenv ("ARDOUR_NSGL", "0", 0);
|
||||
} else {
|
||||
g_setenv ("ARDOUR_NSGL", "1", 0);
|
||||
}
|
||||
|
||||
no_app_nap ();
|
||||
|
||||
if (!g_getenv ("ARDOUR_BUNDLED")) {
|
||||
|
|
|
@ -38,11 +38,11 @@ using namespace std;
|
|||
using namespace ARDOUR;
|
||||
using namespace ARDOUR_UI_UTILS;
|
||||
|
||||
BundleEditorMatrix::BundleEditorMatrix (Gtk::Window* parent, Session* session, std::shared_ptr<Bundle> bundle)
|
||||
BundleEditorMatrix::BundleEditorMatrix (Gtk::Window* parent, Session* session, boost::shared_ptr<Bundle> bundle)
|
||||
: PortMatrix (parent, session, DataType::NIL)
|
||||
, _bundle (bundle)
|
||||
{
|
||||
_port_group = std::shared_ptr<PortGroup> (new PortGroup (""));
|
||||
_port_group = boost::shared_ptr<PortGroup> (new PortGroup (""));
|
||||
_port_group->add_bundle (_bundle);
|
||||
|
||||
setup_all_ports ();
|
||||
|
@ -103,7 +103,7 @@ BundleEditorMatrix::get_state (BundleChannel c[2]) const
|
|||
}
|
||||
|
||||
bool
|
||||
BundleEditorMatrix::can_add_channels (std::shared_ptr<Bundle> b) const
|
||||
BundleEditorMatrix::can_add_channels (boost::shared_ptr<Bundle> b) const
|
||||
{
|
||||
if (b == _bundle) {
|
||||
return true;
|
||||
|
@ -113,7 +113,7 @@ BundleEditorMatrix::can_add_channels (std::shared_ptr<Bundle> b) const
|
|||
}
|
||||
|
||||
bool
|
||||
BundleEditorMatrix::can_add_port (std::shared_ptr<Bundle> b, DataType t) const
|
||||
BundleEditorMatrix::can_add_port (boost::shared_ptr<Bundle> b, DataType t) const
|
||||
{
|
||||
#if 1
|
||||
return true; // anything goes
|
||||
|
@ -124,7 +124,7 @@ BundleEditorMatrix::can_add_port (std::shared_ptr<Bundle> b, DataType t) const
|
|||
}
|
||||
|
||||
void
|
||||
BundleEditorMatrix::add_channel (std::shared_ptr<Bundle> b, DataType t)
|
||||
BundleEditorMatrix::add_channel (boost::shared_ptr<Bundle> b, DataType t)
|
||||
{
|
||||
if (b == _bundle) {
|
||||
|
||||
|
@ -145,7 +145,7 @@ BundleEditorMatrix::add_channel (std::shared_ptr<Bundle> b, DataType t)
|
|||
}
|
||||
|
||||
bool
|
||||
BundleEditorMatrix::can_remove_channels (std::shared_ptr<Bundle> b) const
|
||||
BundleEditorMatrix::can_remove_channels (boost::shared_ptr<Bundle> b) const
|
||||
{
|
||||
if (b != _bundle) {
|
||||
return false;
|
||||
|
@ -161,7 +161,7 @@ BundleEditorMatrix::remove_channel (BundleChannel bc)
|
|||
}
|
||||
|
||||
bool
|
||||
BundleEditorMatrix::can_rename_channels (std::shared_ptr<Bundle> b) const
|
||||
BundleEditorMatrix::can_rename_channels (boost::shared_ptr<Bundle> b) const
|
||||
{
|
||||
if (b == _bundle) {
|
||||
return true;
|
||||
|
@ -194,7 +194,7 @@ BundleEditorMatrix::disassociation_verb () const
|
|||
return _("Disassociate");
|
||||
}
|
||||
|
||||
BundleEditor::BundleEditor (Session* session, std::shared_ptr<UserBundle> bundle)
|
||||
BundleEditor::BundleEditor (Session* session, boost::shared_ptr<UserBundle> bundle)
|
||||
: ArdourDialog (_("Edit Bundle")), _matrix (this, session, bundle), _bundle (bundle)
|
||||
{
|
||||
Gtk::Table* t = new Gtk::Table (3, 2);
|
||||
|
@ -283,9 +283,9 @@ BundleManager::BundleManager (Session* session)
|
|||
_tree_view.append_column (_("Name"), _list_model_columns.name);
|
||||
_tree_view.set_headers_visible (false);
|
||||
|
||||
std::shared_ptr<BundleList const> bundles = _session->bundles ();
|
||||
for (auto const& i : *bundles) {
|
||||
add_bundle (i);
|
||||
boost::shared_ptr<BundleList> bundles = _session->bundles ();
|
||||
for (BundleList::iterator i = bundles->begin(); i != bundles->end(); ++i) {
|
||||
add_bundle (*i);
|
||||
}
|
||||
|
||||
/* New / Edit / Delete buttons */
|
||||
|
@ -338,7 +338,7 @@ BundleManager::set_button_sensitivity ()
|
|||
void
|
||||
BundleManager::new_clicked ()
|
||||
{
|
||||
std::shared_ptr<UserBundle> b (new UserBundle (_("Bundle")));
|
||||
boost::shared_ptr<UserBundle> b (new UserBundle (_("Bundle")));
|
||||
|
||||
/* Start off with a single channel */
|
||||
/* XXX: allow user to specify type */
|
||||
|
@ -356,7 +356,7 @@ BundleManager::edit_clicked ()
|
|||
{
|
||||
Gtk::TreeModel::iterator i = _tree_view.get_selection()->get_selected();
|
||||
if (i) {
|
||||
std::shared_ptr<UserBundle> b = (*i)[_list_model_columns.bundle];
|
||||
boost::shared_ptr<UserBundle> b = (*i)[_list_model_columns.bundle];
|
||||
BundleEditor e (_session, b);
|
||||
e.run ();
|
||||
}
|
||||
|
@ -367,16 +367,16 @@ BundleManager::delete_clicked ()
|
|||
{
|
||||
Gtk::TreeModel::iterator i = _tree_view.get_selection()->get_selected();
|
||||
if (i) {
|
||||
std::shared_ptr<UserBundle> b = (*i)[_list_model_columns.bundle];
|
||||
boost::shared_ptr<UserBundle> b = (*i)[_list_model_columns.bundle];
|
||||
_session->remove_bundle (b);
|
||||
_list_model->erase (i);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
BundleManager::add_bundle (std::shared_ptr<Bundle> b)
|
||||
BundleManager::add_bundle (boost::shared_ptr<Bundle> b)
|
||||
{
|
||||
std::shared_ptr<UserBundle> u = std::dynamic_pointer_cast<UserBundle> (b);
|
||||
boost::shared_ptr<UserBundle> u = boost::dynamic_pointer_cast<UserBundle> (b);
|
||||
if (u == 0) {
|
||||
return;
|
||||
}
|
||||
|
@ -385,20 +385,20 @@ BundleManager::add_bundle (std::shared_ptr<Bundle> b)
|
|||
(*i)[_list_model_columns.name] = u->name ();
|
||||
(*i)[_list_model_columns.bundle] = u;
|
||||
|
||||
u->Changed.connect (bundle_connections, invalidator (*this), boost::bind (&BundleManager::bundle_changed, this, _1, std::weak_ptr<UserBundle> (u)), gui_context());
|
||||
u->Changed.connect (bundle_connections, invalidator (*this), boost::bind (&BundleManager::bundle_changed, this, _1, boost::weak_ptr<UserBundle> (u)), gui_context());
|
||||
}
|
||||
|
||||
void
|
||||
BundleManager::bundle_changed (Bundle::Change c, std::weak_ptr<UserBundle> wb)
|
||||
BundleManager::bundle_changed (Bundle::Change c, boost::weak_ptr<UserBundle> wb)
|
||||
{
|
||||
std::shared_ptr<UserBundle> b = wb.lock ();
|
||||
boost::shared_ptr<UserBundle> b = wb.lock ();
|
||||
if (!b || 0 == (c & Bundle::NameChanged)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Gtk::TreeModel::iterator i = _list_model->children().begin ();
|
||||
while (i != _list_model->children().end()) {
|
||||
std::shared_ptr<UserBundle> t = (*i)[_list_model_columns.bundle];
|
||||
boost::shared_ptr<UserBundle> t = (*i)[_list_model_columns.bundle];
|
||||
if (t == b) {
|
||||
break;
|
||||
}
|
||||
|
@ -418,7 +418,7 @@ BundleManager::row_activated (Gtk::TreeModel::Path const & p, Gtk::TreeViewColum
|
|||
return;
|
||||
}
|
||||
|
||||
std::shared_ptr<UserBundle> b = (*i)[_list_model_columns.bundle];
|
||||
boost::shared_ptr<UserBundle> b = (*i)[_list_model_columns.bundle];
|
||||
BundleEditor e (_session, b);
|
||||
e.run ();
|
||||
}
|
||||
|
@ -430,7 +430,7 @@ NameChannelDialog::NameChannelDialog ()
|
|||
setup ();
|
||||
}
|
||||
|
||||
NameChannelDialog::NameChannelDialog (std::shared_ptr<Bundle> b, uint32_t c)
|
||||
NameChannelDialog::NameChannelDialog (boost::shared_ptr<Bundle> b, uint32_t c)
|
||||
: ArdourDialog (_("Rename Channel")),
|
||||
_bundle (b),
|
||||
_adding (false)
|
||||
|
|
|
@ -38,18 +38,18 @@ namespace ARDOUR {
|
|||
class BundleEditorMatrix : public PortMatrix
|
||||
{
|
||||
public:
|
||||
BundleEditorMatrix (Gtk::Window *, ARDOUR::Session *, std::shared_ptr<ARDOUR::Bundle>);
|
||||
BundleEditorMatrix (Gtk::Window *, ARDOUR::Session *, boost::shared_ptr<ARDOUR::Bundle>);
|
||||
|
||||
void set_state (ARDOUR::BundleChannel c[2], bool s);
|
||||
PortMatrixNode::State get_state (ARDOUR::BundleChannel c[2]) const;
|
||||
|
||||
bool can_add_channels (std::shared_ptr<ARDOUR::Bundle>) const;
|
||||
bool can_add_port (std::shared_ptr<ARDOUR::Bundle>, ARDOUR::DataType t) const;
|
||||
bool can_add_channels (boost::shared_ptr<ARDOUR::Bundle>) const;
|
||||
bool can_add_port (boost::shared_ptr<ARDOUR::Bundle>, ARDOUR::DataType t) const;
|
||||
|
||||
void add_channel (std::shared_ptr<ARDOUR::Bundle>, ARDOUR::DataType);
|
||||
bool can_remove_channels (std::shared_ptr<ARDOUR::Bundle>) const;
|
||||
void add_channel (boost::shared_ptr<ARDOUR::Bundle>, ARDOUR::DataType);
|
||||
bool can_remove_channels (boost::shared_ptr<ARDOUR::Bundle>) const;
|
||||
void remove_channel (ARDOUR::BundleChannel);
|
||||
bool can_rename_channels (std::shared_ptr<ARDOUR::Bundle>) const;
|
||||
bool can_rename_channels (boost::shared_ptr<ARDOUR::Bundle>) const;
|
||||
void rename_channel (ARDOUR::BundleChannel);
|
||||
void setup_ports (int);
|
||||
bool list_is_global (int) const;
|
||||
|
@ -62,14 +62,14 @@ private:
|
|||
OURS = 1
|
||||
};
|
||||
|
||||
std::shared_ptr<PortGroup> _port_group;
|
||||
std::shared_ptr<ARDOUR::Bundle> _bundle;
|
||||
boost::shared_ptr<PortGroup> _port_group;
|
||||
boost::shared_ptr<ARDOUR::Bundle> _bundle;
|
||||
};
|
||||
|
||||
class BundleEditor : public ArdourDialog
|
||||
{
|
||||
public:
|
||||
BundleEditor (ARDOUR::Session *, std::shared_ptr<ARDOUR::UserBundle>);
|
||||
BundleEditor (ARDOUR::Session *, boost::shared_ptr<ARDOUR::UserBundle>);
|
||||
|
||||
protected:
|
||||
void on_map ();
|
||||
|
@ -80,7 +80,7 @@ private:
|
|||
void on_show ();
|
||||
|
||||
BundleEditorMatrix _matrix;
|
||||
std::shared_ptr<ARDOUR::UserBundle> _bundle;
|
||||
boost::shared_ptr<ARDOUR::UserBundle> _bundle;
|
||||
Gtk::Entry _name;
|
||||
Gtk::ComboBoxText _input_or_output;
|
||||
};
|
||||
|
@ -95,8 +95,8 @@ private:
|
|||
void new_clicked ();
|
||||
void edit_clicked ();
|
||||
void delete_clicked ();
|
||||
void add_bundle (std::shared_ptr<ARDOUR::Bundle>);
|
||||
void bundle_changed (ARDOUR::Bundle::Change, std::weak_ptr<ARDOUR::UserBundle>);
|
||||
void add_bundle (boost::shared_ptr<ARDOUR::Bundle>);
|
||||
void bundle_changed (ARDOUR::Bundle::Change, boost::weak_ptr<ARDOUR::UserBundle>);
|
||||
void set_button_sensitivity ();
|
||||
void row_activated (Gtk::TreeModel::Path const & p, Gtk::TreeViewColumn* c);
|
||||
|
||||
|
@ -109,7 +109,7 @@ private:
|
|||
}
|
||||
|
||||
Gtk::TreeModelColumn<std::string> name;
|
||||
Gtk::TreeModelColumn<std::shared_ptr<ARDOUR::UserBundle> > bundle;
|
||||
Gtk::TreeModelColumn<boost::shared_ptr<ARDOUR::UserBundle> > bundle;
|
||||
};
|
||||
|
||||
Gtk::TreeView _tree_view;
|
||||
|
@ -124,7 +124,7 @@ class NameChannelDialog : public ArdourDialog
|
|||
{
|
||||
public:
|
||||
NameChannelDialog ();
|
||||
NameChannelDialog (std::shared_ptr<ARDOUR::Bundle>, uint32_t);
|
||||
NameChannelDialog (boost::shared_ptr<ARDOUR::Bundle>, uint32_t);
|
||||
|
||||
std::string get_name () const;
|
||||
|
||||
|
@ -132,7 +132,7 @@ private:
|
|||
|
||||
void setup ();
|
||||
|
||||
std::shared_ptr<ARDOUR::Bundle> _bundle;
|
||||
boost::shared_ptr<ARDOUR::Bundle> _bundle;
|
||||
Gtk::Entry _name;
|
||||
bool _adding;
|
||||
};
|
||||
|
|
|
@ -163,15 +163,6 @@ style "entry"
|
|||
text[SELECTED] = @fg_selected
|
||||
}
|
||||
|
||||
style "shaded_entry" = "entry"
|
||||
{
|
||||
base[NORMAL] = shade(0.5, @background)
|
||||
base[PRELIGHT] = shade(0.5, @background)
|
||||
base[INSENSITIVE] = shade(0.5, @background)
|
||||
base[ACTIVE] = shade(0.5, @background)
|
||||
base[SELECTED] = shade(0.5, @background)
|
||||
}
|
||||
|
||||
style "spin_button" = "entry"
|
||||
{
|
||||
engine "clearlooks"
|
||||
|
@ -282,7 +273,7 @@ style "inspector_processor_list" = "processor_list"
|
|||
|
||||
style "time_info_box"
|
||||
{
|
||||
bg[NORMAL] = @darkest
|
||||
bg[NORMAL] = { 0.00, 0.00, 0.00 }
|
||||
}
|
||||
|
||||
style "status_bar_box"
|
||||
|
@ -897,7 +888,7 @@ style "track_name_editor" = "medium_text"
|
|||
|
||||
style "track_separator"
|
||||
{
|
||||
bg[NORMAL] = darker(@background)
|
||||
bg[NORMAL] = lighter(@background)
|
||||
}
|
||||
|
||||
# Plugin Editors
|
||||
|
@ -967,12 +958,6 @@ style "processor_list" = "very_small_text"
|
|||
bg[ACTIVE] = shade (1.8, @fg_selected)
|
||||
fg[ACTIVE] = @bases
|
||||
}
|
||||
style "processor_scroller"
|
||||
{
|
||||
bg[ACTIVE] = @bases
|
||||
ythickness = 1
|
||||
xthickness = 0
|
||||
}
|
||||
|
||||
# MixerPanZone:
|
||||
#
|
||||
|
@ -1057,9 +1042,6 @@ style "tooltip" = "medium_text"
|
|||
{
|
||||
fg[NORMAL] = @fg_tooltip
|
||||
bg[NORMAL] = @bg_tooltip
|
||||
bg[SELECTED] = @bg_tooltip
|
||||
xthickness = 4
|
||||
ythickness = 4
|
||||
}
|
||||
|
||||
style "default_toggle_button"
|
||||
|
@ -1172,15 +1154,19 @@ widget "*MidiTrackStripBaseInactive" style:highest "track_header_inactive"
|
|||
widget "*AudioTrackMetrics" style:highest "audio_track_metrics"
|
||||
widget "*MidiTrackMetrics" style:highest "midi_track_metrics"
|
||||
widget "*AudioBusMetrics" style:highest "audio_bus_metrics"
|
||||
widget "*AudioMidiTrackMetrics" style:highest "midi_track_metrics"
|
||||
widget "*AudioTrackMetricsLeft" style:highest "audio_track_metrics"
|
||||
widget "*MidiTrackMetricsLeft" style:highest "midi_track_metrics"
|
||||
widget "*AudioBusMetricsLeft" style:highest "audio_bus_metrics"
|
||||
widget "*AudioMidiTrackMetricsLeft" style:highest "midi_track_metrics"
|
||||
widget "*AudioTrackMetricsRight" style:highest "audio_track_metrics"
|
||||
widget "*MidiTrackMetricsRight" style:highest "midi_track_metrics"
|
||||
widget "*AudioBusMetricsRight" style:highest "audio_bus_metrics"
|
||||
widget "*AudioMidiTrackMetricsRight" style:highest "midi_track_metrics"
|
||||
widget "*AudioTrackMetricsInactive" style:highest "audio_track_metrics_inactive"
|
||||
widget "*MidiTrackMetricsInactive" style:highest "midi_track_metrics_inactive"
|
||||
widget "*AudioBusMetricsInactive" style:highest "audio_bus_metrics_inactive"
|
||||
widget "*AudioMidiTrackMetricsInactive" style:highest "midi_track_metrics_inactive"
|
||||
|
||||
widget "*TimeAxisViewControlsBaseUnselected" style:highest "audio_track_base"
|
||||
widget "*AudioTrackControlsBaseUnselected" style:highest "audio_track_base"
|
||||
|
@ -1263,7 +1249,6 @@ widget "*LocationEditRemoveButton*" style:highest "location_row_button"
|
|||
widget "*ChannelCountSelector" style:highest "medium_bold_entry"
|
||||
widget "*RegionListWholeFile" style:highest "treeview_parent_node"
|
||||
widget "*ProcessorList*" style:highest "processor_list"
|
||||
widget "*ProcessorScroller*" style:highest "processor_scroller"
|
||||
widget "*PortMatrixLabel*" style:highest "small_text"
|
||||
widget "*MainMenuBar" style:highest "status_bar_box"
|
||||
widget "*midi device" style:highest "midi_device"
|
||||
|
@ -1290,5 +1275,3 @@ widget "*VCALabelBar*" style:highest "vca_label_bar"
|
|||
widget "*TextOnBackground" style:highest "text_on_bg"
|
||||
widget "*LargeTextEntry" style:highest "large_text"
|
||||
widget "*LargeTextEntry*" style:highest "large_text"
|
||||
|
||||
widget "*ShadedEntry" style:highest "shaded_entry"
|
||||
|
|
|
@ -47,6 +47,20 @@
|
|||
using namespace std;
|
||||
using namespace PBD;
|
||||
|
||||
bool
|
||||
cocoa_open_url (const char* uri)
|
||||
{
|
||||
NSString* struri = [[NSString alloc] initWithUTF8String:uri];
|
||||
NSURL* nsurl = [[NSURL alloc] initWithString:struri];
|
||||
|
||||
bool ret = [[NSWorkspace sharedWorkspace] openURL:nsurl];
|
||||
|
||||
[struri release];
|
||||
[nsurl release];
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void
|
||||
set_language_preference ()
|
||||
{
|
||||
|
@ -71,8 +85,6 @@ set_language_preference ()
|
|||
|
||||
if (languages && ((count = [languages count]) > 0)) {
|
||||
|
||||
cout << "User has " << [languages count] << " set in macOS preferences\n";
|
||||
|
||||
bool have_translatable_languages = true;
|
||||
|
||||
const char *cstr = [[languages objectAtIndex:0] UTF8String];
|
||||
|
@ -85,26 +97,17 @@ set_language_preference ()
|
|||
*/
|
||||
have_translatable_languages = false;
|
||||
cout << "User has en as primary language choice. " << PROGRAM_NAME << " will not be translated\n";
|
||||
} else if (len == 5 && cstr[len-2] == 'G' && cstr[len-1] == 'B') {
|
||||
/* primary language is english (GB). Stop
|
||||
looking, because we know there is a
|
||||
translation.
|
||||
*/
|
||||
cout << "Use has en_GB a primary language choice. " << PROGRAM_NAME << " will be translated\n";
|
||||
} else if (len == 5 && cstr[len-2] == 'U' && cstr[len-1] == 'S') {
|
||||
/* primary language choice is english (US). Stop looking, and do not set
|
||||
LANGUAGE. gettext needs to just skip translation entirely.
|
||||
*/
|
||||
have_translatable_languages = false;
|
||||
cout << "User has en_US as primary language choice. " << PROGRAM_NAME << " will not be translated\n";
|
||||
} else {
|
||||
/* primary language choice is english with some
|
||||
* non-anglosphere locale, eg. en_DE. We will
|
||||
* not translate.
|
||||
*/
|
||||
have_translatable_languages = false;
|
||||
cout << "User has " << cstr << " as primary language/locale choice. " << PROGRAM_NAME << " will not be translated\n";
|
||||
}
|
||||
|
||||
/* else en-<FOO> ... still leave the door open for translation
|
||||
to other version of english (e.g. en_IN, en_GB, etc)
|
||||
*/
|
||||
}
|
||||
|
||||
if (have_translatable_languages) {
|
||||
|
@ -130,8 +133,6 @@ set_language_preference ()
|
|||
setenv ("LANGUAGE", stupid_apple_string.c_str(), 0);
|
||||
cout << "LANGUAGE set to " << getenv ("LANGUAGE") << endl;
|
||||
}
|
||||
} else {
|
||||
cout << "User has no languages set in macOS preferences\n";
|
||||
}
|
||||
|
||||
/* now get AppleLocale value and use that to set LC_ALL because Launchd-started processes (i.e. GUI apps)
|
||||
|
@ -201,10 +202,3 @@ query_darwin_version ()
|
|||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
void
|
||||
use_cocoa_invalidation (int yn)
|
||||
{
|
||||
gdk_quartz_set_use_cocoa_invalidation (yn);
|
||||
std::cerr << "cocoa invalidation: " << yn << std::endl;
|
||||
}
|
||||
|
|
|
@ -193,8 +193,7 @@ ColorThemeManager::setup_modifiers ()
|
|||
for (UIConfiguration::Modifiers::const_iterator m = modifiers.begin(); m != modifiers.end(); ++m) {
|
||||
mod_hbox = manage (new HBox);
|
||||
|
||||
Adjustment* adj = manage (new Adjustment (0.0, 0.0, 1.0, 0.01, 0.1, 0));
|
||||
mod_scale = manage (new HScale (*adj));
|
||||
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);
|
||||
|
|
|
@ -1,262 +0,0 @@
|
|||
|
||||
/* This file was generated by tools/process-metadata. DO NOT EDIT THIS FILE. EVER! */
|
||||
void
|
||||
UIConfiguration::build_metadata ()
|
||||
{
|
||||
|
||||
#define VAR_META(name,...) { char const * _x[] { __VA_ARGS__ }; all_metadata.insert (std::make_pair<std::string,Metadata> ((name), PBD::upcase (_x))); }
|
||||
|
||||
VAR_META (X_("all-floating-windows-are-dialogs"), _("KDE"), _("quirks"), _("dialogs"), _("window"), _("hidden"), _("behind"), NULL);
|
||||
VAR_META (X_("automation-edit-cancels-auto-hide"), _("automation"), _("spill"), _("touch"), NULL);
|
||||
VAR_META (X_("autoplay-clips"), _("audition"), _("clips"), _("slots"), _("triggers"), _("autoplay"), _("automatically"), _("play"), NULL);
|
||||
VAR_META (X_("autoplay-files"), _("files"), _("audition"), _("autoplay"), _("automatically"), _("play"), NULL);
|
||||
VAR_META (X_("autoscroll-editor"), _("scroll"), _("editor"), NULL);
|
||||
VAR_META (X_("blink-alert-indicators"), _("blink"), _("alert"), _("indicators"), NULL);
|
||||
VAR_META (X_("blink-rec-arm"), _("appearance"), _("blink"), _("record"), _("rec"), _("enable"), _("rec-enable"), _("record-enable"), NULL);
|
||||
VAR_META (X_("boxy-buttons"), _("appearance"), _("style"), _("boxy"), _("buttons"), _("theme"), NULL);
|
||||
VAR_META (X_("buggy-gradients"), _("appearance"), _("bugs"), _("tweaks"), _("kwirks"), NULL);
|
||||
VAR_META (X_("check-announcements"), _("check"), _("announcements"), _("phone"), _("home"), NULL);
|
||||
VAR_META (X_("clock-display-limit"), _("clock"), _("display"), _("limit"), _("length"), _("maximum"), _("duration"), NULL);
|
||||
VAR_META (X_("color-file"), _("theme"), _("colors"), _("appearance"), _("style"), _("themeing"), NULL);
|
||||
VAR_META (X_("color-regions-using-track-color"), _("theme"), _("colors"), _("appearance"), _("style"), _("themeing"), NULL);
|
||||
VAR_META (X_("default-bindings"), _("shortcuts"), _("keys"), _("keybindings"), _("bindings"), NULL);
|
||||
VAR_META (X_("default-lower-midi-note"), _("MIDI"), _("low"), _("lowest"), _("lower"), NULL);
|
||||
VAR_META (X_("default-narrow_ms"), _("appearance"), _("width"), _("mixer"), NULL);
|
||||
VAR_META (X_("default-upper-midi-note"), _("MIDI"), _("upper"), _("high"), _("highest"), NULL);
|
||||
VAR_META (X_("draggable-playhead"), _("playhead"), _("dragging"), NULL);
|
||||
VAR_META (X_("draggable-playhead-speed"), _("playhead"), _("dragging"), NULL);
|
||||
VAR_META (X_("editor-stereo-only-meters"), _("editor"), _("stereo"), _("meters"), NULL);
|
||||
VAR_META (X_("flat-buttons"), _("appearance"), _("style"), _("flat"), _("buttons"), _("theme"), _("ableton"), NULL);
|
||||
VAR_META (X_("floating-monitor-section"), _("appearance"), _("monitor"), _("floating"), _("separate"), _("window"), NULL);
|
||||
VAR_META (X_("font-scale"), _("fonts"), _("font"), _("size"), _("scaling"), _("readable"), _("readability"), NULL);
|
||||
VAR_META (X_("freesound-dir"), _("freesound"), _("folder"), _("folders"), _("directory"), _("directories"), _("download"), NULL);
|
||||
VAR_META (X_("grid-follows-internal"), _("grid"), _("switch"), _("automatic"), _("tools"), _("mode"), _("selection"), _("internal"), _("edit"), NULL);
|
||||
VAR_META (X_("hide-splash-screen"), _("appearance"), _("hide"), _("splash"), _("screen"), NULL);
|
||||
VAR_META (X_("input-meter-layout"), _("meter"), _("recorder"), _("layout"), NULL);
|
||||
VAR_META (X_("input-meter-scopes"), _("scopes"), _("recorder"), _("layout"), NULL);
|
||||
VAR_META (X_("insert-at-position"), _("import"), _("embed"), _("position"), _("insert"), NULL);
|
||||
VAR_META (X_("lock-gui-after-seconds"), _("lock"), _("gui"), _("time"), _("seconds"), NULL);
|
||||
VAR_META (X_("max-note-height"), _("maximum"), _("note"), _("height"), _("theme"), _("appearance"), _("size"), _("visible"), _("range"), NULL);
|
||||
VAR_META (X_("max-inline-controls"), _("plugins"), _("mixer-strip"), _("controls"), _("inline"), NULL);
|
||||
VAR_META (X_("max-plugin-chart"), _("plugins"), _("top"), _("favorite"), _("sidebar"), NULL);
|
||||
VAR_META (X_("max-plugin-recent"), _("plugins"), _("recent"), _("favorite"), _("sidebar"), NULL);
|
||||
VAR_META (X_("meter-hold"), _("metering"), _("standard"), _("hold"), _("falloff"), _("level"), _("dbfs"), NULL);
|
||||
VAR_META (X_("meter-line-up-din"), _("metering"), _("standard"), _("din"), _("line-up"), _("level"), _("dbfs"), NULL);
|
||||
VAR_META (X_("meter-line-up-level"), _("metering"), _("standard"), _("line-up"), _("level"), _("dbfs"), NULL);
|
||||
VAR_META (X_("meter-peak"), _("metering"), _("peak"), _("line-up"), _("level"), _("dbfs"), NULL);
|
||||
VAR_META (X_("meter-style-led"), _("metering"), _("style"), _("led"), NULL);
|
||||
VAR_META (X_("meter-vu-standard"), _("metering"), _("standard"), _("vu"), _("line-up"), _("level"), _("dbfs"), NULL);
|
||||
VAR_META (X_("mixer-element-visibility"), _("mixer"), _("visibility"), _("comment"), _("solo"), _("mute"), _("phase"), _("polarity"), _("invert"), _("rec"), _("solo"), _("locked"), _("vca"), _("trigger"), NULL);
|
||||
VAR_META (X_("name-new-markers"), _("markers"), _("name"), _("dialog"), _("naming"), NULL);
|
||||
VAR_META (X_("never-display-periodic-midi"), _("sysex"), _("mtc"), _("midi"), _("regions"), _("messages"), _("events"), NULL);
|
||||
VAR_META (X_("new-automation-points-on-lane"), _("automation"), _("y-axis"), _("click"), _("draw"), _("lane"), _("points"), NULL);
|
||||
VAR_META (X_("note-name-display"), _("notes"), _("names"), _("midnam"), _("display"), _("show"), NULL);
|
||||
VAR_META (X_("one-plugin-window-only"), _("plugins"), _("window"), _("single"), _("close"), NULL);
|
||||
VAR_META (X_("only-copy-imported-files"), _("drag"), _("drop"), _("import"), _("copy"), _("link"), _("files"), NULL);
|
||||
VAR_META (X_("open-gui-after-adding-plugin"), _("plugins"), _("gui"), _("open"), _("window"), NULL);
|
||||
VAR_META (X_("plugin-gui-behavior"), _("plugins"), _("gui"), _("resources"), _("vst"), _("destroy"), _("window"), NULL);
|
||||
VAR_META (X_("prefer-inline-over-gui"), _("plugins"), _("inline"), _("mixer"), _("strip"), NULL);
|
||||
VAR_META (X_("prefer-tap-tempo"), _("tap"), _("tempo"), _("preference"), NULL);
|
||||
VAR_META (X_("primary-clock-delta-mode"), _("clocks"), _("mode"), _("primary"), _("delta"), _("difference"), _("edit"), _("cursor"), _("playhead"), NULL);
|
||||
VAR_META (X_("rubberbanding-snaps-to-grid"), _("rubberband"), _("snap"), _("grid"), _("time"), _("stretch"), NULL);
|
||||
VAR_META (X_("ruler-granularity"), _("ruler"), _("spacing"), _("grid"), _("snap"), _("distance"), NULL);
|
||||
VAR_META (X_("rulers-follow-grid"), _("ruler"), _("grid"), _("auto"), _("show"), _("visibility"), NULL);
|
||||
VAR_META (X_("save-export-analysis-image"), _("export"), _("analysis"), _("save"), _("image"), NULL);
|
||||
VAR_META (X_("save-export-mixer-screenshot"), _("export"), _("save"), _("image"), _("mixer"), _("screenshot"), NULL);
|
||||
VAR_META (X_("screen-saver-mode"), _("screensaver"), _("screen-saver"), _("prevent"), _("lock"), NULL);
|
||||
VAR_META (X_("secondary-clock-delta-mode"), _("clocks"), _("mode"), _("secondary"), _("delta"), _("difference"), _("edit"), _("cursor"), _("playhead"), NULL);
|
||||
VAR_META (X_("show-editor-meter"), _("toolbar"), _("editor"), _("meter"), _("master"), NULL);
|
||||
VAR_META (X_("show-inline-display-by-default"), _("plugins"), _("inline"), _("controls"), _("mixer"), NULL);
|
||||
VAR_META (X_("show-manager-if-plugins-are-missing"), _("plugins"), _("manager"), _("missing"), NULL);
|
||||
VAR_META (X_("show-mini-timeline"), _("minitimeline"), _("mini"), _("timeline"), _("toolbar"), NULL);
|
||||
VAR_META (X_("show-name-highlight"), _("editor"), _("region"), _("name"), _("bar"), _("highlight"), _("layout"), NULL);
|
||||
VAR_META (X_("show-plugin-scan-window"), _("plugins"), _("popup"), _("progress"), _("scan"), _("indexing"), NULL);
|
||||
VAR_META (X_("show-region-cue-markers"), _("cue"), _("markers"), _("regions"), _("editor"), NULL);
|
||||
VAR_META (X_("show-region-gain"), _("regions"), _("gain"), _("envelope"), _("volume"), _("modes"), NULL);
|
||||
VAR_META (X_("show-region-name"), _("regions"), _("name"), _("appearance"), _("editor"), NULL);
|
||||
VAR_META (X_("show-selection-marker"), _("selection"), _("ruler"), _("marker"), _("range"), NULL);
|
||||
VAR_META (X_("show-region-xrun-markers"), _("regions"), _("xruns"), _("markers"), _("dropouts"), NULL);
|
||||
VAR_META (X_("show-secondary-clock"), _("clock"), _("toolbar"), _("visibility"), _("secondary"), NULL);
|
||||
VAR_META (X_("show-snapped-cursor"), _("cursor"), _("snap"), _("edit"), _("point"), _("line"), NULL);
|
||||
VAR_META (X_("show-toolbar-cuectrl"), _("toolbar"), _("cue"), NULL);
|
||||
VAR_META (X_("show-toolbar-latency"), _("toolbar"), _("latency"), _("information"), NULL);
|
||||
VAR_META (X_("show-toolbar-monitor-info"), _("toolbar"), _("monitoring"), _("information"), _("section"), NULL);
|
||||
VAR_META (X_("show-toolbar-monitoring"), _("toolbar"), _("monitoring"), _("information"), _("section"), NULL);
|
||||
VAR_META (X_("show-toolbar-recpunch"), _("toolbar"), _("punch"), _("recording"), _("layered"), _("sound"), _("transparent"), NULL);
|
||||
VAR_META (X_("show-toolbar-selclock"), _("toolbar"), _("clock"), _("selection"), _("time"), _("display"), NULL);
|
||||
VAR_META (X_("show-track-meters"), _("editor"), _("meter"), _("small"), _("track"), _("header"), NULL);
|
||||
VAR_META (X_("show-waveform-clipping"), _("waveform"), _("clipping"), _("red"), _("peak"), NULL);
|
||||
VAR_META (X_("show-waveforms"), _("waveform"), _("display"), _("box"), _("empty"), _("invisible"), _("hide"), _("show"), NULL);
|
||||
VAR_META (X_("show-waveforms-while-recording"), _("waveform"), _("display"), _("recording"), NULL);
|
||||
VAR_META (X_("snap-threshold"), _("snap"), _("threshold"), _("distance"), _("mouse"), NULL);
|
||||
VAR_META (X_("snap-target"), _("snap"), _("grid"), _("target"), NULL);
|
||||
VAR_META (X_("snap-to-grid"), _("snap"), _("grid"), _("editor"), _("mouse"), NULL);
|
||||
VAR_META (X_("snap-to-marks"), _("snap"), _("grid"), _("editor"), _("mouse"), _("markers"), _("marks"), NULL);
|
||||
VAR_META (X_("snap-to-playhead"), _("snap"), _("grid"), _("editor"), _("mouse"), _("playhead"), NULL);
|
||||
VAR_META (X_("snap-to-region-end"), _("snap"), _("grid"), _("editor"), _("mouse"), _("regions"), _("boundaries"), _("boundary"), NULL);
|
||||
VAR_META (X_("snap-to-region-start"), _("snap"), _("grid"), _("editor"), _("mouse"), _("regions"), _("boundaries"), _("boundary"), NULL);
|
||||
VAR_META (X_("snap-to-region-sync"), _("snap"), _("grid"), _("editor"), _("mouse"), _("regions"), _("sync"), NULL);
|
||||
VAR_META (X_("sound-midi-notes"), _("play"), _("notes"), _("selection"), _("midi"), _("sound"), _("hear"), NULL);
|
||||
VAR_META (X_("super-rapid-clock-update"), _("clocks"), _("fast"), _("update"), _("display"), _("timecode"), _("video"), _("slow"), _("updates"), NULL);
|
||||
VAR_META (X_("time-axis-name-ellipsize-mode"), _("editor"), _("width"), _("name"), _("track"), _("header"), _("ellipsize"), _("size"), NULL);
|
||||
VAR_META (X_("timeline-item-gradient-depth"), _("editor"), _("gradient"), _("blur"), _("contrast"), _("style"), NULL);
|
||||
VAR_META (X_("transients-follow-front"), _("KDE"), _("quirks"), _("dialogs"), _("window"), _("hidden"), _("behind"), _("transient"), NULL);
|
||||
VAR_META (X_("update-editor-during-summary-drag"), _("editor"), _("summary"), _("scroll"), _("drag"), _("pan"), _("follow"), NULL);
|
||||
VAR_META (X_("use-double-click-to-zoom-to-selection"), _("editor"), _("zoom"), _("selection"), _("mouse"), _("click"), NULL);
|
||||
VAR_META (X_("use-mouse-position-as-zoom-focus-on-scroll"), _("editor"), _("zoom"), _("selection"), _("mouse"), _("wheel"), _("focus"), _("scroll"), NULL);
|
||||
VAR_META (X_("use-note-bars-for-velocity"), _("midi"), _("velocity"), _("bars"), _("box"), NULL);
|
||||
VAR_META (X_("use-note-color-for-velocity"), _("midi"), _("velocity"), _("color"), NULL);
|
||||
VAR_META (X_("use-route-color-widely"), _("mixer"), _("colors"), _("faders"), NULL);
|
||||
VAR_META (X_("use-time-rulers-to-zoom-with-vertical-drag"), _("zoom"), _("drag"), _("mouse"), NULL);
|
||||
VAR_META (X_("use-tooltips"), _("tooltips"), _("help"), _("popup"), _("information"), NULL);
|
||||
VAR_META (X_("use-wm-visibility"), _("quirks"), _("visibility"), _("switch"), _("windows"), NULL);
|
||||
VAR_META (X_("vertical-region-gap"), _("visual"), _("gap"), _("tracks"), _("spacing"), NULL);
|
||||
VAR_META (X_("vkeybd-layout"), _("virtual"), _("keyboard"), _("layout"), _("qwerty"), _("midi"), NULL);
|
||||
VAR_META (X_("waveform-cache-size"), _("memory"), _("cache"), _("performance"), _("optimization"), _("image"), NULL);
|
||||
VAR_META (X_("waveform-clip-level"), _("clip"), _("level"), _("dbfs"), _("waveform"), _("peaking"), NULL);
|
||||
VAR_META (X_("waveform-gradient-depth"), _("editor"), _("gradient"), _("blur"), _("contrast"), _("style"), _("waveform"), NULL);
|
||||
VAR_META (X_("waveform-scale"), _("waveform"), _("logarithmic"), _("logscale"), _("linear"), NULL);
|
||||
VAR_META (X_("waveform-shape"), _("waveform"), _("rectified"), _("half"), _("shape"), _("display"), NULL);
|
||||
VAR_META (X_("auto-play"), _("transport"), _("autoplay"), _("automatically"), _("play"), NULL);
|
||||
VAR_META (X_("auto-return"), _("transport"), _("autoreturn"), _("automatically"), _("return"), _("go"), _("back"), NULL);
|
||||
VAR_META (X_("count-in"), _("transport"), _("count"), _("in"), _("count-in"), NULL);
|
||||
VAR_META (X_("default-time-domain"), _("time"), _("domain"), _("musical"), _("audio"), _("markers"), NULL);
|
||||
VAR_META (X_("external-sync"), _("transport"), _("use"), _("external"), _("synchronization"), _("master"), NULL);
|
||||
VAR_META (X_("jack-time-master"), _("transport"), _("synchronization"), _("jack"), _("time"), _("master"), NULL);
|
||||
VAR_META (X_("meterbridge-label-height"), _("meter"), _("meterbridge"), _("bridge"), _("label"), _("height"), NULL);
|
||||
VAR_META (X_("midi-copy-is-fork"), _("midi"), _("copy"), _("clone"), _("duplicate"), _("fork"), _("linked"), NULL);
|
||||
VAR_META (X_("native-file-data-format"), _("audio"), _("files"), _("audiofiles"), _("native"), _("data"), _("format"), NULL);
|
||||
VAR_META (X_("native-file-header-format"), _("audio"), _("files"), _("audiofiles"), _("native"), _("header"), _("format"), _("container"), _("envelope"), NULL);
|
||||
VAR_META (X_("realtime-export"), _("exporting"), _("realtime"), _("real"), _("time"), _("nonrealtime"), _("nonreal"), NULL);
|
||||
VAR_META (X_("record-mode"), _("recording"), _("capture"), _("layers"), _("layering"), _("sound"), _("on"), _("soundonsound"), _("nonlayered"), _("layered"), NULL);
|
||||
VAR_META (X_("session-monitoring"), _("monitoring"), _("hearing"), _("listening"), _("signal"), _("monitors"), NULL);
|
||||
VAR_META (X_("show-busses-on-meterbridge"), _("busses"), _("bus"), _("meterbridge"), _("meters"), NULL);
|
||||
VAR_META (X_("show-fader-on-meterbridge"), _("faders"), _("meterbridge"), NULL);
|
||||
VAR_META (X_("show-group-tabs"), _("group"), _("tabs"), _("show"), _("hide"), _("visible"), _("visibility"), NULL);
|
||||
VAR_META (X_("show-master-on-meterbridge"), _("master"), _("meterbridge"), NULL);
|
||||
VAR_META (X_("show-midi-on-meterbridge"), _("midi"), _("meterbridge"), NULL);
|
||||
VAR_META (X_("show-monitor-on-meterbridge"), _("monitor"), _("meterbridge"), NULL);
|
||||
VAR_META (X_("show-mute-on-meterbridge"), _("mute"), _("meterbridge"), NULL);
|
||||
VAR_META (X_("show-name-on-meterbridge"), _("solo"), _("meterbridge"), NULL);
|
||||
VAR_META (X_("show-rec-on-meterbridge"), _("record"), _("recenable"), _("meterbridge"), NULL);
|
||||
VAR_META (X_("show-region-fades"), _("region"), _("gain"), _("fades"), _("show"), _("hide"), _("fadein"), _("fadeout"), NULL);
|
||||
VAR_META (X_("show-solo-on-meterbridge"), _("solo"), _("meterbridge"), NULL);
|
||||
VAR_META (X_("show-summary"), _("summary"), _("show"), NULL);
|
||||
VAR_META (X_("slave-timecode-offset"), _("timecode"), _("synchronization"), _("offset"), NULL);
|
||||
VAR_META (X_("subframes-per-frame"), _("timecode"), _("subframes"), _("sync"), NULL);
|
||||
VAR_META (X_("take-name"), _("take"), _("names"), NULL);
|
||||
VAR_META (X_("timecode-format"), _("timecode"), _("synchronization"), _("format"), _("tc"), NULL);
|
||||
VAR_META (X_("timecode-generator-offset"), _("timecode"), _("synchronization"), _("offset"), _("generate"), _("send"), NULL);
|
||||
VAR_META (X_("timecode-offset"), _("timecode"), _("synchronization"), _("offset"), _("receive"), NULL);
|
||||
VAR_META (X_("timecode-offset-negative"), _("timecode"), _("synchronization"), _("offset"), _("negative"), NULL);
|
||||
VAR_META (X_("track-name-number"), _("name"), _("naming"), _("numbered"), _("tracks"), NULL);
|
||||
VAR_META (X_("track-name-take"), _("name"), _("naming"), _("tracks"), _("takes"), NULL);
|
||||
VAR_META (X_("use-monitor-fades"), _("monitoring"), _("fades"), _("fadein"), _("fadeout"), _("enable"), _("disable"), _("use"), NULL);
|
||||
VAR_META (X_("use-region-fades"), _("region"), _("fades"), _("fadein"), _("fadeout"), _("enable"), _("disable"), _("use"), NULL);
|
||||
VAR_META (X_("use-transport-fades"), _("transport"), _("fades"), _("fadein"), _("fadeout"), _("enable"), _("disable"), _("use"), NULL);
|
||||
VAR_META (X_("use-video-file-fps"), _("video"), _("use"), _("frames"), _("per"), _("second"), _("fps"), NULL);
|
||||
VAR_META (X_("afl-position"), _("monitoring"), _("monitor"), _("afl"), _("pfl"), _("pre"), _("post"), _("position"), NULL);
|
||||
VAR_META (X_("auto-analyse-audio"), _("automatic"), _("automated"), _("audio"), _("analysis"), _("transients"), NULL);
|
||||
VAR_META (X_("click-emphasis-sound"), _("metronome"), _("click"), _("beat"), _("downbeat"), _("emphasis"), _("sample"), _("sound"), NULL);
|
||||
VAR_META (X_("click-gain"), _("metronome"), _("click"), _("beat"), _("volume"), _("gain"), _("level"), NULL);
|
||||
VAR_META (X_("click-sound"), _("metronome"), _("click"), _("beat"), _("sound"), _("sample"), NULL);
|
||||
VAR_META (X_("clip-library-dir"), _("folder"), _("folders"), _("directory"), _("directories"), _("download"), _("clips"), _("library"), NULL);
|
||||
VAR_META (X_("cpu-dma-latency"), _("cpu"), _("dma"), _("latency"), _("performance"), _("xrun"), NULL);
|
||||
VAR_META (X_("create-xrun-marker"), _("xrun"), _("xmarker"), NULL);
|
||||
VAR_META (X_("default-automation-time-domain"), _("automation"), _("time"), _("domain"), _("default"), NULL);
|
||||
VAR_META (X_("default-fade-shape"), _("fades"), _("fadein"), _("fadeout"), _("shape"), _("type"), _("style"), _("default"), NULL);
|
||||
VAR_META (X_("default-session-parent-dir"), _("folders"), _("directory"), _("directories"), _("session"), _("path"), _("default"), NULL);
|
||||
VAR_META (X_("denormal-model"), _("denormal"), _("model"), _("handling"), _("cpu"), _("performance"), _("speed"), _("xruns"), _("dsp"), _("load"), NULL);
|
||||
VAR_META (X_("denormal-protection"), _("denormal"), _("model"), _("handling"), _("cpu"), _("performance"), _("speed"), _("xruns"), _("dsp"), _("load"), NULL);
|
||||
VAR_META (X_("discover-plugins-on-start"), _("plugins"), _("scan"), _("discover"), _("rescan"), _("reload"), _("startup"), NULL);
|
||||
VAR_META (X_("history-depth"), _("history"), _("undo"), _("redo"), _("depth"), _("length"), _("size"), NULL);
|
||||
VAR_META (X_("layer-model"), _("editing"), _("layering"), _("model"), _("style"), _("type"), NULL);
|
||||
VAR_META (X_("link-send-and-route-panner"), _("mixing"), _("panning"), _("send"), _("panner"), _("link"), _("connect"), _("tie"), NULL);
|
||||
VAR_META (X_("listen-position"), _("afl"), _("pfl"), _("listen"), _("monitoring"), _("position"), NULL);
|
||||
VAR_META (X_("loop-fade-choice"), _("looping"), _("fades"), _("fadein"), _("fadeout"), _("choice"), _("type"), _("style"), _("model"), NULL);
|
||||
VAR_META (X_("loop-is-mode"), _("looping"), _("mode"), _("behavior"), NULL);
|
||||
VAR_META (X_("ltc-output-port"), _("timecode"), _("output"), _("port"), _("routing"), NULL);
|
||||
VAR_META (X_("ltc-output-volume"), _("timecode"), _("output"), _("level"), _("gain"), _("volume"), _("ltc"), NULL);
|
||||
VAR_META (X_("ltc-send-continuously"), _("timecode"), _("transmit"), _("send"), _("continuously"), _("always"), _("ltc"), NULL);
|
||||
VAR_META (X_("max-gain"), _("volume"), _("gain"), _("fader"), _("maximum"), _("peak"), NULL);
|
||||
VAR_META (X_("max-recent-sessions"), _("number"), _("maximum"), _("recent"), _("sessions"), NULL);
|
||||
VAR_META (X_("max-recent-templates"), _("number"), _("maximum"), _("recent"), _("templates"), NULL);
|
||||
VAR_META (X_("max-transport-speed"), _("maximum"), _("top"), _("fastest"), _("highest"), _("transport"), _("speed"), NULL);
|
||||
VAR_META (X_("meter-falloff"), _("meter"), _("falloff"), _("fall"), _("off"), NULL);
|
||||
VAR_META (X_("meter-type-bus"), _("meter"), _("type"), _("bus"), NULL);
|
||||
VAR_META (X_("meter-type-master"), _("meter"), _("type"), _("master"), NULL);
|
||||
VAR_META (X_("meter-type-track"), _("meter"), _("type"), _("track"), NULL);
|
||||
VAR_META (X_("midi-audition-synth-uri"), _("midi"), _("audition"), _("synthesizer"), _("plugin"), _("name"), _("id"), _("uri"), _("location"), NULL);
|
||||
VAR_META (X_("midi-clock-resolution"), _("midi"), _("clock"), _("resolution"), _("quantize"), _("limit"), _("precision"), NULL);
|
||||
VAR_META (X_("midi-clock-sets-tempo"), _("midi"), _("clock"), _("mclk"), _("set"), _("tempo"), NULL);
|
||||
VAR_META (X_("midi-feedback"), _("midi"), _("generic"), _("control"), _("surface"), _("feedback"), NULL);
|
||||
VAR_META (X_("midi-input-follows-selection"), _("midi"), _("inputs"), _("port"), _("device"), _("follow"), _("selection"), _("tracks"), NULL);
|
||||
VAR_META (X_("minimum-disk-read-bytes"), _("disk"), _("disc"), _("i/o"), _("io"), _("chunk"), _("read"), _("size"), _("bytes"), _("buffering"), NULL);
|
||||
VAR_META (X_("minimum-disk-write-bytes"), _("disk"), _("disc"), _("i/o"), _("io"), _("chunk"), _("write"), _("size"), _("bytes"), _("buffering"), NULL);
|
||||
VAR_META (X_("mmc-receive-device-id"), _("midi"), _("machine"), _("control"), _("mmc"), _("receive"), _("receiving"), _("device"), _("id"), NULL);
|
||||
VAR_META (X_("mmc-send-device-id"), _("midi"), _("machine"), _("control"), _("mmc"), _("send"), _("sending"), _("device"), _("id"), NULL);
|
||||
VAR_META (X_("monitoring-model"), _("monitoring"), _("model"), _("style"), _("type"), NULL);
|
||||
VAR_META (X_("mtc-qf-speed-tolerance"), _("transport"), _("synchronization"), _("MIDI"), _("timecode"), _("time"), _("code"), _("threshold"), _("tolerance"), _("sensitivity"), _("quarter"), _("frame"), NULL);
|
||||
VAR_META (X_("mute-affects-control-outs"), _("mute"), _("muting"), _("monitor"), _("outs"), _("control"), _("outputs"), NULL);
|
||||
VAR_META (X_("mute-affects-main-outs"), _("mute"), _("muting"), _("main"), _("outs"), _("outputs"), _("master"), NULL);
|
||||
VAR_META (X_("mute-affects-post-fader"), _("mute"), _("muting"), _("postfader"), _("post"), _("fader"), NULL);
|
||||
VAR_META (X_("mute-affects-pre-fader"), _("mute"), _("muting"), _("prefader"), _("pre"), _("fader"), NULL);
|
||||
VAR_META (X_("new-plugins-active"), _("plugins"), _("newly"), _("added"), _("active"), NULL);
|
||||
VAR_META (X_("osc-port"), _("OSC"), _("port"), _("number"), NULL);
|
||||
VAR_META (X_("output-auto-connect"), _("outputs"), _("automatically"), _("connect"), NULL);
|
||||
VAR_META (X_("periodic-safety-backup-interval"), _("backups"), _("autosave"), NULL);
|
||||
VAR_META (X_("periodic-safety-backups"), _("backups"), _("autosave"), NULL);
|
||||
VAR_META (X_("pfl-position"), _("solo"), _("listen"), _("prefader"), _("position"), NULL);
|
||||
VAR_META (X_("playback-buffer-seconds"), _("performance"), _("disk"), _("disc"), _("buffering"), _("playback"), _("keep"), _("up"), _("size"), _("seconds"), NULL);
|
||||
VAR_META (X_("plugin-path-lxvst"), _("plugins"), _("paths"), _("folders"), _("directory"), _("directories"), _("linux"), _("vst"), _("lxvst"), _("search"), NULL);
|
||||
VAR_META (X_("plugin-path-vst"), _("plugins"), _("paths"), _("folders"), _("directory"), _("directories"), _("vst"), _("search"), NULL);
|
||||
VAR_META (X_("plugin-path-vst3"), _("plugins"), _("paths"), _("folders"), _("directory"), _("directories"), _("vst3"), _("search"), NULL);
|
||||
VAR_META (X_("plugin-scan-timeout"), _("plugins"), _("scan"), _("timeout"), _("fail"), _("wait"), NULL);
|
||||
VAR_META (X_("plugins-stop-with-transport"), _("plugins"), _("stop"), _("transport"), _("tail"), _("reverb"), _("ringing"), _("reset"), NULL);
|
||||
VAR_META (X_("port-resampler-quality"), _("resampling"), _("audioengine"), _("global"), _("quality"), _("level"), NULL);
|
||||
VAR_META (X_("processor-usage"), _("cpu"), _("threads"), _("usage"), _("distribute"), _("parallel"), NULL);
|
||||
VAR_META (X_("quieten-at-speed"), _("volume"), _("gain"), _("level"), _("reduce"), _("quieten"), _("cut"), _("speed"), _("fast"), _("forward"), _("rewind"), _("ffwd"), NULL);
|
||||
VAR_META (X_("range-selection-after-split"), _("editing"), _("split"), _("selection"), _("range"), _("after"), _("split"), NULL);
|
||||
VAR_META (X_("recording-resets-xrun-count"), _("recording"), _("resets"), _("xruns"), NULL);
|
||||
VAR_META (X_("region-boundaries-from-onscreen_tracks"), _("grid"), _("region"), _("boundaries"), _("from"), _("visible"), _("onscreen"), _("tracks"), _("lanes"), NULL);
|
||||
VAR_META (X_("region-boundaries-from-selected-tracks"), _("grid"), _("region"), _("boundaries"), _("from"), _("selected"), _("tracks"), _("lanes"), NULL);
|
||||
VAR_META (X_("region-equivalency"), _("options"), _("equivalent"), _("equivalence"), _("regions"), _("comparison"), _("selection"), NULL);
|
||||
VAR_META (X_("region-selection-after-split"), _("selection"), _("regions"), _("after"), _("split"), _("left"), _("right"), _("side"), NULL);
|
||||
VAR_META (X_("replicate-missing-region-channels"), _("channels"), _("replicate"), _("missing"), _("region"), NULL);
|
||||
VAR_META (X_("reset-default-speed-on-stop"), _("transport"), _("reset"), _("default"), _("speed"), _("stop"), NULL);
|
||||
VAR_META (X_("ripple-mode"), _("ripple"), _("all"), _("interview"), _("selected"), NULL);
|
||||
VAR_META (X_("run-all-transport-masters-always"), _("synchronization"), _("always"), _("run"), _("masters"), _("transport"), NULL);
|
||||
VAR_META (X_("sample-lib-path"), _("files"), _("folders"), _("samples"), _("library"), _("path"), NULL);
|
||||
VAR_META (X_("save-history"), _("history"), _("save"), _("disk"), _("serialize"), _("store"), NULL);
|
||||
VAR_META (X_("save-history-depth"), _("history"), _("depth"), _("size"), _("length"), NULL);
|
||||
VAR_META (X_("send-ltc"), _("synchronization"), _("send"), _("transmit"), _("deliver"), _("linear"), _("timecode"), _("ltc"), NULL);
|
||||
VAR_META (X_("send-midi-clock"), _("synchronization"), _("send"), _("transmit"), _("deliver"), _("midi"), _("clock"), _("mclk"), NULL);
|
||||
VAR_META (X_("send-mmc"), _("synchronization"), _("send"), _("transmit"), _("deliver"), _("midi"), _("machine"), _("code"), _("mmc"), NULL);
|
||||
VAR_META (X_("send-mtc"), _("synchronization"), _("send"), _("transmit"), _("deliver"), _("midi"), _("time"), _("code"), _("timecode"), _("mtc"), NULL);
|
||||
VAR_META (X_("show-solo-mutes"), _("appearance"), _("solo"), _("mute"), NULL);
|
||||
VAR_META (X_("shuttle-max-speed"), _("transport"), _("shuttle"), _("varispeed"), _("control"), _("speed"), _("maximum"), NULL);
|
||||
VAR_META (X_("shuttle-speed-factor"), _("transport"), _("shuttle"), _("varispeed"), _("control"), _("speed"), NULL);
|
||||
VAR_META (X_("shuttle-speed-threshold"), _("transport"), _("shuttle"), _("varispeed"), _("control"), _("threshold"), NULL);
|
||||
VAR_META (X_("shuttle-units"), _("transport"), _("shuttle"), _("varispeed"), _("units"), _("semitones"), _("percentage"), NULL);
|
||||
VAR_META (X_("solo-mute-override"), _("solo"), _("mute"), _("override"), _("overrule"), _("priority"), NULL);
|
||||
VAR_META (X_("stop-at-session-end"), _("transport"), _("stop"), _("end"), _("session"), NULL);
|
||||
VAR_META (X_("stop-recording-on-xrun"), _("transport"), _("recording"), _("xrun"), _("stop"), NULL);
|
||||
VAR_META (X_("strict-io"), _("plugins"), _("outputs"), _("number"), _("flexible"), _("variable"), _("fixed"), NULL);
|
||||
VAR_META (X_("timecode-sync-frame-rate"), _("timecode"), _("synchronization"), _("frame"), _("rate"), NULL);
|
||||
VAR_META (X_("tracks-auto-naming"), _("automatically"), _("name"), _("tracks"), NULL);
|
||||
VAR_META (X_("transient-sensitivity"), _("analysis"), _("transients"), _("sensitive"), _("sensitivity"), _("vamp"), NULL);
|
||||
VAR_META (X_("try-autostart-engine"), _("audioengine"), _("startup"), NULL);
|
||||
VAR_META (X_("use-audio-units"), _("plugins"), _("audiounits"), _("audio-unit"), _("enable"), _("disable"), NULL);
|
||||
VAR_META (X_("use-click-emphasis"), _("metronome"), _("beat"), _("click"), _("sound"), _("emphasis"), NULL);
|
||||
VAR_META (X_("use-lxvst"), _("plugins"), _("vst2"), _("enable"), _("disable"), NULL);
|
||||
VAR_META (X_("use-macvst"), _("plugins"), _("vst2"), _("enable"), _("disable"), NULL);
|
||||
VAR_META (X_("use-monitor-bus"), _("monitoring"), _("bus"), _("optional"), NULL);
|
||||
VAR_META (X_("use-osc"), _("osc"), _("open"), _("sound"), _("control"), NULL);
|
||||
VAR_META (X_("use-plugin-own-gui"), _("plugins"), _("GUI"), _("editor"), _("prefer"), _("use"), _("own"), NULL);
|
||||
VAR_META (X_("use-vst3"), _("plugins"), _("vst3"), NULL);
|
||||
VAR_META (X_("verbose-plugin-scan"), _("plugins"), _("scanning"), _("verbose"), NULL);
|
||||
VAR_META (X_("verify-remove-last-capture"), _("verify"), _("remove"), _("removal"), _("last"), _("most"), _("recent"), _("capture"), _("recording"), _("take"), NULL);
|
||||
VAR_META (X_("video-advanced-setup"), _("video"), _("setup"), NULL);
|
||||
VAR_META (X_("video-server-url"), _("video"), _("server"), _("location"), _("url"), _("file"), NULL);
|
||||
|
||||
}
|
|
@ -133,13 +133,7 @@ void
|
|||
ControlPoint::set_size (double sz)
|
||||
{
|
||||
_size = sz;
|
||||
move_to (_x, _y);
|
||||
}
|
||||
|
||||
void
|
||||
ControlPoint::move_to (double x, double y)
|
||||
{
|
||||
move_to (x, y, _shape);
|
||||
move_to (_x, _y, _shape);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -56,7 +56,6 @@ public:
|
|||
End
|
||||
};
|
||||
|
||||
void move_to (double x, double y);
|
||||
void move_to (double x, double y, ShapeType);
|
||||
void reset (double x, double y, ARDOUR::AutomationList::iterator, uint32_t, ShapeType);
|
||||
double get_x() const { return _x; }
|
||||
|
|
|
@ -19,8 +19,6 @@
|
|||
#include <string>
|
||||
#include <gtkmm/stock.h>
|
||||
|
||||
#include "gtkmm2ext/gtk_ui.h"
|
||||
|
||||
#include "automation_line.h"
|
||||
#include "control_point.h"
|
||||
#include "control_point_dialog.h"
|
||||
|
@ -33,11 +31,9 @@
|
|||
* @param p ControlPoint to edit.
|
||||
*/
|
||||
|
||||
ControlPointDialog::ControlPointDialog (ControlPoint* p, bool multi)
|
||||
ControlPointDialog::ControlPointDialog (ControlPoint* p)
|
||||
: ArdourDialog (_("Control point"))
|
||||
, point_ (p)
|
||||
, toggle_all_ (_("Apply to selected points"))
|
||||
, all_selected_points_ (true)
|
||||
{
|
||||
assert (point_);
|
||||
|
||||
|
@ -57,36 +53,23 @@ ControlPointDialog::ControlPointDialog (ControlPoint* p, bool multi)
|
|||
std::size_t sep = val.find_last_of (" ");
|
||||
|
||||
value_.set_text (val.substr (0, sep));
|
||||
value_.set_activates_default ();
|
||||
|
||||
Gtk::HBox* b = Gtk::manage (new Gtk::HBox ());
|
||||
|
||||
b->set_spacing (4);
|
||||
b->pack_start (*Gtk::manage (new Gtk::Label (_("Value"))));
|
||||
b->pack_start (value_);
|
||||
|
||||
if (sep != std::string::npos) {
|
||||
b->pack_start (*Gtk::manage (new Gtk::Label (val.substr (sep + 1))));
|
||||
}
|
||||
get_vbox ()->pack_start (*b);
|
||||
|
||||
toggle_all_.set_active (true);
|
||||
get_vbox ()->pack_start (toggle_all_);
|
||||
Gtkmm2ext::UI::instance()->set_tip (toggle_all_,
|
||||
_("<b>When enabled</b> the given value is applied to all selected automation points on the same line as the point being edited.\n\n"
|
||||
"<b>When disabled</b> only the current automation point is modified."));
|
||||
toggle_all_.set_sensitive (multi);
|
||||
|
||||
get_vbox ()->set_spacing (4);
|
||||
show_all ();
|
||||
get_vbox ()->pack_end (*b);
|
||||
b->show_all ();
|
||||
|
||||
add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
|
||||
add_button (Gtk::Stock::APPLY, Gtk::RESPONSE_ACCEPT);
|
||||
set_default_response (Gtk::RESPONSE_ACCEPT);
|
||||
|
||||
value_.set_activates_default ();
|
||||
/* TODO: this does not work, one has to click on the entry.. */
|
||||
value_.set_can_focus ();
|
||||
value_.grab_focus ();
|
||||
}
|
||||
|
||||
double
|
||||
|
@ -94,9 +77,3 @@ ControlPointDialog::get_y_fraction () const
|
|||
{
|
||||
return point_->line().string_to_fraction (value_.get_text ());
|
||||
}
|
||||
|
||||
bool
|
||||
ControlPointDialog::all_selected_points () const
|
||||
{
|
||||
return toggle_all_.get_active ();
|
||||
}
|
||||
|
|
|
@ -17,25 +17,19 @@
|
|||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include <gtkmm/entry.h>
|
||||
#include <gtkmm/checkbutton.h>
|
||||
|
||||
#include "ardour_dialog.h"
|
||||
#include <gtkmm/entry.h>
|
||||
|
||||
class ControlPoint;
|
||||
|
||||
class ControlPointDialog : public ArdourDialog
|
||||
{
|
||||
public:
|
||||
ControlPointDialog (ControlPoint *, bool multi);
|
||||
ControlPointDialog (ControlPoint *);
|
||||
|
||||
double get_y_fraction () const;
|
||||
|
||||
bool all_selected_points () const;
|
||||
|
||||
private:
|
||||
ControlPoint* point_;
|
||||
Gtk::Entry value_;
|
||||
Gtk::CheckButton toggle_all_;
|
||||
bool all_selected_points_;
|
||||
};
|
||||
|
|
|
@ -67,14 +67,14 @@ ControlSlaveUI::~ControlSlaveUI ()
|
|||
}
|
||||
|
||||
void
|
||||
ControlSlaveUI::set_stripable (std::shared_ptr<Stripable> s)
|
||||
ControlSlaveUI::set_stripable (boost::shared_ptr<Stripable> s)
|
||||
{
|
||||
connections.drop_connections ();
|
||||
|
||||
stripable = s;
|
||||
|
||||
if (stripable) {
|
||||
std::shared_ptr<GainControl> ac = stripable->gain_control();
|
||||
boost::shared_ptr<GainControl> ac = stripable->gain_control();
|
||||
assert (ac);
|
||||
|
||||
ac->MasterStatusChange.connect (connections,
|
||||
|
@ -82,7 +82,7 @@ ControlSlaveUI::set_stripable (std::shared_ptr<Stripable> s)
|
|||
boost::bind (&ControlSlaveUI::update_vca_display, this),
|
||||
gui_context());
|
||||
|
||||
stripable->DropReferences.connect (connections, invalidator (*this), boost::bind (&ControlSlaveUI::set_stripable, this, std::shared_ptr<Stripable>()), gui_context());
|
||||
stripable->DropReferences.connect (connections, invalidator (*this), boost::bind (&ControlSlaveUI::set_stripable, this, boost::shared_ptr<Stripable>()), gui_context());
|
||||
}
|
||||
|
||||
update_vca_display ();
|
||||
|
@ -121,13 +121,13 @@ ControlSlaveUI::update_vca_display ()
|
|||
void
|
||||
ControlSlaveUI::vca_menu_toggle (Gtk::CheckMenuItem* menuitem, uint32_t n)
|
||||
{
|
||||
std::shared_ptr<VCA> vca = _session->vca_manager().vca_by_number (n);
|
||||
boost::shared_ptr<VCA> vca = _session->vca_manager().vca_by_number (n);
|
||||
|
||||
if (!vca) {
|
||||
return;
|
||||
}
|
||||
|
||||
std::shared_ptr<Slavable> sl = std::dynamic_pointer_cast<Slavable> (stripable);
|
||||
boost::shared_ptr<Slavable> sl = boost::dynamic_pointer_cast<Slavable> (stripable);
|
||||
|
||||
if (!sl) {
|
||||
return;
|
||||
|
@ -143,13 +143,13 @@ ControlSlaveUI::vca_menu_toggle (Gtk::CheckMenuItem* menuitem, uint32_t n)
|
|||
void
|
||||
ControlSlaveUI::unassign_all ()
|
||||
{
|
||||
std::shared_ptr<Slavable> sl = std::dynamic_pointer_cast<Slavable> (stripable);
|
||||
boost::shared_ptr<Slavable> sl = boost::dynamic_pointer_cast<Slavable> (stripable);
|
||||
|
||||
if (!sl) {
|
||||
return;
|
||||
}
|
||||
|
||||
sl->unassign (std::shared_ptr<VCA>());
|
||||
sl->unassign (boost::shared_ptr<VCA>());
|
||||
}
|
||||
|
||||
bool
|
||||
|
@ -213,15 +213,15 @@ ControlSlaveUI::vca_button_release (GdkEventButton* ev, uint32_t n)
|
|||
}
|
||||
|
||||
if (!items.empty()) {
|
||||
context_menu->popup (ev->button, ev->time);
|
||||
return false;
|
||||
context_menu->popup (1, ev->time);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void
|
||||
ControlSlaveUI::add_vca_button (std::shared_ptr<VCA> vca)
|
||||
ControlSlaveUI::add_vca_button (boost::shared_ptr<VCA> vca)
|
||||
{
|
||||
ArdourButton* vca_button = manage (new ArdourButton (ArdourButton::default_elements));
|
||||
|
||||
|
|
|
@ -20,8 +20,9 @@
|
|||
#ifndef __gtk2_ardour_control_slave_ui_h__
|
||||
#define __gtk2_ardour_control_slave_ui_h__
|
||||
|
||||
#include <cstdint>
|
||||
#include <memory>
|
||||
#include <stdint.h>
|
||||
|
||||
#include <boost/shared_ptr.hpp>
|
||||
|
||||
#include <gtkmm/box.h>
|
||||
#include <gtkmm/checkmenuitem.h>
|
||||
|
@ -44,10 +45,10 @@ class ControlSlaveUI : public Gtk::HBox, public ARDOUR::SessionHandlePtr
|
|||
public:
|
||||
ControlSlaveUI (ARDOUR::Session*);
|
||||
~ControlSlaveUI ();
|
||||
void set_stripable (std::shared_ptr<ARDOUR::Stripable>);
|
||||
void set_stripable (boost::shared_ptr<ARDOUR::Stripable>);
|
||||
|
||||
private:
|
||||
std::shared_ptr<ARDOUR::Stripable> stripable;
|
||||
boost::shared_ptr<ARDOUR::Stripable> stripable;
|
||||
PBD::ScopedConnectionList connections;
|
||||
PBD::ScopedConnectionList master_connections;
|
||||
ArdourWidgets::ArdourButton initial_button;
|
||||
|
@ -58,7 +59,7 @@ private:
|
|||
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 (std::shared_ptr<ARDOUR::VCA>);
|
||||
void add_vca_button (boost::shared_ptr<ARDOUR::VCA>);
|
||||
void unassign_all ();
|
||||
|
||||
Gtk::Menu* context_menu;
|
||||
|
|
|
@ -57,7 +57,7 @@ namespace ArdourWaveview {
|
|||
class CrossfadeEditor : public ArdourDialog
|
||||
{
|
||||
public:
|
||||
CrossfadeEditor (ARDOUR::Session*, std::shared_ptr<ARDOUR::Crossfade>, double miny, double maxy);
|
||||
CrossfadeEditor (ARDOUR::Session*, boost::shared_ptr<ARDOUR::Crossfade>, double miny, double maxy);
|
||||
~CrossfadeEditor ();
|
||||
|
||||
void apply ();
|
||||
|
@ -94,7 +94,7 @@ protected:
|
|||
bool on_key_release_event (GdkEventKey*);
|
||||
|
||||
private:
|
||||
std::shared_ptr<ARDOUR::Crossfade> xfade;
|
||||
boost::shared_ptr<ARDOUR::Crossfade> xfade;
|
||||
|
||||
Gtk::VBox vpacker;
|
||||
|
||||
|
@ -200,11 +200,11 @@ private:
|
|||
PBD::ScopedConnection* _peaks_ready_connection;
|
||||
PBD::ScopedConnection state_connection;
|
||||
|
||||
void make_waves (std::shared_ptr<ARDOUR::AudioRegion>, WhichFade);
|
||||
void peaks_ready (std::weak_ptr<ARDOUR::AudioRegion> r, WhichFade);
|
||||
void make_waves (boost::shared_ptr<ARDOUR::AudioRegion>, WhichFade);
|
||||
void peaks_ready (boost::weak_ptr<ARDOUR::AudioRegion> r, WhichFade);
|
||||
|
||||
void _apply_to (std::shared_ptr<ARDOUR::Crossfade> xf);
|
||||
void setup (std::shared_ptr<ARDOUR::Crossfade>);
|
||||
void _apply_to (boost::shared_ptr<ARDOUR::Crossfade> xf);
|
||||
void setup (boost::shared_ptr<ARDOUR::Crossfade>);
|
||||
void cancel_audition ();
|
||||
void audition_state_changed (bool);
|
||||
|
||||
|
|
|
@ -41,7 +41,7 @@ class CrossfadeView : public TimeAxisViewItem
|
|||
public:
|
||||
CrossfadeView (ArdourCanvas::Container*,
|
||||
RouteTimeAxisView&,
|
||||
std::shared_ptr<ARDOUR::Crossfade>,
|
||||
boost::shared_ptr<ARDOUR::Crossfade>,
|
||||
double initial_samples_per_pixel,
|
||||
Gdk::Color& basic_color,
|
||||
AudioRegionView& leftview,
|
||||
|
@ -49,7 +49,7 @@ public:
|
|||
|
||||
~CrossfadeView ();
|
||||
|
||||
std::shared_ptr<ARDOUR::Crossfade> crossfade; // ok, let 'em have it
|
||||
boost::shared_ptr<ARDOUR::Crossfade> crossfade; // ok, let 'em have it
|
||||
|
||||
AudioRegionView& left_view; // and these too
|
||||
AudioRegionView& right_view;
|
||||
|
|
|
@ -298,15 +298,16 @@ CueBoxUI::context_menu (uint64_t idx)
|
|||
items.push_back (SeparatorElem());
|
||||
items.push_back (MenuElem (_("Clear All..."), sigc::bind (sigc::mem_fun (*this, &CueBoxUI::clear_all_triggers), idx)));
|
||||
|
||||
_context_menu->popup (3, gtk_get_current_event_time ());
|
||||
_context_menu->popup (1, gtk_get_current_event_time ());
|
||||
}
|
||||
|
||||
void
|
||||
CueBoxUI::get_slots (TriggerList &triggerlist, uint64_t idx)
|
||||
{
|
||||
std::shared_ptr<RouteList const> rl = _session->get_routes();
|
||||
for (auto const& route : *rl) {
|
||||
std::shared_ptr<TriggerBox> box = route->triggerbox();
|
||||
boost::shared_ptr<RouteList> rl = _session->get_routes();
|
||||
for (RouteList::iterator r = rl->begin(); r != rl->end(); ++r) {
|
||||
boost::shared_ptr<Route> route = *r;
|
||||
boost::shared_ptr<TriggerBox> box = route->triggerbox();
|
||||
#warning @Ben disambiguate processor *active* vs *visibility*
|
||||
if (box /*&& box.active*/) {
|
||||
TriggerPtr trigger = box->trigger(idx);
|
||||
|
@ -321,7 +322,7 @@ CueBoxUI::clear_all_triggers (uint64_t idx)
|
|||
TriggerList tl;
|
||||
get_slots(tl, idx);
|
||||
for (TriggerList::iterator t = tl.begin(); t != tl.end(); ++t) {
|
||||
(*t)->set_region(std::shared_ptr<Region>());
|
||||
(*t)->set_region(boost::shared_ptr<Region>());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -19,8 +19,7 @@
|
|||
#ifndef __ardour_gtk_cursor_context_h__
|
||||
#define __ardour_gtk_cursor_context_h__
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include <boost/shared_ptr.hpp>
|
||||
#include <gdkmm/cursor.h>
|
||||
|
||||
class Editor;
|
||||
|
@ -44,7 +43,7 @@ class CursorContext
|
|||
{
|
||||
public:
|
||||
/** A smart handle for a cursor change context. */
|
||||
typedef std::shared_ptr<CursorContext> Handle;
|
||||
typedef boost::shared_ptr<CursorContext> Handle;
|
||||
|
||||
~CursorContext();
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@ curvetest (string filename)
|
|||
stringstream line;
|
||||
//Evoral::Parameter param(GainAutomation, -1.0, +1.0, 0.0);
|
||||
Evoral::Parameter param(GainAutomation);
|
||||
AutomationList al (param, Temporal::TimeDomainProvider (Temporal::AudioTime));
|
||||
AutomationList al (param, Temporal::AudioTime);
|
||||
double minx = DBL_MAX;
|
||||
double maxx = DBL_MIN;
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
<Option name="color-regions-using-track-color" value="0"/>
|
||||
<Option name="show-waveform-clipping" value="1"/>
|
||||
<Option name="lock-gui-after-seconds" value="0"/>
|
||||
<Option name="sensitize-playhead" value="0"/>
|
||||
<Option name="draggable-playhead" value="1"/>
|
||||
<Option name="no-new-session-dialog" value="1"/>
|
||||
<Option name="show-track-meters" value="1"/>
|
||||
<Option name="default-narrow_ms" value="0"/>
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue