Compare commits

..

2 Commits

Author SHA1 Message Date
Robin Gareus 991ab1f8f8 Handle tempo-map changes in sync from the calling thread
This is required to collect relevent undo/redo information, notably
automation-data changes from Playlist::update_after_tempo_map_change and
DiskReader::playlist_ranges_moved.

The realtime thread should not move regions to begin with, and debug
builds woudl also assert since no undo operation was started.
2022-10-23 23:24:12 +02:00
Robin Gareus c437d6f886 Commit TempoChange undo operation after map update
Tempo Map updates can change a region's position/length, in which case
region-automation may follow the region, and DiskReader:: playlist_ranges_moved
will save additional undo information.

These MementoCommand(s) need to be included in the undo operation.
2022-10-23 23:21:08 +02:00
3142 changed files with 100104 additions and 1102407 deletions

3
.gitignore vendored
View File

@ -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
View File

@ -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

View File

@ -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"
>

View File

@ -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

View File

@ -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"

View File

@ -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

View File

@ -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)

View File

@ -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;
}

View File

@ -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.

View File

@ -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")

View File

@ -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")

View File

@ -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")

View File

@ -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")

View File

@ -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,

View File

@ -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;

View File

@ -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"

View File

@ -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"

View File

@ -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@

View File

@ -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>

View File

@ -7,4 +7,3 @@ Terminal=false
MimeType=application/x-ardour;
Type=Application
Categories=AudioVideo;Audio;AudioEditing;X-Recorders;X-Multitrack;X-Jack;
StartupWMClass=Ardour

View File

@ -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

View File

@ -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'>

View File

@ -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);
}

View File

@ -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;
};

View File

@ -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
*/
}

View File

@ -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 ();

View File

@ -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 ();

View File

@ -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);
}

View File

@ -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__ */

View File

@ -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);
}

View File

@ -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);
}
}

View File

@ -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;
}

View File

@ -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");
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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 ();
}

View File

@ -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");

View File

@ -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
}
}

View File

@ -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);
}
}

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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 "$@"

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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 ();

View File

@ -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);
}

View File

@ -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&);

View File

@ -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 ();
}

View File

@ -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);

View File

@ -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);
}

View File

@ -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;

View File

@ -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 &region_before = audio_region()->get_state();
audio_region()->set_envelope_active(true);
XMLNode &region_after = audio_region()->get_state();
region_memento = new MementoCommand<AudioRegion>(*(audio_region().get()), &region_before, &region_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);
}

View File

@ -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__ */

View File

@ -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);
}
}
}

View File

@ -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;
};

View File

@ -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;

View File

@ -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();

View File

@ -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

View File

@ -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;
}

View File

@ -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;

View File

@ -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 ();
}

View File

@ -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__ */

View File

@ -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);
}

View File

@ -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;
};

View File

@ -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 {

View File

@ -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)) {

View File

@ -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 ();

View File

@ -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));
}

View File

@ -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);
};

View File

@ -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__ */

View File

@ -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;
}
}

View File

@ -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 ();

View File

@ -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());

View File

@ -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;

View File

@ -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));
}

View File

@ -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;

View File

@ -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")) {

View File

@ -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)

View File

@ -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;
};

View File

@ -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"

View File

@ -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;
}

View File

@ -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);

View File

@ -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);
}

View File

@ -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

View File

@ -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; }

View File

@ -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 ();
}

View File

@ -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_;
};

View File

@ -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));

View File

@ -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;

View File

@ -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);

View File

@ -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;

View File

@ -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>());
}
}

View File

@ -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();

View File

@ -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;

View File

@ -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