From 83a92a0ea1e0eb60aacc5dc0a410d62b3c3eafd9 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 11 Jul 2013 10:31:47 -0400 Subject: [PATCH 001/221] disable libardour unit tests that do not function correctly (for windows, at least) --- libs/ardour/wscript | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libs/ardour/wscript b/libs/ardour/wscript index 78bf01c062..ef510dae6e 100644 --- a/libs/ardour/wscript +++ b/libs/ardour/wscript @@ -447,7 +447,6 @@ def build(bld): test/test_needing_session.cc test/audio_region_test.cc test/test_globals.cc - test/audio_region_read_test.cc test/automation_list_property_test.cc test/bbt_test.cc test/tempo_test.cc @@ -458,10 +457,8 @@ def build(bld): test/framepos_plus_beats_test.cc test/framepos_minus_beats_test.cc test/playlist_layering_test.cc - test/playlist_read_test.cc test/playlist_equivalent_regions_test.cc test/control_surfaces_test.cc - test/combine_regions_test.cc test/region_naming_test.cc test/load_sessions_test.cc test/mtdm_test.cc @@ -469,6 +466,9 @@ def build(bld): '''.split() # Tests that don't work +# test/playlist_read_test.cc +# test/audio_region_read_test.cc +# test/combine_regions_test.cc # test/mantis_3356_test.cc testobj.includes = obj.includes + ['test', '../pbd', '../libltc', '../audiographer'] From 7a5118f403506a6af2b586478ea4a7bdfb05ead4 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 11 Jul 2013 10:57:21 -0400 Subject: [PATCH 002/221] Add --single-tests option to also build each libardour test as a separate program --- libs/ardour/run-profiling.sh | 20 +----- libs/ardour/run-tests.sh | 52 +++++++------- libs/ardour/wscript | 129 ++++++++++++++++++++++------------- wscript | 4 ++ 4 files changed, 115 insertions(+), 90 deletions(-) diff --git a/libs/ardour/run-profiling.sh b/libs/ardour/run-profiling.sh index 30daac9e6e..541c7254ce 100644 --- a/libs/ardour/run-profiling.sh +++ b/libs/ardour/run-profiling.sh @@ -3,30 +3,12 @@ # Run libardour profiling tests. # -if [ ! -f './tempo.cc' ]; then - echo "This script must be run from within the libs/ardour directory"; - exit 1; -fi - if [ "$1" == "" ]; then echo "Syntax: run-profiling.sh [flag] []" exit 1; fi -cd ../.. -top=`pwd` -cd build - -libs='libs' - -export LD_LIBRARY_PATH=$libs/audiographer:$libs/vamp-sdk:$libs/surfaces:$libs/surfaces/control_protocol:$libs/ardour:$libs/midi++2:$libs/pbd:$libs/rubberband:$libs/soundtouch:$libs/gtkmm2ext:$libs/appleutility:$libs/taglib:$libs/evoral:$libs/evoral/src/libsmf:$libs/timecode:/usr/local/lib:/usr/local/lib64:$LD_LIBRARY_PATH - -export ARDOUR_CONFIG_PATH=$top:$top/gtk2_ardour:$libs/..:$libs/../gtk2_ardour -export ARDOUR_PANNER_PATH=$libs/panners/2in2out:$libs/panners/1in2out:$libs/panners/vbap -export ARDOUR_SURFACES_PATH=$libs/surfaces/osc:$libs/surfaces/generic_midi:$libs/surfaces/tranzport:$libs/surfaces/powermate:$libs/surfaces/mackie -export ARDOUR_MCP_PATH="../mcp" -export ARDOUR_DLL_PATH=$libs -export ARDOUR_DATA_PATH=$top/gtk2_ardour:$top/build/gtk2_ardour:. +. test-env.sh export LD_PRELOAD=/home/carl/src/libfakejack/libjack.so # session='32tracks' diff --git a/libs/ardour/run-tests.sh b/libs/ardour/run-tests.sh index b31751991c..fc7d68a8a5 100755 --- a/libs/ardour/run-tests.sh +++ b/libs/ardour/run-tests.sh @@ -3,30 +3,32 @@ # Run libardour test suite. # -if [ ! -f './tempo.cc' ]; then - echo "This script must be run from within the libs/ardour directory"; - exit 1; -fi - -cd ../.. -top=`pwd` -cd build - -libs='libs' - -export LD_LIBRARY_PATH=$libs/audiographer:$libs/vamp-sdk:$libs/surfaces:$libs/surfaces/control_protocol:$libs/ardour:$libs/midi++2:$libs/pbd:$libs/rubberband:$libs/soundtouch:$libs/gtkmm2ext:$libs/appleutility:$libs/taglib:$libs/evoral:$libs/evoral/src/libsmf:$libs/timecode:$libs/libltc:/usr/local/lib:/usr/local/lib64:$LD_LIBRARY_PATH - -export ARDOUR_CONFIG_PATH=$top:$top/gtk2_ardour:$libs/..:$libs/../gtk2_ardour -export ARDOUR_PANNER_PATH=$libs/panners/2in2out:$libs/panners/1in2out:$libs/panners/vbap -export ARDOUR_SURFACES_PATH=$libs/surfaces/osc:$libs/surfaces/generic_midi:$libs/surfaces/tranzport:$libs/surfaces/powermate:$libs/surfaces/mackie -export ARDOUR_MCP_PATH="../mcp" -export ARDOUR_DLL_PATH=$libs -export ARDOUR_DATA_PATH=$top/gtk2_ardour:$top/build/gtk2_ardour:. - -if [ "$1" == "--debug" ]; then - gdb ./libs/ardour/run-tests -elif [ "$1" == "--valgrind" ]; then - valgrind ./libs/ardour/run-tests +if [ "$1" == "--single" ] || [ "$2" == "--single" ]; then + if [ "$1" == "--single" ]; then + TESTS="test_*$2*" + elif [ "$2" == "--single" ]; then + TESTS="test_*$3*" + else + TESTS='test_*' + fi + for test_program in `find libs/ardour -name "$TESTS" -type f -perm /u+x`; + do + echo "Running $test_program..." + if [ "$1" == "--debug" ]; then + gdb ./"$test_program" + elif [ "$1" == "--valgrind" ]; then + valgrind ./"$test_program" + else + ./"$test_program" + fi + done else - ./libs/ardour/run-tests $* + if [ "$1" == "--debug" ]; then + gdb ./libs/ardour/run-tests + elif [ "$1" == "--valgrind" ]; then + valgrind ./libs/ardour/run-tests + else + ./libs/ardour/run-tests $* + fi fi + diff --git a/libs/ardour/wscript b/libs/ardour/wscript index ef510dae6e..106cb320ba 100644 --- a/libs/ardour/wscript +++ b/libs/ardour/wscript @@ -440,29 +440,65 @@ def build(bld): if bld.env['BUILD_TESTS'] and bld.is_defined('HAVE_CPPUNIT'): # Unit tests - testobj = bld(features = 'cxx cxxprogram') - testobj.source = ''' - test/dummy_lxvst.cc - test/test_util.cc - test/test_needing_session.cc - test/audio_region_test.cc - test/test_globals.cc - test/automation_list_property_test.cc - test/bbt_test.cc - test/tempo_test.cc - test/interpolation_test.cc - test/midi_clock_slave_test.cc - test/resampled_source_test.cc - test/framewalk_to_beats_test.cc - test/framepos_plus_beats_test.cc - test/framepos_minus_beats_test.cc - test/playlist_layering_test.cc - test/playlist_equivalent_regions_test.cc - test/control_surfaces_test.cc - test/region_naming_test.cc - test/load_sessions_test.cc - test/mtdm_test.cc - test/testrunner.cc + # only build these common sources once + testcommon = bld(features = 'cxx') + testcommon.includes = obj.includes + ['test', '../pbd', '..'] + testcommon.source = ['test/test_globals.cc', 'test/testrunner.cc', 'test/test_needing_session.cc', + 'test/dummy_lxvst.cc', 'test/audio_region_test.cc', 'test/test_util.cc' ] + testcommon.uselib = ['CPPUNIT','SIGCPP','JACK','GLIBMM','GTHREAD', + 'SAMPLERATE','XML','LRDF','COREAUDIO'] + testcommon.use = ['libpbd','libmidipp','libevoral','libvamphost', + 'libvampplugin','libtaglib','librubberband', + 'libaudiographer','libltc','ardour'] + testcommon.defines = [ + 'DATA_DIR="' + os.path.normpath(bld.env['DATADIR']) + '"', + 'CONFIG_DIR="' + os.path.normpath(bld.env['SYSCONFDIR']) + '"', + 'LOCALEDIR="' + os.path.join( + os.path.normpath(bld.env['DATADIR']), 'locale') + '"', + 'VAMP_DIR="' + os.path.join( + os.path.normpath(bld.env['LIBDIR']), 'ardour3', 'vamp') + '"' + ] + testcommon.name = 'testcommon' + + if bld.env['FPU_OPTIMIZATION']: + testcommon.source += [ 'sse_functions_xmm.cc' ] + if (bld.env['build_target'] == 'i386' + or bld.env['build_target'] == 'i686'): + testcommon.source += [ 'sse_functions.s' ] + elif bld.env['build_target'] == 'x86_64': + testcommon.source += [ 'sse_functions_64bit.s' ] + + if bld.env['SINGLE_TESTS']: + create_ardour_test_program(bld, obj.includes, 'automation_list_property_test', 'test_automation_list_property', ['test/automation_list_property_test.cc']) + create_ardour_test_program(bld, obj.includes, 'bbt', 'test_bbt', ['test/bbt_test.cc']) + create_ardour_test_program(bld, obj.includes, 'tempo', 'test_tempo', ['test/tempo_test.cc']) + create_ardour_test_program(bld, obj.includes, 'interpolation', 'test_interpolation', ['test/interpolation_test.cc']) + create_ardour_test_program(bld, obj.includes, 'midi_clock_slave', 'test_midi_clock_slave', ['test/midi_clock_slave_test.cc']) + create_ardour_test_program(bld, obj.includes, 'resampled_source', 'test_resampled_source', ['test/resampled_source_test.cc']) + create_ardour_test_program(bld, obj.includes, 'framewalk_to_beats', 'test_framewalk_to_beats', ['test/framewalk_to_beats_test.cc']) + create_ardour_test_program(bld, obj.includes, 'framepos_plus_beats', 'test_framepos_plus_beats', ['test/framepos_plus_beats_test.cc']) + create_ardour_test_program(bld, obj.includes, 'framepos_minus_beats', 'test_framepos_minus_beats', ['test/framepos_minus_beats_test.cc']) + create_ardour_test_program(bld, obj.includes, 'playlist_equivalent_regions', 'test_playlist_equivalent_regions', ['test/playlist_equivalent_regions_test.cc']) + create_ardour_test_program(bld, obj.includes, 'playlist_layering', 'test_playlist_layering', ['test/playlist_layering_test.cc']) + create_ardour_test_program(bld, obj.includes, 'region_naming', 'test_region_naming', ['test/region_naming_test.cc']) + create_ardour_test_program(bld, obj.includes, 'control_surface', 'test_control_surfaces', ['test/control_surfaces_test.cc']) + create_ardour_test_program(bld, obj.includes, 'mtdm_test', 'test_mtdm', ['test/mtdm_test.cc']) + + test_sources = ''' + test/automation_list_property_test.cc + test/bbt_test.cc + test/tempo_test.cc + test/interpolation_test.cc + test/midi_clock_slave_test.cc + test/resampled_source_test.cc + test/framewalk_to_beats_test.cc + test/framepos_plus_beats_test.cc + test/framepos_minus_beats_test.cc + test/playlist_equivalent_regions_test.cc + test/playlist_layering_test.cc + test/region_naming_test.cc + test/control_surfaces_test.cc + test/mtdm_test.cc '''.split() # Tests that don't work @@ -471,29 +507,7 @@ def build(bld): # test/combine_regions_test.cc # test/mantis_3356_test.cc - testobj.includes = obj.includes + ['test', '../pbd', '../libltc', '../audiographer'] - testobj.uselib = ['CPPUNIT','SIGCPP','JACK','GLIBMM','GTHREAD', - 'SAMPLERATE','XML','LRDF','COREAUDIO'] - testobj.use = ['libpbd','libmidipp','ardour','libltc','libaudiographer'] - testobj.name = 'libardour-tests' - testobj.target = 'run-tests' - testobj.install_path = '' - testobj.defines = [ - 'PACKAGE="libardour3test"', - 'DATA_DIR="' + os.path.normpath(bld.env['DATADIR']) + '"', - 'CONFIG_DIR="' + os.path.normpath(bld.env['SYSCONFDIR']) + '"', - 'LOCALEDIR="' + os.path.join( - os.path.normpath(bld.env['DATADIR']), 'locale') + '"', - 'VAMP_DIR="' + os.path.join( - os.path.normpath(bld.env['LIBDIR']), 'ardour3', 'vamp') + '"' - ] - if bld.env['FPU_OPTIMIZATION']: - testobj.source += [ 'sse_functions_xmm.cc' ] - if (bld.env['build_target'] == 'i386' - or bld.env['build_target'] == 'i686'): - testobj.source += [ 'sse_functions.s' ] - elif bld.env['build_target'] == 'x86_64': - testobj.source += [ 'sse_functions_64bit.s' ] + create_ardour_test_program(bld, obj.includes, 'libardour-tests', 'run-tests', test_sources) # Tester to just load a session session_load_tester = bld(features = 'cxx cxxprogram') @@ -563,6 +577,29 @@ def build(bld): elif bld.env['build_target'] == 'x86_64': profilingobj.source += [ 'sse_functions_64bit.s' ] +def create_ardour_test_program(bld, includes, name, target, sources): + testobj = bld(features = 'cxx cxxprogram') + testobj.includes = includes + ['test', '../pbd', '..'] + testobj.source = sources + testobj.uselib = ['CPPUNIT','SIGCPP','JACK','GLIBMM','GTHREAD', + 'SAMPLERATE','XML','LRDF','COREAUDIO'] + testobj.use = ['libpbd','libmidipp','libevoral','libvamphost', + 'libvampplugin','libtaglib','librubberband', + 'libaudiographer','libltc','ardour','testcommon'] + testobj.name = name + testobj.target = target + # not sure about install path + testobj.install_path = os.path.join(bld.env['LIBDIR'], 'ardour3') + testobj.defines = [ + 'PACKAGE="libardour3test"', + 'DATA_DIR="' + os.path.normpath(bld.env['DATADIR']) + '"', + 'CONFIG_DIR="' + os.path.normpath(bld.env['SYSCONFDIR']) + '"', + 'LOCALEDIR="' + os.path.join( + os.path.normpath(bld.env['DATADIR']), 'locale') + '"', + 'VAMP_DIR="' + os.path.join( + os.path.normpath(bld.env['LIBDIR']), 'ardour3', 'vamp') + '"' + ] + def shutdown(): autowaf.shutdown() diff --git a/wscript b/wscript index 6e51d3d24d..a6106c0aef 100644 --- a/wscript +++ b/wscript @@ -429,6 +429,8 @@ def options(opt): help='Raise a floating point exception if a denormal is detected') opt.add_option('--test', action='store_true', default=False, dest='build_tests', help="Build unit tests") + opt.add_option('--single-tests', action='store_true', default=False, dest='single_tests', + help="Build a single executable for each unit test") #opt.add_option('--tranzport', action='store_true', default=False, dest='tranzport', # help='Compile with support for Frontier Designs Tranzport (if libusb is available)') opt.add_option('--universal', action='store_true', default=False, dest='universal', @@ -626,6 +628,8 @@ def configure(conf): conf.env['ENABLE_NLS'] = True if opts.build_tests: conf.env['BUILD_TESTS'] = opts.build_tests + if opts.single_tests: + conf.env['SINGLE_TESTS'] = opts.single_tests #if opts.tranzport: # conf.env['TRANZPORT'] = 1 if opts.windows_vst: From a2f5a8d9c08c8779b0b7d193a74b233cd6f130e2 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 11 Jul 2013 10:58:35 -0400 Subject: [PATCH 003/221] Add test_search_path function in PBD testsuite --- libs/pbd/wscript | 1 + 1 file changed, 1 insertion(+) diff --git a/libs/pbd/wscript b/libs/pbd/wscript index 64dd2a332f..5c8ed194a8 100644 --- a/libs/pbd/wscript +++ b/libs/pbd/wscript @@ -147,6 +147,7 @@ def build(bld): test/signals_test.cc test/convert_test.cc test/filesystem_test.cc + test/test_common.cc '''.split() testobj.target = 'run-tests' testobj.includes = obj.includes + ['test', '../pbd'] From bceab192013e3e49b18b631598ebf9353f7db716 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 11 Jul 2013 10:59:30 -0400 Subject: [PATCH 004/221] Use test_search_path to find test data in xpath test --- libs/pbd/run-tests.sh | 1 + libs/pbd/test/xpath.cc | 22 +++++++++++++++++----- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/libs/pbd/run-tests.sh b/libs/pbd/run-tests.sh index c20dc42adc..4812b965d6 100755 --- a/libs/pbd/run-tests.sh +++ b/libs/pbd/run-tests.sh @@ -7,6 +7,7 @@ fi srcdir=`pwd` cd ../../build +export PBD_TEST_PATH=$srcdir/test libs='libs' diff --git a/libs/pbd/test/xpath.cc b/libs/pbd/test/xpath.cc index f0e976eabd..8b80eec2c6 100644 --- a/libs/pbd/test/xpath.cc +++ b/libs/pbd/test/xpath.cc @@ -3,18 +3,24 @@ #include "xpath.h" #include "pbd/xml++.h" +#include "pbd/file_utils.h" + +#include "test_common.h" CPPUNIT_TEST_SUITE_REGISTRATION (XPathTest); using namespace std; - -static string const prefix = "../libs/pbd/test/"; +using namespace PBD; void XPathTest::testMisc () { // cout << "Test 1: RosegardenPatchFile.xml: Find all banks in the file" << endl; - XMLTree doc(prefix + "RosegardenPatchFile.xml"); + + std::string testdata_path; + CPPUNIT_ASSERT (find_file_in_search_path (test_search_path (), "RosegardenPatchFile.xml", testdata_path)); + + XMLTree doc(testdata_path); // "//bank" gives as last element an empty element libxml bug???? boost::shared_ptr result = doc.find("//bank[@name]"); @@ -44,7 +50,10 @@ XPathTest::testMisc () // cout << endl << endl << "Test 3: TestSession.ardour: find all Sources where captured-for contains the string 'Guitar'" << endl; // We have to allocate a new document here, or we get segfaults - XMLTree doc2(prefix + "TestSession.ardour"); + std::string testsession_path; + CPPUNIT_ASSERT (find_file_in_search_path (test_search_path (), "TestSession.ardour", testsession_path)); + + XMLTree doc2(testsession_path); result = doc2.find("/Session/Sources/Source[contains(@captured-for, 'Guitar')]"); assert(result->size() == 16); @@ -67,8 +76,11 @@ XPathTest::testMisc () // cout << endl << endl << "Test 5: ProtoolsPatchFile.midnam: Get Banks and Patches for 'Name Set 1'" << endl; + std::string testmidnam_path; + CPPUNIT_ASSERT (find_file_in_search_path (test_search_path (), "ProtoolsPatchFile.midnam", testmidnam_path)); + // We have to allocate a new document here, or we get segfaults - XMLTree doc3(prefix + "ProtoolsPatchFile.midnam"); + XMLTree doc3(testmidnam_path); result = doc3.find("/MIDINameDocument/MasterDeviceNames/ChannelNameSet[@Name='Name Set 1']/PatchBank"); assert(result->size() == 16); From 060b381eb34823d193420ab987e455aab3a4900a Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 11 Jul 2013 11:00:59 -0400 Subject: [PATCH 005/221] Add test_search_path function in libardour testsuite --- libs/ardour/wscript | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/ardour/wscript b/libs/ardour/wscript index 106cb320ba..0eaf97be2f 100644 --- a/libs/ardour/wscript +++ b/libs/ardour/wscript @@ -444,7 +444,7 @@ def build(bld): testcommon = bld(features = 'cxx') testcommon.includes = obj.includes + ['test', '../pbd', '..'] testcommon.source = ['test/test_globals.cc', 'test/testrunner.cc', 'test/test_needing_session.cc', - 'test/dummy_lxvst.cc', 'test/audio_region_test.cc', 'test/test_util.cc' ] + 'test/test_common.cc', 'test/dummy_lxvst.cc', 'test/audio_region_test.cc', 'test/test_util.cc'] testcommon.uselib = ['CPPUNIT','SIGCPP','JACK','GLIBMM','GTHREAD', 'SAMPLERATE','XML','LRDF','COREAUDIO'] testcommon.use = ['libpbd','libmidipp','libevoral','libvamphost', From 4994073e93093f38cbd81a4b57cb0f19ceb2987d Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 11 Jul 2013 11:01:36 -0400 Subject: [PATCH 006/221] Use test_search_path function in ardour test --- libs/ardour/test/resampled_source_test.cc | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/libs/ardour/test/resampled_source_test.cc b/libs/ardour/test/resampled_source_test.cc index 983c0d88d2..5aaf71b7aa 100644 --- a/libs/ardour/test/resampled_source_test.cc +++ b/libs/ardour/test/resampled_source_test.cc @@ -1,15 +1,27 @@ +// this is included first to avoid SearchPath definition on windows +#include "test_common.h" + +#include "pbd/file_utils.h" #include "ardour/resampled_source.h" #include "ardour/sndfileimportable.h" #include "resampled_source_test.h" + CPPUNIT_TEST_SUITE_REGISTRATION (ResampledSourceTest); +using namespace std; using namespace ARDOUR; +using namespace PBD; void ResampledSourceTest::seekTest () { - boost::shared_ptr s (new SndFileImportableSource ("../libs/ardour/test/data/test.wav")); + std::string test_file_path; + const string test_filename = "test.wav"; + + CPPUNIT_ASSERT (find_file_in_search_path (test_search_path (), test_filename, test_file_path)); + + boost::shared_ptr s (new SndFileImportableSource (test_file_path)); ResampledImportableSource r (s, 48000, SrcBest); /* Make sure that seek (0) has the desired effect, ie that From d2ea18c4b657b47f5c202cedb8eb352365315797 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 11 Jul 2013 11:07:13 -0400 Subject: [PATCH 007/221] theoretically: "Add new_test_output_dir to common libardour test" but actually features addition of new files, thus losing git history for these two which came from tim mayberry --- libs/ardour/test/test_common.cc | 53 +++++++++++++++++++++++++++++++++ libs/ardour/test/test_common.h | 28 +++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 libs/ardour/test/test_common.cc create mode 100644 libs/ardour/test/test_common.h diff --git a/libs/ardour/test/test_common.cc b/libs/ardour/test/test_common.cc new file mode 100644 index 0000000000..8364d91be1 --- /dev/null +++ b/libs/ardour/test/test_common.cc @@ -0,0 +1,53 @@ +/* + Copyright (C) 2011 Tim Mayberry + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include + +#include +#include + +#include "test_common.h" + +using namespace std; + +PBD::SearchPath +test_search_path () +{ +#ifdef WIN32 + std::string wsp(g_win32_get_package_installation_directory_of_module(NULL)); + return Glib::build_filename (wsp, "ardour_testdata"); +#else + return Glib::getenv("ARDOUR_TEST_PATH"); +#endif +} + +std::string +new_test_output_dir () +{ + std::string tmp_dir = Glib::build_filename (g_get_tmp_dir(), "ardour_test"); + std::string dir_name; + std::string new_test_dir; + do { + ostringstream oss; + oss << g_random_int (); + dir_name = oss.str(); + new_test_dir = Glib::build_filename (tmp_dir, dir_name); + if (Glib::file_test (new_test_dir, Glib::FILE_TEST_EXISTS)) continue; + } while (g_mkdir_with_parents (new_test_dir.c_str(), 0755) != 0); + return new_test_dir; +} diff --git a/libs/ardour/test/test_common.h b/libs/ardour/test/test_common.h new file mode 100644 index 0000000000..9e15458781 --- /dev/null +++ b/libs/ardour/test/test_common.h @@ -0,0 +1,28 @@ +/* + Copyright (C) 2011 Tim Mayberry + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef ARDOUR_TEST_COMMON_H +#define ARDOUR_TEST_COMMON_H + +#include "pbd/search_path.h" + +PBD::SearchPath test_search_path (); + +std::string new_test_output_dir (); + +#endif From d555b43f5bdf2dc13105950e984ded8e9e57359a Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 11 Jul 2013 11:10:56 -0400 Subject: [PATCH 008/221] add new files from test changes by timbyr --- libs/ardour/test-env.sh | 24 ++ .../2 Track-template.template | 238 ++++++++++++++++++ libs/ardour/test/session_test.cc | 121 +++++++++ libs/ardour/test/session_test.h | 18 ++ libs/pbd/test/test_common.cc | 37 +++ libs/pbd/test/test_common.h | 26 ++ 6 files changed, 464 insertions(+) create mode 100644 libs/ardour/test-env.sh create mode 100644 libs/ardour/test/data/2 Track-template/2 Track-template.template create mode 100644 libs/ardour/test/session_test.cc create mode 100644 libs/ardour/test/session_test.h create mode 100644 libs/pbd/test/test_common.cc create mode 100644 libs/pbd/test/test_common.h diff --git a/libs/ardour/test-env.sh b/libs/ardour/test-env.sh new file mode 100644 index 0000000000..aa2cff9219 --- /dev/null +++ b/libs/ardour/test-env.sh @@ -0,0 +1,24 @@ +#!/bin/bash +# +# Common libardour test env vars. +# + +if [ ! -f './tempo.cc' ]; then + echo "This script must be run from within the libs/ardour directory"; + exit 1; +fi + +srcdir=`pwd` +export ARDOUR_TEST_PATH=$srcdir/test/data +cd ../../build + +libs='libs' + +export LD_LIBRARY_PATH=$libs/audiographer:$libs/vamp-sdk:$libs/surfaces:$libs/surfaces/control_protocol:$libs/ardour:$libs/midi++2:$libs/pbd:$libs/rubberband:$libs/soundtouch:$libs/gtkmm2ext:$libs/appleutility:$libs/taglib:$libs/evoral:$libs/evoral/src/libsmf:$libs/timecode:$libs/libltc:/usr/local/lib:/usr/local/lib64:$LD_LIBRARY_PATH + +export ARDOUR_CONFIG_PATH=$top:$top/gtk2_ardour:$libs/..:$libs/../gtk2_ardour +export ARDOUR_PANNER_PATH=$libs/panners/2in2out:$libs/panners/1in2out:$libs/panners/vbap +export ARDOUR_SURFACES_PATH=$libs/surfaces/osc:$libs/surfaces/generic_midi:$libs/surfaces/tranzport:$libs/surfaces/powermate:$libs/surfaces/mackie +export ARDOUR_MCP_PATH="../mcp" +export ARDOUR_DLL_PATH=$libs +export ARDOUR_DATA_PATH=$top/gtk2_ardour:$top/build/gtk2_ardour:. diff --git a/libs/ardour/test/data/2 Track-template/2 Track-template.template b/libs/ardour/test/data/2 Track-template/2 Track-template.template new file mode 100644 index 0000000000..e43458ef24 --- /dev/null +++ b/libs/ardour/test/data/2 Track-template/2 Track-template.template @@ -0,0 +1,238 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/libs/ardour/test/session_test.cc b/libs/ardour/test/session_test.cc new file mode 100644 index 0000000000..83273b5a2e --- /dev/null +++ b/libs/ardour/test/session_test.cc @@ -0,0 +1,121 @@ + +#include +#include + +#include +#include "midi++/manager.h" +#include "pbd/textreceiver.h" +#include "pbd/file_utils.h" +#include "ardour/session.h" +#include "ardour/audioengine.h" +#include "ardour/smf_source.h" +#include "ardour/midi_model.h" + +#include "test_common.h" + +#include "session_test.h" + +CPPUNIT_TEST_SUITE_REGISTRATION (SessionTest); + +using namespace std; +using namespace ARDOUR; +using namespace PBD; + +static TextReceiver text_receiver ("test"); + +void +SessionTest::setUp () +{ + SessionEvent::create_per_thread_pool ("session_test", 512); + + text_receiver.listen_to (error); + text_receiver.listen_to (info); + text_receiver.listen_to (fatal); + text_receiver.listen_to (warning); + + // this is not a good singleton constructor pattern + AudioEngine* engine = 0; + + try { + engine = new AudioEngine ("session_test", ""); + } catch (const AudioEngine::NoBackendAvailable& engine_exception) { + cerr << engine_exception.what (); + } + + CPPUNIT_ASSERT (engine); + + init_post_engine (); + + CPPUNIT_ASSERT (engine->start () == 0); +} + +void +SessionTest::tearDown () +{ + // this is needed or there is a crash in MIDI::Manager::destroy + AudioEngine::instance()->stop (true); + + MIDI::Manager::destroy (); + AudioEngine::destroy (); +} + +void +SessionTest::new_session () +{ + const string session_name("test_session"); + std::string new_session_dir = Glib::build_filename (new_test_output_dir(), session_name); + + CPPUNIT_ASSERT (!Glib::file_test (new_session_dir, Glib::FILE_TEST_EXISTS)); + + Session* new_session = 0; + + new_session = new Session (*AudioEngine::instance (), new_session_dir, session_name); + + CPPUNIT_ASSERT (new_session); + + // shouldn't need to do this as it is done in Session constructor + // via Session::when_engine_running + //AudioEngine::instance->set_session (new_session); + + new_session->save_state (""); + + delete new_session; +} + +void +SessionTest::new_session_from_template () +{ + const string session_name("two_tracks"); + const string session_template_dir_name("2 Track-template"); + + std::string new_session_dir = Glib::build_filename (new_test_output_dir(), session_name); + + CPPUNIT_ASSERT (!Glib::file_test (new_session_dir, Glib::FILE_TEST_EXISTS)); + + std::string session_template_dir = test_search_path ().front (); + session_template_dir = Glib::build_filename (session_template_dir, "2 Track-template"); + + CPPUNIT_ASSERT (Glib::file_test (session_template_dir, Glib::FILE_TEST_IS_DIR)); + + Session* new_session = 0; + BusProfile* bus_profile = 0; + + // create a new session based on session template + new_session = new Session (*AudioEngine::instance (), new_session_dir, session_name, + bus_profile, session_template_dir); + + CPPUNIT_ASSERT (new_session); + + new_session->save_state (""); + + delete new_session; + + Session* template_session = 0; + + // reopen same session to check that it opens without error + template_session = new Session (*AudioEngine::instance (), new_session_dir, session_name); + + CPPUNIT_ASSERT (template_session); + + delete template_session; +} diff --git a/libs/ardour/test/session_test.h b/libs/ardour/test/session_test.h new file mode 100644 index 0000000000..cadab67d3b --- /dev/null +++ b/libs/ardour/test/session_test.h @@ -0,0 +1,18 @@ + +#include +#include + +class SessionTest : public CppUnit::TestFixture +{ + CPPUNIT_TEST_SUITE (SessionTest); + CPPUNIT_TEST (new_session); + CPPUNIT_TEST (new_session_from_template); + CPPUNIT_TEST_SUITE_END (); + +public: + virtual void setUp (); + virtual void tearDown (); + + void new_session (); + void new_session_from_template (); +}; diff --git a/libs/pbd/test/test_common.cc b/libs/pbd/test/test_common.cc new file mode 100644 index 0000000000..16da3ed2a8 --- /dev/null +++ b/libs/pbd/test/test_common.cc @@ -0,0 +1,37 @@ +/* + Copyright (C) 2011 Tim Mayberry + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include + +#include "test_common.h" + +/** + * This allows tests to find the data files they require by looking + * in an installed location on windows or by setting an environment variable + * on unix. + */ +PBD::SearchPath +test_search_path () +{ +#ifdef WIN32 + std::string wsp(g_win32_get_package_installation_directory_of_module(NULL)); + return Glib::build_filename (wsp, "pbd_testdata"); +#else + return Glib::getenv("PBD_TEST_PATH"); +#endif +} diff --git a/libs/pbd/test/test_common.h b/libs/pbd/test/test_common.h new file mode 100644 index 0000000000..0dc62f61dc --- /dev/null +++ b/libs/pbd/test/test_common.h @@ -0,0 +1,26 @@ +/* + Copyright (C) 2011 Tim Mayberry + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef PBD_TEST_COMMON_H +#define PBD_TEST_COMMON_H + +#include "pbd/search_path.h" + +PBD::SearchPath test_search_path (); + +#endif From dc491cffdb169130ac79c7c66d8e9901291272ab Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 11 Jul 2013 11:11:45 -0400 Subject: [PATCH 009/221] Use common test function to create temporary session --- .gitignore | 1 - libs/ardour/test/test_needing_session.cc | 9 ++++++--- libs/ardour/wscript | 2 ++ 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 48a95b8e4b..f2251ba204 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,6 @@ *.[oa] *.o *.os -*.template *.binding *.so *.dylib diff --git a/libs/ardour/test/test_needing_session.cc b/libs/ardour/test/test_needing_session.cc index a6220ded12..181d391e01 100644 --- a/libs/ardour/test/test_needing_session.cc +++ b/libs/ardour/test/test_needing_session.cc @@ -1,3 +1,5 @@ +#include + #include "midi++/manager.h" #include "pbd/compose.h" #include "pbd/enumwriter.h" @@ -5,6 +7,7 @@ #include "ardour/audioengine.h" #include "test_needing_session.h" #include "test_util.h" +#include "test_common.h" using namespace std; using namespace ARDOUR; @@ -13,9 +16,9 @@ using namespace PBD; void TestNeedingSession::setUp () { - string const test_session_path = "libs/ardour/test/test_session"; - system (string_compose ("rm -rf %1", test_session_path).c_str()); - _session = load_session (test_session_path, "test_session"); + const string session_name("test_session"); + std::string new_session_dir = Glib::build_filename (new_test_output_dir(), session_name); + _session = load_session (new_session_dir, "test_session"); } void diff --git a/libs/ardour/wscript b/libs/ardour/wscript index 0eaf97be2f..4e7e23aa1a 100644 --- a/libs/ardour/wscript +++ b/libs/ardour/wscript @@ -483,6 +483,7 @@ def build(bld): create_ardour_test_program(bld, obj.includes, 'region_naming', 'test_region_naming', ['test/region_naming_test.cc']) create_ardour_test_program(bld, obj.includes, 'control_surface', 'test_control_surfaces', ['test/control_surfaces_test.cc']) create_ardour_test_program(bld, obj.includes, 'mtdm_test', 'test_mtdm', ['test/mtdm_test.cc']) + create_ardour_test_program(bld, obj.includes, 'session_test', 'test_session', ['test/session_test.cc']) test_sources = ''' test/automation_list_property_test.cc @@ -499,6 +500,7 @@ def build(bld): test/region_naming_test.cc test/control_surfaces_test.cc test/mtdm_test.cc + test/session_test.cc '''.split() # Tests that don't work From e842ae539a6eed355bebe2669e8fb8bb1b83c667 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 11 Jul 2013 11:12:39 -0400 Subject: [PATCH 010/221] Fix portability of test and use temporary test --- libs/ardour/test/audio_region_test.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/libs/ardour/test/audio_region_test.cc b/libs/ardour/test/audio_region_test.cc index c7008d90e5..df3fa72d10 100644 --- a/libs/ardour/test/audio_region_test.cc +++ b/libs/ardour/test/audio_region_test.cc @@ -16,6 +16,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include + #include "pbd/compose.h" #include "ardour/playlist_factory.h" #include "ardour/source_factory.h" @@ -26,6 +28,7 @@ #include "ardour/audioplaylist.h" #include "audio_region_test.h" #include "test_globals.h" +#include "test_common.h" using namespace std; using namespace PBD; @@ -36,9 +39,7 @@ AudioRegionTest::setUp () { TestNeedingSession::setUp (); - /* This is important, otherwise createWritable will mark the source immutable (hence unwritable) */ - unlink ("libs/ardour/test/test.wav"); - string const test_wav_path = "libs/ardour/test/test.wav"; + std::string const test_wav_path = Glib::build_filename (new_test_output_dir(), "test.wav"); _playlist = PlaylistFactory::create (DataType::AUDIO, *_session, "test"); _audio_playlist = boost::dynamic_pointer_cast (_playlist); _source = SourceFactory::createWritable (DataType::AUDIO, *_session, test_wav_path, "", false, Fs); From 7ef79d3f4b02e3d2e71d6888fbedd9b3f9c325c7 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 11 Jul 2013 11:19:57 -0400 Subject: [PATCH 011/221] Remove non-portable and unnused header includes --- gtk2_ardour/about.cc | 1 - libs/ardour/audio_diskstream.cc | 2 -- libs/ardour/audiosource.cc | 1 - libs/ardour/diskstream.cc | 1 - libs/ardour/midi_clock_slave.cc | 1 - libs/ardour/midi_diskstream.cc | 1 - libs/ardour/midi_source.cc | 1 - libs/ardour/mtc_slave.cc | 1 - libs/ardour/session_butler.cc | 10 ---------- libs/ardour/session_midi.cc | 2 -- libs/ardour/session_state.cc | 6 ------ libs/ardour/sndfilesource.cc | 2 -- libs/ardour/source.cc | 2 -- libs/pbd/sndfile_manager.cc | 1 - 14 files changed, 32 deletions(-) diff --git a/gtk2_ardour/about.cc b/gtk2_ardour/about.cc index 280f72a8dc..6255bfa108 100644 --- a/gtk2_ardour/about.cc +++ b/gtk2_ardour/about.cc @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include diff --git a/libs/ardour/audio_diskstream.cc b/libs/ardour/audio_diskstream.cc index c302e06681..7bfc9426cd 100644 --- a/libs/ardour/audio_diskstream.cc +++ b/libs/ardour/audio_diskstream.cc @@ -27,8 +27,6 @@ #include #include #include -#include -#include #include "pbd/error.h" #include "pbd/xml++.h" diff --git a/libs/ardour/audiosource.cc b/libs/ardour/audiosource.cc index 74dd52d504..e11fe1c4fa 100644 --- a/libs/ardour/audiosource.cc +++ b/libs/ardour/audiosource.cc @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include diff --git a/libs/ardour/diskstream.cc b/libs/ardour/diskstream.cc index a359f228e8..6ef4327343 100644 --- a/libs/ardour/diskstream.cc +++ b/libs/ardour/diskstream.cc @@ -29,7 +29,6 @@ #include #include #include -#include #include diff --git a/libs/ardour/midi_clock_slave.cc b/libs/ardour/midi_clock_slave.cc index 6f54d17d02..8906ddb6c4 100644 --- a/libs/ardour/midi_clock_slave.cc +++ b/libs/ardour/midi_clock_slave.cc @@ -20,7 +20,6 @@ #include #include -#include #include #include #include "pbd/error.h" diff --git a/libs/ardour/midi_diskstream.cc b/libs/ardour/midi_diskstream.cc index 9c11e818ac..a21f3fb6f4 100644 --- a/libs/ardour/midi_diskstream.cc +++ b/libs/ardour/midi_diskstream.cc @@ -28,7 +28,6 @@ #include #include // for ffs(3) #include -#include #include "pbd/error.h" #include "pbd/basename.h" diff --git a/libs/ardour/midi_source.cc b/libs/ardour/midi_source.cc index 124d3f7c9b..1887b74302 100644 --- a/libs/ardour/midi_source.cc +++ b/libs/ardour/midi_source.cc @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include diff --git a/libs/ardour/mtc_slave.cc b/libs/ardour/mtc_slave.cc index 8ce0722d8b..14ca928905 100644 --- a/libs/ardour/mtc_slave.cc +++ b/libs/ardour/mtc_slave.cc @@ -19,7 +19,6 @@ */ #include #include -#include #include #include diff --git a/libs/ardour/session_butler.cc b/libs/ardour/session_butler.cc index 1d235b051a..3e7c2226cc 100644 --- a/libs/ardour/session_butler.cc +++ b/libs/ardour/session_butler.cc @@ -17,16 +17,6 @@ */ -#include -#include -#include -#include -#include -#include -#include - -#include - #include "pbd/error.h" #include "pbd/pthread_utils.h" #include "pbd/stacktrace.h" diff --git a/libs/ardour/session_midi.cc b/libs/ardour/session_midi.cc index 50a7178f1b..9feaa1fb2b 100644 --- a/libs/ardour/session_midi.cc +++ b/libs/ardour/session_midi.cc @@ -22,8 +22,6 @@ #include #include #include -#include -#include #include diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index 49a0eed559..ff7da665ed 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -33,17 +33,11 @@ #include #include #include -#include -#include #include -#include #include #ifdef HAVE_SYS_VFS_H #include -#else -#include -#include #endif #ifdef HAVE_SYS_STATVFS_H diff --git a/libs/ardour/sndfilesource.cc b/libs/ardour/sndfilesource.cc index cf75cffba3..f29682aeaa 100644 --- a/libs/ardour/sndfilesource.cc +++ b/libs/ardour/sndfilesource.cc @@ -26,8 +26,6 @@ #include #include -#include -#include #include #include diff --git a/libs/ardour/source.cc b/libs/ardour/source.cc index 618dddc70b..03039fea5b 100644 --- a/libs/ardour/source.cc +++ b/libs/ardour/source.cc @@ -19,8 +19,6 @@ #include #include -#include -#include #include #include #include diff --git a/libs/pbd/sndfile_manager.cc b/libs/pbd/sndfile_manager.cc index d1dcd05256..c028bc11ba 100644 --- a/libs/pbd/sndfile_manager.cc +++ b/libs/pbd/sndfile_manager.cc @@ -22,7 +22,6 @@ */ #include -#include #include #include #include From 4be2176bd900d3ffc685e585c5f435e8f51db4f6 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 11 Jul 2013 11:23:41 -0400 Subject: [PATCH 012/221] Revert "Remove non-portable and unnused header includes" This reverts commit 7ef79d3f4b02e3d2e71d6888fbedd9b3f9c325c7. --- gtk2_ardour/about.cc | 1 + libs/ardour/audio_diskstream.cc | 2 ++ libs/ardour/audiosource.cc | 1 + libs/ardour/diskstream.cc | 1 + libs/ardour/midi_clock_slave.cc | 1 + libs/ardour/midi_diskstream.cc | 1 + libs/ardour/midi_source.cc | 1 + libs/ardour/mtc_slave.cc | 1 + libs/ardour/session_butler.cc | 10 ++++++++++ libs/ardour/session_midi.cc | 2 ++ libs/ardour/session_state.cc | 6 ++++++ libs/ardour/sndfilesource.cc | 2 ++ libs/ardour/source.cc | 2 ++ libs/pbd/sndfile_manager.cc | 1 + 14 files changed, 32 insertions(+) diff --git a/gtk2_ardour/about.cc b/gtk2_ardour/about.cc index 6255bfa108..280f72a8dc 100644 --- a/gtk2_ardour/about.cc +++ b/gtk2_ardour/about.cc @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include diff --git a/libs/ardour/audio_diskstream.cc b/libs/ardour/audio_diskstream.cc index 7bfc9426cd..c302e06681 100644 --- a/libs/ardour/audio_diskstream.cc +++ b/libs/ardour/audio_diskstream.cc @@ -27,6 +27,8 @@ #include #include #include +#include +#include #include "pbd/error.h" #include "pbd/xml++.h" diff --git a/libs/ardour/audiosource.cc b/libs/ardour/audiosource.cc index e11fe1c4fa..74dd52d504 100644 --- a/libs/ardour/audiosource.cc +++ b/libs/ardour/audiosource.cc @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include diff --git a/libs/ardour/diskstream.cc b/libs/ardour/diskstream.cc index 6ef4327343..a359f228e8 100644 --- a/libs/ardour/diskstream.cc +++ b/libs/ardour/diskstream.cc @@ -29,6 +29,7 @@ #include #include #include +#include #include diff --git a/libs/ardour/midi_clock_slave.cc b/libs/ardour/midi_clock_slave.cc index 8906ddb6c4..6f54d17d02 100644 --- a/libs/ardour/midi_clock_slave.cc +++ b/libs/ardour/midi_clock_slave.cc @@ -20,6 +20,7 @@ #include #include +#include #include #include #include "pbd/error.h" diff --git a/libs/ardour/midi_diskstream.cc b/libs/ardour/midi_diskstream.cc index a21f3fb6f4..9c11e818ac 100644 --- a/libs/ardour/midi_diskstream.cc +++ b/libs/ardour/midi_diskstream.cc @@ -28,6 +28,7 @@ #include #include // for ffs(3) #include +#include #include "pbd/error.h" #include "pbd/basename.h" diff --git a/libs/ardour/midi_source.cc b/libs/ardour/midi_source.cc index 1887b74302..124d3f7c9b 100644 --- a/libs/ardour/midi_source.cc +++ b/libs/ardour/midi_source.cc @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include diff --git a/libs/ardour/mtc_slave.cc b/libs/ardour/mtc_slave.cc index 14ca928905..8ce0722d8b 100644 --- a/libs/ardour/mtc_slave.cc +++ b/libs/ardour/mtc_slave.cc @@ -19,6 +19,7 @@ */ #include #include +#include #include #include diff --git a/libs/ardour/session_butler.cc b/libs/ardour/session_butler.cc index 3e7c2226cc..1d235b051a 100644 --- a/libs/ardour/session_butler.cc +++ b/libs/ardour/session_butler.cc @@ -17,6 +17,16 @@ */ +#include +#include +#include +#include +#include +#include +#include + +#include + #include "pbd/error.h" #include "pbd/pthread_utils.h" #include "pbd/stacktrace.h" diff --git a/libs/ardour/session_midi.cc b/libs/ardour/session_midi.cc index 9feaa1fb2b..50a7178f1b 100644 --- a/libs/ardour/session_midi.cc +++ b/libs/ardour/session_midi.cc @@ -22,6 +22,8 @@ #include #include #include +#include +#include #include diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index ff7da665ed..49a0eed559 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -33,11 +33,17 @@ #include #include #include +#include +#include #include +#include #include #ifdef HAVE_SYS_VFS_H #include +#else +#include +#include #endif #ifdef HAVE_SYS_STATVFS_H diff --git a/libs/ardour/sndfilesource.cc b/libs/ardour/sndfilesource.cc index f29682aeaa..cf75cffba3 100644 --- a/libs/ardour/sndfilesource.cc +++ b/libs/ardour/sndfilesource.cc @@ -26,6 +26,8 @@ #include #include +#include +#include #include #include diff --git a/libs/ardour/source.cc b/libs/ardour/source.cc index 03039fea5b..618dddc70b 100644 --- a/libs/ardour/source.cc +++ b/libs/ardour/source.cc @@ -19,6 +19,8 @@ #include #include +#include +#include #include #include #include diff --git a/libs/pbd/sndfile_manager.cc b/libs/pbd/sndfile_manager.cc index c028bc11ba..d1dcd05256 100644 --- a/libs/pbd/sndfile_manager.cc +++ b/libs/pbd/sndfile_manager.cc @@ -22,6 +22,7 @@ */ #include +#include #include #include #include From bd9e2737b7acefd6be7c409b5d41797d386cc08f Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Thu, 11 Jul 2013 14:50:33 +0200 Subject: [PATCH 013/221] NOOP - prevent headaches and remove cruft Every "point zero one" seconds is only 25 Hz in ardour.. --- gtk2_ardour/ardour_ui.cc | 7 +++---- gtk2_ardour/ardour_ui.h | 12 +++++++++--- gtk2_ardour/ardour_ui_dialogs.cc | 5 ++--- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 77fab156bb..3bd2768a4c 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -898,8 +898,7 @@ If you still wish to quit, please use the\n\n\ second_connection.disconnect (); point_one_second_connection.disconnect (); - point_oh_five_second_connection.disconnect (); - point_zero_one_second_connection.disconnect(); + point_zero_something_second_connection.disconnect(); } delete ARDOUR_UI::instance()->video_timeline; @@ -1029,9 +1028,9 @@ ARDOUR_UI::every_point_one_seconds () } gint -ARDOUR_UI::every_point_zero_one_seconds () +ARDOUR_UI::every_point_zero_something_seconds () { - // august 2007: actual update frequency: 40Hz, not 100Hz + // august 2007: actual update frequency: 25Hz (40ms), not 100Hz SuperRapidScreenUpdate(); /* EMIT_SIGNAL */ return TRUE; diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index dd025b6f8b..5817293b29 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -177,10 +177,17 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr static PublicEditor* _instance; static sigc::signal Blink; + + /** point_zero_one_seconds -- 10Hz ^= 100ms */ static sigc::signal RapidScreenUpdate; + + /** point_zero_something_seconds -- currently 25Hz ^= 40ms */ static sigc::signal SuperRapidScreenUpdate; + /** Emitted frequently with the audible frame, false, and the edit point as * parameters respectively. + * + * (either RapidScreenUpdate || SuperRapidScreenUpdate - user-config) */ static sigc::signal Clock; @@ -521,12 +528,11 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr gint every_second (); gint every_point_one_seconds (); - gint every_point_zero_one_seconds (); + gint every_point_zero_something_seconds (); sigc::connection second_connection; sigc::connection point_one_second_connection; - sigc::connection point_oh_five_second_connection; - sigc::connection point_zero_one_second_connection; + sigc::connection point_zero_something_second_connection; void open_session (); void open_recent_session (); diff --git a/gtk2_ardour/ardour_ui_dialogs.cc b/gtk2_ardour/ardour_ui_dialogs.cc index 5422bb9957..8c78d6494d 100644 --- a/gtk2_ardour/ardour_ui_dialogs.cc +++ b/gtk2_ardour/ardour_ui_dialogs.cc @@ -183,7 +183,7 @@ ARDOUR_UI::set_session (Session *s) second_connection = Glib::signal_timeout().connect (sigc::mem_fun(*this, &ARDOUR_UI::every_second), 1000); point_one_second_connection = Glib::signal_timeout().connect (sigc::mem_fun(*this, &ARDOUR_UI::every_point_one_seconds), 100); - point_zero_one_second_connection = Glib::signal_timeout().connect (sigc::mem_fun(*this, &ARDOUR_UI::every_point_zero_one_seconds), 40); + point_zero_something_second_connection = Glib::signal_timeout().connect (sigc::mem_fun(*this, &ARDOUR_UI::every_point_zero_something_seconds), 40); update_format (); } @@ -223,8 +223,7 @@ ARDOUR_UI::unload_session (bool hide_stuff) second_connection.disconnect (); point_one_second_connection.disconnect (); - point_oh_five_second_connection.disconnect (); - point_zero_one_second_connection.disconnect(); + point_zero_something_second_connection.disconnect(); ActionManager::set_sensitive (ActionManager::session_sensitive_actions, false); From c33cabeb828d673f2298c0894ebf1b1d3ad79218 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Thu, 11 Jul 2013 14:54:28 +0200 Subject: [PATCH 014/221] update plugin UIs at reasonable rate (25Hz) --- gtk2_ardour/generic_pluginui.cc | 2 +- gtk2_ardour/lv2_plugin_ui.cc | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/gtk2_ardour/generic_pluginui.cc b/gtk2_ardour/generic_pluginui.cc index 52bb468a67..72273f512a 100644 --- a/gtk2_ardour/generic_pluginui.cc +++ b/gtk2_ardour/generic_pluginui.cc @@ -836,7 +836,7 @@ GenericPluginUI::start_updating (GdkEventAny*) { if (output_controls.size() > 0 ) { screen_update_connection.disconnect(); - screen_update_connection = ARDOUR_UI::instance()->RapidScreenUpdate.connect + screen_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect (sigc::mem_fun(*this, &GenericPluginUI::output_update)); } return false; diff --git a/gtk2_ardour/lv2_plugin_ui.cc b/gtk2_ardour/lv2_plugin_ui.cc index 839bc6a4b8..2fe817a6a0 100644 --- a/gtk2_ardour/lv2_plugin_ui.cc +++ b/gtk2_ardour/lv2_plugin_ui.cc @@ -144,7 +144,7 @@ LV2PluginUI::start_updating(GdkEventAny*) { if (!_output_ports.empty()) { _screen_update_connection.disconnect(); - _screen_update_connection = ARDOUR_UI::instance()->RapidScreenUpdate.connect + _screen_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect (sigc::mem_fun(*this, &LV2PluginUI::output_update)); } return false; @@ -322,7 +322,7 @@ LV2PluginUI::lv2ui_instantiate(const std::string& title) if (_lv2->has_message_output()) { _lv2->enable_ui_emmission(); - ARDOUR_UI::instance()->RapidScreenUpdate.connect( + ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect( sigc::mem_fun(*this, &LV2PluginUI::update_timeout)); } } @@ -432,7 +432,7 @@ LV2PluginUI::on_window_show(const std::string& title) LV2_EXTERNAL_UI_SHOW(_external_ui_ptr); _screen_update_connection.disconnect(); - _screen_update_connection = ARDOUR_UI::instance()->RapidScreenUpdate.connect + _screen_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect (sigc::mem_fun(*this, &LV2PluginUI::output_update)); return false; } else { From 75f0dfb4a8b7b15dff83b3af3ecaa15f78f6de2b Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Thu, 11 Jul 2013 15:44:35 +0200 Subject: [PATCH 015/221] fix compiler warning --- libs/gtkmm2ext/gtkmm2ext/dndvbox.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/gtkmm2ext/gtkmm2ext/dndvbox.h b/libs/gtkmm2ext/gtkmm2ext/dndvbox.h index bc5ca6c725..bbfd183c7b 100644 --- a/libs/gtkmm2ext/gtkmm2ext/dndvbox.h +++ b/libs/gtkmm2ext/gtkmm2ext/dndvbox.h @@ -351,7 +351,7 @@ private: /* dropped from ourselves onto ourselves */ - T* child = *((T **) selection_data.get_data()); + T* child = *((T * const *) selection_data.get_data()); if (drop.first == 0) { _internal_vbox.reorder_child (child->widget(), -1); From 56daf0b54f735d728bb04a115125b3a790357bc6 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Thu, 11 Jul 2013 15:52:08 +0200 Subject: [PATCH 016/221] change default color of plugin-UI gauge/meter --- gtk2_ardour/generic_pluginui.cc | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/gtk2_ardour/generic_pluginui.cc b/gtk2_ardour/generic_pluginui.cc index 72273f512a..0233b1192f 100644 --- a/gtk2_ardour/generic_pluginui.cc +++ b/gtk2_ardour/generic_pluginui.cc @@ -671,7 +671,17 @@ GenericPluginUI::build_control_ui (guint32 port_index, boost::shared_ptrmeterinfo = info; - info->meter = new FastMeter (5, 5, FastMeter::Vertical); + info->meter = new FastMeter ( + 5, 5, FastMeter::Vertical, 0, + 0x0000aaff, + 0x008800ff, 0x008800ff, + 0x00ff00ff, 0x00ff00ff, + 0xcccc00ff, 0xcccc00ff, + 0xffaa00ff, 0xffaa00ff, + 0xff0000ff, + ARDOUR_UI::config()->canvasvar_MeterBackgroundBot.get(), + ARDOUR_UI::config()->canvasvar_MeterBackgroundTop.get() + ); info->min_unbound = desc.min_unbound; info->max_unbound = desc.max_unbound; From 66763688d53516f3745cc5f214fe585cd30f3792 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Thu, 11 Jul 2013 16:42:26 +0200 Subject: [PATCH 017/221] make config-window suitable for small[er] screens --- gtk2_ardour/configinfo.cc | 10 ++++++++-- gtk2_ardour/configinfo.h | 2 ++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/gtk2_ardour/configinfo.cc b/gtk2_ardour/configinfo.cc index 29c7e8fe63..67f13a1f5b 100644 --- a/gtk2_ardour/configinfo.cc +++ b/gtk2_ardour/configinfo.cc @@ -31,9 +31,15 @@ ConfigInfoDialog::ConfigInfoDialog () text.get_buffer()->set_text (std::string (ARDOUR::ardour_config_info)); text.set_wrap_mode (Gtk::WRAP_WORD); text.show (); - text.set_size_request (300, 800); - get_vbox()->pack_start (text, true, true); + scroller.set_shadow_type(Gtk::SHADOW_NONE); + scroller.set_border_width(0); + scroller.add (text); + scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); + scroller.show(); + + get_vbox()->pack_start (scroller, true, true); + set_size_request (400, 600); add_button (Gtk::Stock::CLOSE, Gtk::RESPONSE_ACCEPT); } diff --git a/gtk2_ardour/configinfo.h b/gtk2_ardour/configinfo.h index 84f90b20a2..209392a8f1 100644 --- a/gtk2_ardour/configinfo.h +++ b/gtk2_ardour/configinfo.h @@ -18,6 +18,7 @@ */ #include +#include #include "ardour_dialog.h" @@ -28,4 +29,5 @@ class ConfigInfoDialog : public ArdourDialog private: Gtk::TextView text; + Gtk::ScrolledWindow scroller; }; From da79e702e461eca8f3b3f082227dce26592317b0 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Thu, 11 Jul 2013 20:38:52 +0200 Subject: [PATCH 018/221] clean up plugin-ui meter layout --- gtk2_ardour/generic_pluginui.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/gtk2_ardour/generic_pluginui.cc b/gtk2_ardour/generic_pluginui.cc index 0233b1192f..971dfc0e9b 100644 --- a/gtk2_ardour/generic_pluginui.cc +++ b/gtk2_ardour/generic_pluginui.cc @@ -661,7 +661,7 @@ GenericPluginUI::build_control_ui (guint32 port_index, boost::shared_ptrdisplay_label->set_name ("ParameterValueDisplay"); control_ui->display->add (*control_ui->display_label); - Gtkmm2ext::set_size_request_to_display_given_text (*control_ui->display, "-99,99", 2, 2); + Gtkmm2ext::set_size_request_to_display_given_text (*control_ui->display, "-888.8g", 2, 6); control_ui->display->show_all (); @@ -692,6 +692,9 @@ GenericPluginUI::build_control_ui (guint32 port_index, boost::shared_ptrvbox = manage (new VBox); control_ui->hbox = manage (new HBox); + control_ui->hbox->set_spacing(1); + control_ui->vbox->set_spacing(3); + control_ui->label.set_angle(90); control_ui->hbox->pack_start (control_ui->label, false, false); control_ui->hbox->pack_start (*info->meter, false, false); From 2a0440a37349b01d5b339dcd46e22d3f9cf85a2d Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Fri, 12 Jul 2013 12:47:12 +0200 Subject: [PATCH 019/221] remove *&@?!+%@ question :) I would like to record, edit and mix,... ..but I don't need software to hold my hand and ask childish questions if I would like to "open a session". --- gtk2_ardour/startup.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtk2_ardour/startup.cc b/gtk2_ardour/startup.cc index 6f0b1cfaab..ca598ba949 100644 --- a/gtk2_ardour/startup.cc +++ b/gtk2_ardour/startup.cc @@ -591,7 +591,7 @@ ArdourStartup::setup_initial_choice_page () ic_vbox.show_all (); initial_choice_index = append_page (ic_vbox); - set_page_title (ic_vbox, _("What would you like to do ?")); + set_page_title (ic_vbox, string_compose("%1 %2", PROGRAM_NAME, VERSIONSTRING)); set_page_header_image (ic_vbox, icon_pixbuf); /* user could just click on "Forward" if default From e0bbc0b435eb93ea2e1e2a61453a0639ac10071c Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Fri, 12 Jul 2013 17:56:42 +0200 Subject: [PATCH 020/221] minor peak-meter performance tweak * redraw only missing parts of the outside rectangle, * don't redraw RMS meter if value has not changed --- libs/gtkmm2ext/fastmeter.cc | 17 +++++------------ libs/gtkmm2ext/gtkmm2ext/fastmeter.h | 1 - 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/libs/gtkmm2ext/fastmeter.cc b/libs/gtkmm2ext/fastmeter.cc index 4819609878..c0bcb05af5 100644 --- a/libs/gtkmm2ext/fastmeter.cc +++ b/libs/gtkmm2ext/fastmeter.cc @@ -53,7 +53,6 @@ FastMeter::FastMeter (long hold, unsigned long dimen, Orientation o, int len, { orientation = o; hold_cnt = hold; - resized = true; hold_state = 0; bright_hold = false; current_peak = 0; @@ -353,7 +352,6 @@ FastMeter::on_size_allocate (Gtk::Allocation &alloc) } DrawingArea::on_size_allocate (alloc); - resized = true; } bool @@ -372,16 +370,13 @@ FastMeter::vertical_expose (GdkEventExpose* ev) cairo_t* cr = gdk_cairo_create (get_window ()->gobj()); - if (resized) { - cairo_set_source_rgb (cr, 0, 0, 0); // black - rounded_rectangle (cr, 0, 0, pixrect.width + 2, pixheight + 2, 2); - cairo_stroke (cr); - //cairo_fill (cr); - //resized = false; - } cairo_rectangle (cr, ev->area.x, ev->area.y, ev->area.width, ev->area.height); cairo_clip (cr); + cairo_set_source_rgb (cr, 0, 0, 0); // black + rounded_rectangle (cr, 0, 0, pixrect.width + 2, pixheight + 2, 2); + cairo_stroke (cr); + top_of_meter = (gint) floor (pixheight * current_level); /* reset the height & origin of the rect that needs to show the pixbuf @@ -464,11 +459,10 @@ FastMeter::set (float lvl, float peak) current_level = lvl; - if (current_level == old_level && current_peak == old_peak && hold_state == 0) { + if (current_level == old_level && current_peak == old_peak && (hold_state == 0 || peak != -1)) { return; } - Glib::RefPtr win; if ((win = get_window()) == 0) { @@ -565,7 +559,6 @@ FastMeter::set_highlight (bool onoff) } highlight = onoff; bgpattern = request_vertical_background (request_width, pixheight, highlight ? _bgh : _bgc, highlight); - resized = true; queue_draw (); } diff --git a/libs/gtkmm2ext/gtkmm2ext/fastmeter.h b/libs/gtkmm2ext/gtkmm2ext/fastmeter.h index debe6c1cc7..f065020a57 100644 --- a/libs/gtkmm2ext/gtkmm2ext/fastmeter.h +++ b/libs/gtkmm2ext/gtkmm2ext/fastmeter.h @@ -91,7 +91,6 @@ private: float current_level; float current_peak; float current_user_level; - bool resized; bool highlight; bool vertical_expose (GdkEventExpose*); From 5bae4373c792481980a1e9a986627f90af4ea520 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Fri, 12 Jul 2013 19:07:07 +0200 Subject: [PATCH 021/221] implement visual-sensitivity (gray out) for faders Note: bar-controller sensitivity state is not yet set if automation-mode changes to/from play, but the widget now supports that. --- libs/gtkmm2ext/barcontroller.cc | 6 ++++++ libs/gtkmm2ext/pixfader.cc | 16 +++++++++------- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/libs/gtkmm2ext/barcontroller.cc b/libs/gtkmm2ext/barcontroller.cc index 50c21e57e7..693151aaed 100644 --- a/libs/gtkmm2ext/barcontroller.cc +++ b/libs/gtkmm2ext/barcontroller.cc @@ -468,6 +468,12 @@ BarController::expose (GdkEventExpose* /*event*/) break; } + if (!darea.get_sensitive()) { + rounded_rectangle (context, 0, 0, darea.get_width(), darea.get_height(), 3); + context->set_source_rgba (0.505, 0.517, 0.525, 0.6); + context->fill (); + } + /* draw label */ double xpos = -1; diff --git a/libs/gtkmm2ext/pixfader.cc b/libs/gtkmm2ext/pixfader.cc index 6e0c642917..0185550259 100644 --- a/libs/gtkmm2ext/pixfader.cc +++ b/libs/gtkmm2ext/pixfader.cc @@ -292,13 +292,15 @@ PixFader::on_expose_event (GdkEventExpose* ev) pango_cairo_show_layout (cr, _layout->gobj()); } -// if (Config->get_widget_prelight()) { //pixfader does not have access to config - if (_hovering) { - Gtkmm2ext::rounded_rectangle (cr, 0, 0, get_width(), get_height(), 3); - cairo_set_source_rgba (cr, 0.905, 0.917, 0.925, 0.1); - cairo_fill (cr); - } -// } + if (!get_sensitive()) { + Gtkmm2ext::rounded_rectangle (cr, 0, 0, get_width(), get_height(), 3); + cairo_set_source_rgba (cr, 0.505, 0.517, 0.525, 0.4); + cairo_fill (cr); + } else if (_hovering) { + Gtkmm2ext::rounded_rectangle (cr, 0, 0, get_width(), get_height(), 3); + cairo_set_source_rgba (cr, 0.905, 0.917, 0.925, 0.1); + cairo_fill (cr); + } last_drawn = ds; From cb9b1801ec4ef5974bc9365c1b551a864615a5cc Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sat, 13 Jul 2013 14:58:23 +0200 Subject: [PATCH 022/221] ignore mouse-scroll if scroll-bar is not present. fixes http://tracker.ardour.org/view.php?id=5557 --- gtk2_ardour/meterbridge.cc | 2 ++ gtk2_ardour/mixer_ui.cc | 2 ++ 2 files changed, 4 insertions(+) diff --git a/gtk2_ardour/meterbridge.cc b/gtk2_ardour/meterbridge.cc index 74c13f45eb..227f533a18 100644 --- a/gtk2_ardour/meterbridge.cc +++ b/gtk2_ardour/meterbridge.cc @@ -309,6 +309,7 @@ Meterbridge::on_scroll_event (GdkEventScroll* ev) void Meterbridge::scroll_left () { + if (!scroller.get_hscrollbar()) return; Adjustment* adj = scroller.get_hscrollbar()->get_adjustment(); /* stupid GTK: can't rely on clamping across versions */ scroller.get_hscrollbar()->set_value (max (adj->get_lower(), adj->get_value() - adj->get_step_increment())); @@ -317,6 +318,7 @@ Meterbridge::scroll_left () void Meterbridge::scroll_right () { + if (!scroller.get_hscrollbar()) return; Adjustment* adj = scroller.get_hscrollbar()->get_adjustment(); /* stupid GTK: can't rely on clamping across versions */ scroller.get_hscrollbar()->set_value (min (adj->get_upper(), adj->get_value() + adj->get_step_increment())); diff --git a/gtk2_ardour/mixer_ui.cc b/gtk2_ardour/mixer_ui.cc index f206014eea..be43a3d6a0 100644 --- a/gtk2_ardour/mixer_ui.cc +++ b/gtk2_ardour/mixer_ui.cc @@ -1666,6 +1666,7 @@ Mixer_UI::pane_allocation_handler (Allocation&, Gtk::Paned* which) void Mixer_UI::scroll_left () { + if (!scroller.get_hscrollbar()) return; Adjustment* adj = scroller.get_hscrollbar()->get_adjustment(); /* stupid GTK: can't rely on clamping across versions */ scroller.get_hscrollbar()->set_value (max (adj->get_lower(), adj->get_value() - adj->get_step_increment())); @@ -1674,6 +1675,7 @@ Mixer_UI::scroll_left () void Mixer_UI::scroll_right () { + if (!scroller.get_hscrollbar()) return; Adjustment* adj = scroller.get_hscrollbar()->get_adjustment(); /* stupid GTK: can't rely on clamping across versions */ scroller.get_hscrollbar()->set_value (min (adj->get_upper(), adj->get_value() + adj->get_step_increment())); From 2106a12edd6dcdf1189b7cfd68b07a0761d77c46 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sun, 14 Jul 2013 11:34:31 +0200 Subject: [PATCH 023/221] improve caching of metric and tick patters * selectively clear cache (meterbridge, mixer) * free memory of patterns on clear --- gtk2_ardour/gain_meter.cc | 2 +- gtk2_ardour/meter_patterns.cc | 33 +++++++++++++++++++++++++++++---- gtk2_ardour/meter_patterns.h | 2 +- gtk2_ardour/meter_strip.cc | 2 -- gtk2_ardour/meterbridge.cc | 1 + 5 files changed, 32 insertions(+), 8 deletions(-) diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc index ae6f03f210..36ed5e918e 100644 --- a/gtk2_ardour/gain_meter.cc +++ b/gtk2_ardour/gain_meter.cc @@ -1086,7 +1086,7 @@ GainMeter::meter_configuration_changed (ChanCount c) set_meter_strip_name ("AudioMidiTrackMetricsInactive"); } } - meter_clear_pattern_cache(); // XXX only once + meter_clear_pattern_cache(4); } void diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index 9de01146b0..f749927e9a 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -485,9 +485,34 @@ gint meter_expose_metrics (GdkEventExpose *ev, std::vector typ return true; } -void meter_clear_pattern_cache() { - // TODO allow to clear meterbridge "*Left|Right" patterns independenly - metric_patterns.clear(); - ticks_patterns.clear(); +void meter_clear_pattern_cache(int which) { + MetricPatterns::iterator i = metric_patterns.begin(); + TickPatterns::iterator j = ticks_patterns.begin(); + + while (i != metric_patterns.end()) { + int m = 4; + std::string n = i->first; + if (n.substr(n.length() - 4) == "Left") { m = 1; } + if (n.substr(n.length() - 5) == "Right") { m = 2; } + if (which & m) { + cairo_pattern_destroy(i->second); + metric_patterns.erase(i++); + } else { + ++i; + } + } + + while (j != ticks_patterns.end()) { + int m = 4; + std::string n = j->first; + if (n.substr(n.length() - 4) == "Left") { m = 1; } + if (n.substr(n.length() - 5) == "Right") { m = 2; } + if (which & m) { + cairo_pattern_destroy(j->second); + ticks_patterns.erase(j++); + } else { + ++j; + } + } RedrawMetrics(); } diff --git a/gtk2_ardour/meter_patterns.h b/gtk2_ardour/meter_patterns.h index df755f7ace..a664f478f2 100644 --- a/gtk2_ardour/meter_patterns.h +++ b/gtk2_ardour/meter_patterns.h @@ -40,7 +40,7 @@ cairo_pattern_t* meter_render_metrics (Gtk::Widget& w, std::vector types, Gtk::DrawingArea *mta); gint meter_expose_metrics (GdkEventExpose *ev, std::vector types, Gtk::DrawingArea *mma); -void meter_clear_pattern_cache(); +void meter_clear_pattern_cache(int which=7); #endif diff --git a/gtk2_ardour/meter_strip.cc b/gtk2_ardour/meter_strip.cc index a4cc56d61c..88a946585a 100644 --- a/gtk2_ardour/meter_strip.cc +++ b/gtk2_ardour/meter_strip.cc @@ -372,14 +372,12 @@ MeterStrip::meter_configuration_changed (ChanCount c) void MeterStrip::on_size_request (Gtk::Requisition* r) { - meter_clear_pattern_cache(); VBox::on_size_request(r); } void MeterStrip::on_size_allocate (Gtk::Allocation& a) { - meter_clear_pattern_cache(); const int wh = a.get_height(); int nh = ceilf(wh * .11f); if (nh < 52) nh = 52; diff --git a/gtk2_ardour/meterbridge.cc b/gtk2_ardour/meterbridge.cc index 227f533a18..24b21656d1 100644 --- a/gtk2_ardour/meterbridge.cc +++ b/gtk2_ardour/meterbridge.cc @@ -327,6 +327,7 @@ Meterbridge::scroll_right () void Meterbridge::on_size_request (Gtk::Requisition* r) { + meter_clear_pattern_cache(3); Gtk::Window::on_size_request(r); Gdk::Geometry geom; From 897f6ae3562ff5bebc7f0962d95cbfb29a34ff17 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sun, 14 Jul 2013 18:34:36 +0200 Subject: [PATCH 024/221] switch to WM::Proxy Action management fixes http://tracker.ardour.org/view.php?id=5584 --- gtk2_ardour/ardour_ui2.cc | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/gtk2_ardour/ardour_ui2.cc b/gtk2_ardour/ardour_ui2.cc index 5a64e53140..50affa6c96 100644 --- a/gtk2_ardour/ardour_ui2.cc +++ b/gtk2_ardour/ardour_ui2.cc @@ -617,11 +617,10 @@ ARDOUR_UI::click_button_clicked (GdkEventButton* ev) return false; } - RefPtr act = ActionManager::get_action (X_("Common"), X_("ToggleRCOptionsEditor")); + RefPtr act = ActionManager::get_action (X_("Window"), X_("toggle-rc-options-editor")); assert (act); - RefPtr tact = RefPtr::cast_dynamic (act); - tact->set_active (); + act->activate(); rc_option_editor->set_current_page (_("Misc")); return true; From 6827261766a678b69b15394e645478ab78133eb6 Mon Sep 17 00:00:00 2001 From: Alexandre Prokoudine Date: Sun, 14 Jul 2013 18:45:13 +0200 Subject: [PATCH 025/221] Update Russian translation --- gtk2_ardour/po/ru.po | 1447 +++++++++++++++++++++++------------------- 1 file changed, 800 insertions(+), 647 deletions(-) diff --git a/gtk2_ardour/po/ru.po b/gtk2_ardour/po/ru.po index b724e52fc5..3c81be6c62 100644 --- a/gtk2_ardour/po/ru.po +++ b/gtk2_ardour/po/ru.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: Ardour 3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-06-14 03:57+0400\n" -"PO-Revision-Date: 2013-06-14 04:15+0300\n" +"POT-Creation-Date: 2013-07-14 15:01+0400\n" +"PO-Revision-Date: 2013-07-14 18:04+0300\n" "Last-Translator: Александр Прокудин \n" "Language-Team: русский <>\n" "Language: ru\n" @@ -20,8 +20,8 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.5.4\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); 10<=4 && (n%100<10 || n" -"%100>=20) ? 1 : 2);\n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"%100>=20) ? 1: 2);\n" #: about.cc:122 msgid "Brian Ahr" @@ -413,7 +413,7 @@ msgstr "%1 menu definition file not found" msgid "%1 will not work without a valid ardour.menus file" msgstr "%1 will not work without a valid ardour.menus file" -#: add_route_dialog.cc:53 route_params_ui.cc:503 +#: add_route_dialog.cc:53 route_params_ui.cc:499 msgid "Add Track or Bus" msgstr "Добавить дорожку или шину" @@ -506,7 +506,7 @@ msgstr "" "звуковые и MIDI-дорожки." #: add_route_dialog.cc:319 add_route_dialog.cc:338 editor_actions.cc:385 -#: editor_rulers.cc:377 time_axis_view.cc:1301 +#: editor_rulers.cc:377 time_axis_view.cc:1304 msgid "Normal" msgstr "Нормальная" @@ -550,7 +550,7 @@ msgstr "8 каналов" msgid "12 Channel" msgstr "3 канала" -#: add_route_dialog.cc:475 mixer_strip.cc:2136 +#: add_route_dialog.cc:475 mixer_strip.cc:2130 msgid "Custom" msgstr "На заказ" @@ -638,7 +638,7 @@ msgid "Track" msgstr "Дорожка" #: analysis_window.cc:68 editor_actions.cc:616 mixer_ui.cc:125 -#: mixer_ui.cc:1793 +#: mixer_ui.cc:1795 msgid "Show" msgstr "Показать" @@ -646,91 +646,91 @@ msgstr "Показать" msgid "Re-analyze data" msgstr "Повторно проанализировать данные" -#: ardour_button.cc:658 +#: ardour_button.cc:704 msgid "button cannot watch state of non-existing Controllable\n" msgstr "" -#: ardour_ui.cc:179 +#: ardour_ui.cc:180 msgid "audition" msgstr "прослушивание" -#: ardour_ui.cc:180 +#: ardour_ui.cc:181 msgid "solo" msgstr "солирование" -#: ardour_ui.cc:181 +#: ardour_ui.cc:182 msgid "feedback" msgstr "отклик" -#: ardour_ui.cc:183 speaker_dialog.cc:36 +#: ardour_ui.cc:184 speaker_dialog.cc:36 msgid "Speaker Configuration" msgstr "Конфигурация громкоговорителей" -#: ardour_ui.cc:184 theme_manager.cc:56 theme_manager.cc:64 +#: ardour_ui.cc:185 theme_manager.cc:56 theme_manager.cc:64 msgid "Theme Manager" msgstr "Стиль оформления" -#: ardour_ui.cc:185 keyeditor.cc:53 +#: ardour_ui.cc:186 keyeditor.cc:53 msgid "Key Bindings" msgstr "Клавиатурные комбинации" -#: ardour_ui.cc:186 +#: ardour_ui.cc:187 msgid "Preferences" msgstr "Параметры" -#: ardour_ui.cc:187 ardour_ui.cc:192 +#: ardour_ui.cc:188 ardour_ui.cc:193 msgid "Add Tracks/Busses" msgstr "Добавить дорожки/шины" -#: ardour_ui.cc:188 +#: ardour_ui.cc:189 msgid "About" msgstr "О программе" -#: ardour_ui.cc:189 location_ui.cc:1134 +#: ardour_ui.cc:190 location_ui.cc:1146 msgid "Locations" msgstr "Позиции" -#: ardour_ui.cc:190 route_params_ui.cc:57 route_params_ui.cc:604 +#: ardour_ui.cc:191 route_params_ui.cc:57 route_params_ui.cc:600 msgid "Tracks and Busses" msgstr "Дорожки и шины" -#: ardour_ui.cc:191 +#: ardour_ui.cc:192 msgid "Properties" msgstr "Свойства" -#: ardour_ui.cc:193 bundle_manager.cc:263 +#: ardour_ui.cc:194 bundle_manager.cc:263 msgid "Bundle Manager" msgstr "Управление пакетами" -#: ardour_ui.cc:194 big_clock_window.cc:35 +#: ardour_ui.cc:195 big_clock_window.cc:35 msgid "Big Clock" msgstr "Большой счётчик" -#: ardour_ui.cc:195 +#: ardour_ui.cc:196 msgid "Audio Connections" msgstr "Звуковые соединения" -#: ardour_ui.cc:196 +#: ardour_ui.cc:197 msgid "MIDI Connections" msgstr "Соединения MIDI" -#: ardour_ui.cc:198 +#: ardour_ui.cc:199 msgid "Errors" msgstr "Ошибки" -#: ardour_ui.cc:299 +#: ardour_ui.cc:301 msgid "could not initialize %1." msgstr "Не удалось инициализировать %1." -#: ardour_ui.cc:394 +#: ardour_ui.cc:396 msgid "Starting audio engine" msgstr "Запускается звуковой движок" -#: ardour_ui.cc:763 startup.cc:638 +#: ardour_ui.cc:766 startup.cc:638 msgid "%1 is ready for use" msgstr "%1 готов к работе" -#: ardour_ui.cc:811 +#: ardour_ui.cc:814 msgid "" "WARNING: Your system has a limit for maximum amount of locked memory. This " "might cause %1 to run out of memory before your system runs out of memory. \n" @@ -745,23 +745,23 @@ msgstr "" "Вы можете узнать установленный предел при помощи команды 'ulimit -l'. Обычно " "это контролируется в %2." -#: ardour_ui.cc:828 +#: ardour_ui.cc:831 msgid "Do not show this window again" msgstr "Больше не показывать это окно" -#: ardour_ui.cc:870 +#: ardour_ui.cc:873 msgid "Don't quit" msgstr "Не выходить" -#: ardour_ui.cc:871 +#: ardour_ui.cc:874 msgid "Just quit" msgstr "Просто выйти" -#: ardour_ui.cc:872 +#: ardour_ui.cc:875 msgid "Save and quit" msgstr "Сохранить и выйти" -#: ardour_ui.cc:882 +#: ardour_ui.cc:885 msgid "" "%1 was unable to save your session.\n" "\n" @@ -776,15 +776,15 @@ msgstr "" "\n" "«Просто выйти»." -#: ardour_ui.cc:913 +#: ardour_ui.cc:916 msgid "Please wait while %1 cleans up..." msgstr "Дождитесь завершения подчистки сеанса в %1..." -#: ardour_ui.cc:930 +#: ardour_ui.cc:933 msgid "Unsaved Session" msgstr "Сеанс не сохранён" -#: ardour_ui.cc:951 +#: ardour_ui.cc:954 msgid "" "The session \"%1\"\n" "has not been saved.\n" @@ -802,7 +802,7 @@ msgstr "" "\n" "Что вы хотите сделать?" -#: ardour_ui.cc:954 +#: ardour_ui.cc:957 msgid "" "The snapshot \"%1\"\n" "has not been saved.\n" @@ -820,74 +820,74 @@ msgstr "" "\n" "Что вы хотите сделать?" -#: ardour_ui.cc:968 +#: ardour_ui.cc:971 msgid "Prompter" msgstr "" -#: ardour_ui.cc:1045 +#: ardour_ui.cc:1048 msgid "disconnected" msgstr "отсоединено" -#: ardour_ui.cc:1052 +#: ardour_ui.cc:1055 #, c-format msgid "JACK: %.1f kHz / %4.1f ms" msgstr "JACK: %.1f КГц / %4.1f мс" -#: ardour_ui.cc:1056 +#: ardour_ui.cc:1059 #, c-format msgid "JACK: % kHz / %4.1f ms" msgstr "JACK: % КГц / %4.1f мс" -#: ardour_ui.cc:1074 export_video_dialog.cc:67 +#: ardour_ui.cc:1077 export_video_dialog.cc:67 msgid "File:" msgstr "Файл:" -#: ardour_ui.cc:1078 +#: ardour_ui.cc:1081 msgid "BWF" msgstr "BWF" -#: ardour_ui.cc:1081 +#: ardour_ui.cc:1084 msgid "WAV" msgstr "WAV" -#: ardour_ui.cc:1084 +#: ardour_ui.cc:1087 msgid "WAV64" msgstr "WAV64" -#: ardour_ui.cc:1087 session_option_editor.cc:197 +#: ardour_ui.cc:1090 session_option_editor.cc:197 msgid "CAF" msgstr "CAF" -#: ardour_ui.cc:1090 +#: ardour_ui.cc:1093 msgid "AIFF" msgstr "AIFF" -#: ardour_ui.cc:1093 +#: ardour_ui.cc:1096 msgid "iXML" msgstr "iXML" -#: ardour_ui.cc:1096 +#: ardour_ui.cc:1099 msgid "RF64" msgstr "RF64" -#: ardour_ui.cc:1104 +#: ardour_ui.cc:1107 msgid "32-float" msgstr "32-float" -#: ardour_ui.cc:1107 +#: ardour_ui.cc:1110 msgid "24-int" msgstr "24-int" -#: ardour_ui.cc:1110 +#: ardour_ui.cc:1113 msgid "16-int" msgstr "16-int" -#: ardour_ui.cc:1129 +#: ardour_ui.cc:1132 #, c-format msgid "DSP: %5.1f%%" msgstr "ЦП: %5.1f%%" -#: ardour_ui.cc:1148 +#: ardour_ui.cc:1151 #, c-format msgid "" "Buffers: p:" @@ -898,33 +898,33 @@ msgstr "" "%% c:" "%%%" -#: ardour_ui.cc:1184 +#: ardour_ui.cc:1187 msgid "Disk: Unknown" msgstr "На диске: неизвестно" -#: ardour_ui.cc:1186 +#: ardour_ui.cc:1189 msgid "Disk: 24hrs+" msgstr "На диске: 24ч+" -#: ardour_ui.cc:1204 +#: ardour_ui.cc:1207 msgid "Disk: >24 hrs" msgstr "На диске: >24ч" -#: ardour_ui.cc:1215 +#: ardour_ui.cc:1218 #, c-format msgid "Disk: %02dh:%02dm:%02ds" msgstr "На диске: %02dч:%02dм:%02dс" -#: ardour_ui.cc:1241 +#: ardour_ui.cc:1244 #, c-format msgid "Timecode|TC: %s" msgstr "ТК: %s" -#: ardour_ui.cc:1358 ardour_ui.cc:1367 startup.cc:1045 +#: ardour_ui.cc:1361 ardour_ui.cc:1370 startup.cc:1045 msgid "Recent Sessions" msgstr "Недавние сеансы" -#: ardour_ui.cc:1447 +#: ardour_ui.cc:1450 msgid "" "%1 is not connected to JACK\n" "You cannot open or close sessions in this condition" @@ -932,27 +932,27 @@ msgstr "" "%1 не соединен с JACK.\n" "Открытие и закрытие сеансов невозможно." -#: ardour_ui.cc:1474 +#: ardour_ui.cc:1477 msgid "Open Session" msgstr "Открыть сеанс" -#: ardour_ui.cc:1492 session_import_dialog.cc:169 +#: ardour_ui.cc:1495 session_import_dialog.cc:169 #: session_metadata_dialog.cc:729 startup.cc:1074 msgid "%1 sessions" msgstr "Cеансы %1" -#: ardour_ui.cc:1529 +#: ardour_ui.cc:1532 msgid "You cannot add a track without a session already loaded." msgstr "Вы не можете добавить дорожку без загруженного сеанса." -#: ardour_ui.cc:1537 +#: ardour_ui.cc:1540 msgid "could not create %1 new mixed track" msgid_plural "could not create %1 new mixed tracks" msgstr[0] "Не удалось создать %1 новую смешанную дорожку" msgstr[1] "Не удалось создать %1 новых смешанных дорожки" msgstr[2] "Не удалось создать %1 новых смешанных дорожек" -#: ardour_ui.cc:1543 ardour_ui.cc:1604 +#: ardour_ui.cc:1546 ardour_ui.cc:1607 msgid "" "There are insufficient JACK ports available\n" "to create a new track or bus.\n" @@ -964,25 +964,25 @@ msgstr "" "Необходимо сохранить %1, выйти и запустить\n" "JACK с увеличенным количеством портов." -#: ardour_ui.cc:1578 +#: ardour_ui.cc:1581 msgid "You cannot add a track or bus without a session already loaded." msgstr "Вы не можете добавить дорожку или шину без открытого сеанса." -#: ardour_ui.cc:1587 +#: ardour_ui.cc:1590 msgid "could not create %1 new audio track" msgid_plural "could not create %1 new audio tracks" msgstr[0] "Не удалось создать %1 новую звуковую дорожку" msgstr[1] "Не удалось создать %2 новых звуковых дорожки" msgstr[2] "Не удалось создать %2 новых звуковых дорожек" -#: ardour_ui.cc:1596 +#: ardour_ui.cc:1599 msgid "could not create %1 new audio bus" msgid_plural "could not create %1 new audio busses" msgstr[0] "Не удалось создать %1 новую звуковую шину" msgstr[1] "Не удалось создать %1 новых звуковых шины" msgstr[2] "Не удалось создать %1 новых звуковых шин" -#: ardour_ui.cc:1713 +#: ardour_ui.cc:1716 msgid "" "Please create one or more tracks before trying to record.\n" "You can do this with the \"Add Track or Bus\" option in the Session menu." @@ -991,14 +991,14 @@ msgstr "" "как пытаться что-либо записать.\n" "Используйте меню «Сеанс > Добавить дорожку/шину»." -#: ardour_ui.cc:2103 +#: ardour_ui.cc:2106 msgid "" "The audio backend (JACK) was shutdown because:\n" "\n" "%1" msgstr "" -#: ardour_ui.cc:2105 +#: ardour_ui.cc:2108 msgid "" "JACK has either been shutdown or it\n" "disconnected %1 because %1\n" @@ -1009,19 +1009,19 @@ msgstr "" "с %1 и отсоединил его. Необходимо перезапустить \n" "JACK, восстановить соединение и сохранить сеанс." -#: ardour_ui.cc:2131 +#: ardour_ui.cc:2134 msgid "Unable to start the session running" msgstr "Невозможно запустить уже выполняемый сеанс" -#: ardour_ui.cc:2211 +#: ardour_ui.cc:2214 msgid "Take Snapshot" msgstr "Создать снимок" -#: ardour_ui.cc:2212 +#: ardour_ui.cc:2215 msgid "Name of new snapshot" msgstr "Название нового снимка" -#: ardour_ui.cc:2236 +#: ardour_ui.cc:2239 msgid "" "To ensure compatibility with various systems\n" "snapshot names may not contain a '%1' character" @@ -1029,27 +1029,27 @@ msgstr "" "Для обеспечения совместимости с различными системами\n" "названия снимков не могут содержать символ '%1'." -#: ardour_ui.cc:2248 +#: ardour_ui.cc:2251 msgid "Confirm Snapshot Overwrite" msgstr "Подтвердите перезапись снимка" -#: ardour_ui.cc:2249 +#: ardour_ui.cc:2252 msgid "A snapshot already exists with that name. Do you want to overwrite it?" msgstr "Снимок с таким названием уже есть. Перезаписать его?" -#: ardour_ui.cc:2252 utils_videotl.cc:66 +#: ardour_ui.cc:2255 utils_videotl.cc:66 msgid "Overwrite" msgstr "Перезаписать" -#: ardour_ui.cc:2286 +#: ardour_ui.cc:2289 msgid "Rename Session" msgstr "Переименовать сеанс" -#: ardour_ui.cc:2287 +#: ardour_ui.cc:2290 msgid "New session name" msgstr "Новое название сеанса" -#: ardour_ui.cc:2301 ardour_ui.cc:2681 ardour_ui.cc:2726 +#: ardour_ui.cc:2304 ardour_ui.cc:2684 ardour_ui.cc:2729 msgid "" "To ensure compatibility with various systems\n" "session names may not contain a '%1' character" @@ -1057,12 +1057,12 @@ msgstr "" "Для обеспечения совместимости с различными системами\n" "названия сеансов не могут содержать символ '%1'." -#: ardour_ui.cc:2309 +#: ardour_ui.cc:2312 msgid "" "That name is already in use by another directory/folder. Please try again." msgstr "" -#: ardour_ui.cc:2318 +#: ardour_ui.cc:2321 msgid "" "Renaming this session failed.\n" "Things could be seriously messed up at this point" @@ -1070,19 +1070,19 @@ msgstr "" "Не удалось переименовать этот сеанс.\n" "Очень может быть, что всё испортилось." -#: ardour_ui.cc:2429 +#: ardour_ui.cc:2432 msgid "Save Template" msgstr "Сохранить шаблон" -#: ardour_ui.cc:2430 +#: ardour_ui.cc:2433 msgid "Name for template:" msgstr "Название шаблона:" -#: ardour_ui.cc:2431 +#: ardour_ui.cc:2434 msgid "-template" msgstr "-шаблон" -#: ardour_ui.cc:2469 +#: ardour_ui.cc:2472 msgid "" "This session\n" "%1\n" @@ -1092,52 +1092,52 @@ msgstr "" "%1\n" "уже существует. Открыть его?" -#: ardour_ui.cc:2479 +#: ardour_ui.cc:2482 msgid "Open Existing Session" msgstr "Открыть существующий сеанс" -#: ardour_ui.cc:2717 +#: ardour_ui.cc:2720 msgid "There is no existing session at \"%1\"" msgstr "По адресу \"%1\" не существующего сеанса" -#: ardour_ui.cc:2804 +#: ardour_ui.cc:2807 msgid "Please wait while %1 loads your session" msgstr "Дождитесь завершения загрузки сеанса в %1" -#: ardour_ui.cc:2819 +#: ardour_ui.cc:2822 msgid "Port Registration Error" msgstr "Ошибка регистрации порта" -#: ardour_ui.cc:2820 +#: ardour_ui.cc:2823 msgid "Click the Close button to try again." msgstr "Щелкните кнопку «Закрыть» для возврата к предыдущему диалогу." -#: ardour_ui.cc:2841 +#: ardour_ui.cc:2844 msgid "Session \"%1 (snapshot %2)\" did not load successfully" msgstr "Не удалось загрузить сеанс \"%1 (снимок %2)\"" -#: ardour_ui.cc:2847 +#: ardour_ui.cc:2850 msgid "Loading Error" msgstr "Ошибка при загрузке" -#: ardour_ui.cc:2848 +#: ardour_ui.cc:2851 msgid "Click the Refresh button to try again." msgstr "Щёлкните кнопку «Обновить» для повторной попытки." -#: ardour_ui.cc:2930 +#: ardour_ui.cc:2933 msgid "Could not create session in \"%1\"" msgstr "Не удалось создать сеанс «%1»" -#: ardour_ui.cc:3030 +#: ardour_ui.cc:3033 msgid "No files were ready for clean-up" msgstr "Нет готовых к удалению звуковых файлов" -#: ardour_ui.cc:3034 ardour_ui.cc:3044 ardour_ui.cc:3177 ardour_ui.cc:3184 +#: ardour_ui.cc:3037 ardour_ui.cc:3047 ardour_ui.cc:3180 ardour_ui.cc:3187 #: ardour_ui_ed.cc:104 msgid "Clean-up" msgstr "Очистить" -#: ardour_ui.cc:3035 +#: ardour_ui.cc:3038 msgid "" "If this seems suprising, \n" "check for any existing snapshots.\n" @@ -1149,19 +1149,19 @@ msgstr "" "Они могут включать области, которым\n" "нужны неиспользуемые файлы." -#: ardour_ui.cc:3094 +#: ardour_ui.cc:3097 msgid "kilo" msgstr "кило" -#: ardour_ui.cc:3097 +#: ardour_ui.cc:3100 msgid "mega" msgstr "мега" -#: ardour_ui.cc:3100 +#: ardour_ui.cc:3103 msgid "giga" msgstr "гига" -#: ardour_ui.cc:3105 +#: ardour_ui.cc:3108 msgid "" "The following file was deleted from %2,\n" "releasing %3 %4bytes of disk space" @@ -1181,7 +1181,7 @@ msgstr[2] "" "освободив при этом %3 %4байт\n" "дискового пространства." -#: ardour_ui.cc:3112 +#: ardour_ui.cc:3115 msgid "" "The following file was not in use and \n" "has been moved to: %2\n" @@ -1201,7 +1201,7 @@ msgid_plural "" "\n" "will release an additional %3 %4bytes of disk space.\n" msgstr[0] "" -"Следующий %1 файл не используется и перемещён в пвпку\n" +"Следующий %1 файл не используется и перемещён в папку\n" "%2\n" "\n" "После повторного запуска %5 команда\n" @@ -1210,7 +1210,7 @@ msgstr[0] "" "\n" "дополнительно освободит %3 %4байт дискового пространства.\n" msgstr[1] "" -"Следующие %1 файла не используются и перемещён в пвпку\n" +"Следующие %1 файла не используются и перемещены в папку\n" "%2\n" "\n" "После повторного запуска %5 команда\n" @@ -1219,7 +1219,7 @@ msgstr[1] "" "\n" "дополнительно освободит %3 %4байт дискового пространства.\n" msgstr[2] "" -"Следующие %1 файлов не используются и перемещён в пвпку\n" +"Следующие %1 файлов не используются и перемещены в папку\n" "%2\n" "\n" "После повторного запуска %5 команда\n" @@ -1228,11 +1228,11 @@ msgstr[2] "" "\n" "дополнительно освободит %3 %4байт дискового пространства.\n" -#: ardour_ui.cc:3172 +#: ardour_ui.cc:3175 msgid "Are you sure you want to clean-up?" msgstr "Вы уверены, что хотите выполнить очистку?" -#: ardour_ui.cc:3179 +#: ardour_ui.cc:3182 msgid "" "Clean-up is a destructive operation.\n" "ALL undo/redo information will be lost if you clean-up.\n" @@ -1243,80 +1243,80 @@ msgstr "" "неиспользуемые звуковые файлы\n" "будут перемещены в «мертвую» зону." -#: ardour_ui.cc:3187 +#: ardour_ui.cc:3190 msgid "CleanupDialog" msgstr "Очистка" -#: ardour_ui.cc:3217 +#: ardour_ui.cc:3220 msgid "Cleaned Files" msgstr "Очищенные файлы" -#: ardour_ui.cc:3234 +#: ardour_ui.cc:3237 msgid "deleted file" msgstr "удалён файл" -#: ardour_ui.cc:3326 +#: ardour_ui.cc:3329 msgid "" "Video-Server was not launched by Ardour. The request to stop it is ignored." msgstr "" -#: ardour_ui.cc:3330 +#: ardour_ui.cc:3333 msgid "Stop Video-Server" msgstr "" -#: ardour_ui.cc:3331 +#: ardour_ui.cc:3334 msgid "Do you really want to stop the Video Server?" msgstr "Вы действительно хотите остановить видеосервер?" -#: ardour_ui.cc:3334 +#: ardour_ui.cc:3337 msgid "Yes, Stop It" msgstr "Да, остановить" -#: ardour_ui.cc:3360 +#: ardour_ui.cc:3363 msgid "The Video Server is already started." msgstr "" -#: ardour_ui.cc:3362 +#: ardour_ui.cc:3365 msgid "" "An external Video Server is configured and can be reached. Not starting a " "new instance." msgstr "" -#: ardour_ui.cc:3370 ardour_ui.cc:3460 +#: ardour_ui.cc:3373 ardour_ui.cc:3463 msgid "" "Could not connect to the Video Server. Start it or configure its access URL " "in Edit -> Preferences." msgstr "" -#: ardour_ui.cc:3394 +#: ardour_ui.cc:3397 msgid "Specified docroot is not an existing directory." msgstr "" -#: ardour_ui.cc:3399 +#: ardour_ui.cc:3402 msgid "Given Video Server is not an executable file." msgstr "" -#: ardour_ui.cc:3432 +#: ardour_ui.cc:3435 msgid "Cannot launch the video-server" msgstr "Не удалось запустить видеосервер" -#: ardour_ui.cc:3441 +#: ardour_ui.cc:3444 msgid "Video-server was started but does not respond to requests..." msgstr "" -#: ardour_ui.cc:3482 editor_audio_import.cc:629 +#: ardour_ui.cc:3489 editor_audio_import.cc:629 msgid "could not open %1" msgstr "не удалось открыть %1" -#: ardour_ui.cc:3486 +#: ardour_ui.cc:3493 msgid "no video-file selected" msgstr "" -#: ardour_ui.cc:3646 +#: ardour_ui.cc:3658 msgid "Recording was stopped because your system could not keep up." msgstr "Запись остановлена из-за недостаточного быстродействия системы" -#: ardour_ui.cc:3675 +#: ardour_ui.cc:3687 msgid "" "The disk system on your computer\n" "was not able to keep up with %1.\n" @@ -1330,7 +1330,7 @@ msgstr "" "В частности ей не удалось записать данные на диск\n" "достаточно быстро для фиксации захваченных данных.\n" -#: ardour_ui.cc:3694 +#: ardour_ui.cc:3706 msgid "" "The disk system on your computer\n" "was not able to keep up with %1.\n" @@ -1344,11 +1344,11 @@ msgstr "" "В частности ей не удалось прочитать данные\n" "с диска достаточно быстро для воспроизведения.\n" -#: ardour_ui.cc:3734 +#: ardour_ui.cc:3746 msgid "Crash Recovery" msgstr "Восстановление данных" -#: ardour_ui.cc:3735 +#: ardour_ui.cc:3747 msgid "" "This session appears to have been in the\n" "middle of recording when %1 or\n" @@ -1364,19 +1364,19 @@ msgstr "" "%1 может восстановить записанные данные,\n" "либо проигнорировать их. Примите решение.\n" -#: ardour_ui.cc:3747 +#: ardour_ui.cc:3759 msgid "Ignore crash data" msgstr "Проигнорировать" -#: ardour_ui.cc:3748 +#: ardour_ui.cc:3760 msgid "Recover from crash" msgstr "Восстановить данные" -#: ardour_ui.cc:3768 +#: ardour_ui.cc:3780 msgid "Sample Rate Mismatch" msgstr "Несовпадение частот сэмплирования" -#: ardour_ui.cc:3769 +#: ardour_ui.cc:3781 msgid "" "This session was created with a sample rate of %1 Hz, but\n" "%2 is currently running at %3 Hz. If you load this session,\n" @@ -1388,23 +1388,23 @@ msgstr "" "Если вы загрузите этот сеанс, звуковые данные могут быть\n" "воспроизведены с некорректной частотой сэмплирования.\n" -#: ardour_ui.cc:3778 +#: ardour_ui.cc:3790 msgid "Do not load session" msgstr "Не загружать сеанс" -#: ardour_ui.cc:3779 +#: ardour_ui.cc:3791 msgid "Load session anyway" msgstr "Все равно загрузить" -#: ardour_ui.cc:3802 +#: ardour_ui.cc:3814 msgid "Could not disconnect from JACK" msgstr "Не удалось отсоединиться от сервера JACK" -#: ardour_ui.cc:3815 +#: ardour_ui.cc:3827 msgid "Could not reconnect to JACK" msgstr "Не удалось соединиться с сервером JACK" -#: ardour_ui.cc:4089 +#: ardour_ui.cc:4101 msgid "" "%4This is a session from an older version of %3%5\n" "\n" @@ -1427,57 +1427,61 @@ msgstr "Интерфейс: не удалось инициализировать msgid "UI: cannot setup mixer" msgstr "Интерфейс: не удалось инициализировать микшер" -#: ardour_ui2.cc:125 +#: ardour_ui2.cc:82 +msgid "UI: cannot setup meterbridge" +msgstr "Интерфейс: не удалось настроить панель индикаторов" + +#: ardour_ui2.cc:130 msgid "Play from playhead" msgstr "Воспроизвести от указателя" -#: ardour_ui2.cc:126 +#: ardour_ui2.cc:131 msgid "Stop playback" msgstr "Стоп" -#: ardour_ui2.cc:127 +#: ardour_ui2.cc:132 msgid "Toggle record" msgstr "Переключить готовность к записи" -#: ardour_ui2.cc:128 +#: ardour_ui2.cc:133 msgid "Play range/selection" msgstr "Воспроизвести выделение" -#: ardour_ui2.cc:129 +#: ardour_ui2.cc:134 msgid "Go to start of session" msgstr "В начало сеанса" -#: ardour_ui2.cc:130 +#: ardour_ui2.cc:135 msgid "Go to end of session" msgstr "В конец сеанса" -#: ardour_ui2.cc:131 +#: ardour_ui2.cc:136 msgid "Play loop range" msgstr "Воспроизвести выделение в петле" -#: ardour_ui2.cc:132 +#: ardour_ui2.cc:137 msgid "" "MIDI Panic\n" "Send note off and reset controller messages on all MIDI channels" msgstr "" -#: ardour_ui2.cc:133 +#: ardour_ui2.cc:138 msgid "Return to last playback start when stopped" msgstr "Вернуться к точке начала воспроизведения" -#: ardour_ui2.cc:134 +#: ardour_ui2.cc:139 msgid "Playhead follows Range Selections and Edits" msgstr "Указатель воспроизведения следует за выделением областей и правкам" -#: ardour_ui2.cc:135 +#: ardour_ui2.cc:140 msgid "Be sensible about input monitoring" msgstr "" -#: ardour_ui2.cc:136 +#: ardour_ui2.cc:141 msgid "Enable/Disable audio click" msgstr "Включить или выключить метроном" -#: ardour_ui2.cc:137 monitor_section.cc:101 +#: ardour_ui2.cc:142 monitor_section.cc:101 msgid "" "When active, something is soloed.\n" "Click to de-solo everything" @@ -1485,7 +1489,7 @@ msgstr "" "Включено, если какие-то дорожки солируют.\n" "Щёлкните, чтобы снять солирование везде." -#: ardour_ui2.cc:138 +#: ardour_ui2.cc:143 msgid "" "When active, auditioning is taking place\n" "Click to stop the audition" @@ -1493,11 +1497,11 @@ msgstr "" "Включено, если выполняется прослушивание.\n" "Щёлкните, чтобы прекратить его." -#: ardour_ui2.cc:139 +#: ardour_ui2.cc:144 msgid "When active, there is a feedback loop." msgstr "Включена, когда есть петля отклика (feedback loop)" -#: ardour_ui2.cc:140 +#: ardour_ui2.cc:145 msgid "" "Primary Clock right-click to set display mode. Click to edit, click" "+drag a digit or mouse-over+scroll wheel to modify.\n" @@ -1510,7 +1514,7 @@ msgstr "" "Прямой ввод: Esc: отмена; Enter: подтверждение; постфикс " "'+' или '-' вводит разницу во времени.\n" -#: ardour_ui2.cc:141 +#: ardour_ui2.cc:146 msgid "" "Secondary Clock right-click to set display mode. Click to edit, click" "+drag a digit or mouse-over+scroll wheel to modify.\n" @@ -1523,27 +1527,27 @@ msgstr "" "Прямой ввод: Esc: отмена; Enter: подтверждение; постфикс " "'+' или '-' вводит разницу во времени.\n" -#: ardour_ui2.cc:173 +#: ardour_ui2.cc:178 msgid "[ERROR]: " msgstr "[ОШИБКА]: " -#: ardour_ui2.cc:175 +#: ardour_ui2.cc:180 msgid "[WARNING]: " msgstr "[ПРЕДУПРЕЖДЕНИЕ]:" -#: ardour_ui2.cc:177 +#: ardour_ui2.cc:182 msgid "[INFO]: " msgstr "[СПРАВКА]:" -#: ardour_ui2.cc:241 ardour_ui_ed.cc:376 +#: ardour_ui2.cc:246 ardour_ui_ed.cc:377 msgid "Auto Return" msgstr "Автовозврат" -#: ardour_ui2.cc:243 ardour_ui_ed.cc:379 +#: ardour_ui2.cc:248 ardour_ui_ed.cc:380 msgid "Follow Edits" msgstr "Следовать правкам" -#: ardour_ui2.cc:621 rc_option_editor.cc:1004 rc_option_editor.cc:1022 +#: ardour_ui2.cc:626 rc_option_editor.cc:1004 rc_option_editor.cc:1022 #: rc_option_editor.cc:1025 rc_option_editor.cc:1027 rc_option_editor.cc:1029 #: rc_option_editor.cc:1037 rc_option_editor.cc:1045 rc_option_editor.cc:1047 #: rc_option_editor.cc:1055 rc_option_editor.cc:1062 rc_option_editor.cc:1071 @@ -1563,23 +1567,23 @@ msgstr "Настройка редактора" msgid "Setup Mixer" msgstr "Настройка микшера" -#: ardour_ui_dependents.cc:84 +#: ardour_ui_dependents.cc:85 msgid "Reload Session History" msgstr "Повторная загрузка истории сеансов" -#: ardour_ui_dialogs.cc:206 +#: ardour_ui_dialogs.cc:200 msgid "Don't close" msgstr "Не закрывать" -#: ardour_ui_dialogs.cc:207 +#: ardour_ui_dialogs.cc:201 msgid "Just close" msgstr "Просто закрыть" -#: ardour_ui_dialogs.cc:208 +#: ardour_ui_dialogs.cc:202 msgid "Save and close" msgstr "Сохранить и закрыть" -#: ardour_ui_dialogs.cc:293 +#: ardour_ui_dialogs.cc:291 msgid "This screen is not tall enough to display the mixer window" msgstr "Размеров экрана недостаточно, чтобы показать окно микшера" @@ -1644,7 +1648,7 @@ msgstr "Время задержки" msgid "Denormal Handling" msgstr "Обработка отклонений" -#: ardour_ui_ed.cc:123 route_time_axis.cc:1475 +#: ardour_ui_ed.cc:123 route_time_axis.cc:1489 msgid "New..." msgstr "Создать..." @@ -1674,7 +1678,7 @@ msgstr "Удалить видео" #: ardour_ui_ed.cc:141 msgid "Export To Video File" -msgstr "Экспортировать видеофайл" +msgstr "Видеофайл" #: ardour_ui_ed.cc:145 msgid "Snapshot..." @@ -1685,7 +1689,7 @@ msgid "Save As..." msgstr "Сохранить как..." #: ardour_ui_ed.cc:153 editor_actions.cc:1719 editor_markers.cc:858 -#: editor_snapshots.cc:123 mixer_strip.cc:1464 route_time_axis.cc:1471 +#: editor_snapshots.cc:123 mixer_strip.cc:1470 route_time_axis.cc:1485 msgid "Rename..." msgstr "Переименовать..." @@ -1738,8 +1742,8 @@ msgstr "Задержка отклика" msgid "Reconnect" msgstr "Пересоединить" -#: ardour_ui_ed.cc:195 global_port_matrix.cc:198 io_selector.cc:210 -#: mixer_strip.cc:712 mixer_strip.cc:838 +#: ardour_ui_ed.cc:195 global_port_matrix.cc:207 io_selector.cc:210 +#: mixer_strip.cc:718 mixer_strip.cc:844 msgid "Disconnect" msgstr "Отсоединить" @@ -1755,7 +1759,7 @@ msgstr "Редактор на полный экран" msgid "Show Toolbars" msgstr "Показывать панели" -#: ardour_ui_ed.cc:230 mixer_ui.cc:1863 mixer_ui.cc:1869 +#: ardour_ui_ed.cc:230 mixer_ui.cc:1865 mixer_ui.cc:1871 msgid "Window|Mixer" msgstr "Микшер" @@ -1763,27 +1767,31 @@ msgstr "Микшер" msgid "Toggle Editor+Mixer" msgstr "Редактор или микшер на переднем плане" -#: ardour_ui_ed.cc:233 midi_tracer.cc:39 +#: ardour_ui_ed.cc:232 meterbridge.cc:224 meterbridge.cc:230 +msgid "Window|Meterbridge" +msgstr "Панель индикаторов" + +#: ardour_ui_ed.cc:234 midi_tracer.cc:39 msgid "MIDI Tracer" msgstr "Журнал MIDI-событий" -#: ardour_ui_ed.cc:235 +#: ardour_ui_ed.cc:236 msgid "Chat" msgstr "Пообщаться" -#: ardour_ui_ed.cc:237 +#: ardour_ui_ed.cc:238 msgid "Help|Manual" msgstr "Справка" -#: ardour_ui_ed.cc:238 +#: ardour_ui_ed.cc:239 msgid "Reference" msgstr "Справка в Интернете" -#: ardour_ui_ed.cc:240 plugin_ui.cc:419 +#: ardour_ui_ed.cc:241 plugin_ui.cc:418 msgid "Save" msgstr "Сохранить" -#: ardour_ui_ed.cc:248 rc_option_editor.cc:1114 rc_option_editor.cc:1125 +#: ardour_ui_ed.cc:249 rc_option_editor.cc:1114 rc_option_editor.cc:1125 #: rc_option_editor.cc:1134 rc_option_editor.cc:1147 rc_option_editor.cc:1160 #: rc_option_editor.cc:1169 rc_option_editor.cc:1179 rc_option_editor.cc:1181 #: rc_option_editor.cc:1191 rc_option_editor.cc:1207 rc_option_editor.cc:1220 @@ -1793,99 +1801,99 @@ msgstr "Сохранить" msgid "Transport" msgstr "Транспорт" -#: ardour_ui_ed.cc:254 engine_dialog.cc:85 sfdb_ui.cc:559 +#: ardour_ui_ed.cc:255 engine_dialog.cc:85 msgid "Stop" msgstr "Стоп" -#: ardour_ui_ed.cc:257 +#: ardour_ui_ed.cc:258 msgid "Roll" msgstr "" -#: ardour_ui_ed.cc:261 +#: ardour_ui_ed.cc:262 msgid "Start/Stop" msgstr "Старт/Стоп" -#: ardour_ui_ed.cc:264 +#: ardour_ui_ed.cc:265 msgid "Start/Continue/Stop" msgstr "Старт/Продолжить/Стоп" -#: ardour_ui_ed.cc:267 +#: ardour_ui_ed.cc:268 msgid "Stop and Forget Capture" msgstr "Остановиться и забыть захват" -#: ardour_ui_ed.cc:277 +#: ardour_ui_ed.cc:278 msgid "Transition To Roll" msgstr "В обычном направлении" -#: ardour_ui_ed.cc:281 +#: ardour_ui_ed.cc:282 msgid "Transition To Reverse" msgstr "В обратном направлении" -#: ardour_ui_ed.cc:285 +#: ardour_ui_ed.cc:286 msgid "Play Loop Range" msgstr "Воспроизвести петлю" -#: ardour_ui_ed.cc:288 +#: ardour_ui_ed.cc:289 msgid "Play Selected Range" msgstr "" -#: ardour_ui_ed.cc:291 +#: ardour_ui_ed.cc:292 msgid "Play Selection w/Preroll" msgstr "" -#: ardour_ui_ed.cc:295 +#: ardour_ui_ed.cc:296 msgid "Enable Record" msgstr "Разрешить запись" -#: ardour_ui_ed.cc:298 +#: ardour_ui_ed.cc:299 msgid "Start Recording" msgstr "Начать запись" -#: ardour_ui_ed.cc:302 +#: ardour_ui_ed.cc:303 msgid "Rewind" msgstr "Перемотать назад" -#: ardour_ui_ed.cc:305 +#: ardour_ui_ed.cc:306 msgid "Rewind (Slow)" msgstr "Перемотать назад (медленно)" -#: ardour_ui_ed.cc:308 +#: ardour_ui_ed.cc:309 msgid "Rewind (Fast)" msgstr "Перемотать назад (быстро)" -#: ardour_ui_ed.cc:311 startup.cc:727 +#: ardour_ui_ed.cc:312 startup.cc:727 msgid "Forward" msgstr "Перемотать вперёд" -#: ardour_ui_ed.cc:314 +#: ardour_ui_ed.cc:315 msgid "Forward (Slow)" msgstr "Перемотать вперёд (медленно)" -#: ardour_ui_ed.cc:317 +#: ardour_ui_ed.cc:318 msgid "Forward (Fast)" msgstr "Перемотать вперёд (быстро)" -#: ardour_ui_ed.cc:320 +#: ardour_ui_ed.cc:321 msgid "Goto Zero" msgstr "К нулевой отметке" -#: ardour_ui_ed.cc:323 +#: ardour_ui_ed.cc:324 msgid "Goto Start" msgstr "К началу" -#: ardour_ui_ed.cc:326 +#: ardour_ui_ed.cc:327 msgid "Goto End" msgstr "В конец" -#: ardour_ui_ed.cc:329 +#: ardour_ui_ed.cc:330 msgid "Goto Wall Clock" msgstr "К текущему времени" -#: ardour_ui_ed.cc:333 +#: ardour_ui_ed.cc:334 msgid "Focus On Clock" msgstr "" -#: ardour_ui_ed.cc:337 ardour_ui_ed.cc:346 audio_clock.cc:2046 editor.cc:237 +#: ardour_ui_ed.cc:338 ardour_ui_ed.cc:347 audio_clock.cc:2046 editor.cc:237 #: editor_actions.cc:544 editor_actions.cc:553 export_timespan_selector.cc:88 #: session_option_editor.cc:41 session_option_editor.cc:61 #: session_option_editor.cc:80 session_option_editor.cc:96 @@ -1894,125 +1902,125 @@ msgstr "" msgid "Timecode" msgstr "Тайм-код" -#: ardour_ui_ed.cc:339 ardour_ui_ed.cc:348 editor_actions.cc:542 +#: ardour_ui_ed.cc:340 ardour_ui_ed.cc:349 editor_actions.cc:542 msgid "Bars & Beats" msgstr "Такты и доли" -#: ardour_ui_ed.cc:341 ardour_ui_ed.cc:350 +#: ardour_ui_ed.cc:342 ardour_ui_ed.cc:351 msgid "Minutes & Seconds" msgstr "Минуты и секунды" -#: ardour_ui_ed.cc:343 ardour_ui_ed.cc:352 audio_clock.cc:2050 editor.cc:238 +#: ardour_ui_ed.cc:344 ardour_ui_ed.cc:353 audio_clock.cc:2050 editor.cc:238 #: editor_actions.cc:543 msgid "Samples" msgstr "Сэмплы" -#: ardour_ui_ed.cc:355 +#: ardour_ui_ed.cc:356 msgid "Punch In" msgstr "Начало врезки" -#: ardour_ui_ed.cc:356 mixer_strip.cc:1904 route_ui.cc:132 +#: ardour_ui_ed.cc:357 mixer_strip.cc:1904 route_ui.cc:132 #: time_info_box.cc:113 msgid "In" msgstr "Вход" -#: ardour_ui_ed.cc:359 +#: ardour_ui_ed.cc:360 msgid "Punch Out" msgstr "Конец врезки" -#: ardour_ui_ed.cc:360 time_info_box.cc:114 +#: ardour_ui_ed.cc:361 time_info_box.cc:114 msgid "Out" msgstr "Выход" -#: ardour_ui_ed.cc:363 +#: ardour_ui_ed.cc:364 msgid "Punch In/Out" msgstr "Врезка" -#: ardour_ui_ed.cc:364 +#: ardour_ui_ed.cc:365 msgid "In/Out" msgstr "Вх/Вых" -#: ardour_ui_ed.cc:367 rc_option_editor.cc:1071 +#: ardour_ui_ed.cc:368 rc_option_editor.cc:1071 msgid "Click" msgstr "Метроном" -#: ardour_ui_ed.cc:370 +#: ardour_ui_ed.cc:371 msgid "Auto Input" msgstr "Автовход" -#: ardour_ui_ed.cc:373 +#: ardour_ui_ed.cc:374 msgid "Auto Play" msgstr "Автовоспр." -#: ardour_ui_ed.cc:384 +#: ardour_ui_ed.cc:385 msgid "Sync Startup to Video" msgstr "Синхронизировать начало с видео" -#: ardour_ui_ed.cc:386 +#: ardour_ui_ed.cc:387 msgid "Time Master" msgstr "Ведущий времени" -#: ardour_ui_ed.cc:393 +#: ardour_ui_ed.cc:394 msgid "Toggle Record Enable Track %1" msgstr "Переключить записываемость дорожки %1" -#: ardour_ui_ed.cc:400 +#: ardour_ui_ed.cc:401 msgid "Percentage" msgstr "Проценты" -#: ardour_ui_ed.cc:401 shuttle_control.cc:169 +#: ardour_ui_ed.cc:402 shuttle_control.cc:169 msgid "Semitones" msgstr "Полутона" -#: ardour_ui_ed.cc:405 +#: ardour_ui_ed.cc:406 msgid "Send MTC" msgstr "Передавать MTC" -#: ardour_ui_ed.cc:407 +#: ardour_ui_ed.cc:408 msgid "Send MMC" msgstr "Передавать MMC" -#: ardour_ui_ed.cc:409 +#: ardour_ui_ed.cc:410 msgid "Use MMC" msgstr "Использовать MMC" -#: ardour_ui_ed.cc:411 rc_option_editor.cc:1702 +#: ardour_ui_ed.cc:412 rc_option_editor.cc:1702 msgid "Send MIDI Clock" msgstr "Отправлять MIDI Clock" -#: ardour_ui_ed.cc:413 +#: ardour_ui_ed.cc:414 msgid "Send MIDI Feedback" msgstr "Отправлять MIDI Feedback" -#: ardour_ui_ed.cc:419 +#: ardour_ui_ed.cc:420 msgid "Panic" msgstr "" -#: ardour_ui_ed.cc:559 +#: ardour_ui_ed.cc:560 msgid "Wall Clock" msgstr "Текущее время" -#: ardour_ui_ed.cc:560 +#: ardour_ui_ed.cc:561 msgid "Disk Space" msgstr "Диск. пространство" -#: ardour_ui_ed.cc:561 +#: ardour_ui_ed.cc:562 msgid "DSP" msgstr "DSP" -#: ardour_ui_ed.cc:562 +#: ardour_ui_ed.cc:563 msgid "Buffers" msgstr "Буферы" -#: ardour_ui_ed.cc:563 +#: ardour_ui_ed.cc:564 msgid "JACK Sampling Rate and Latency" msgstr "Частота сэмплирования и задержка JACK" -#: ardour_ui_ed.cc:564 +#: ardour_ui_ed.cc:565 msgid "Timecode Format" msgstr "Формат тайм-кода" -#: ardour_ui_ed.cc:565 +#: ardour_ui_ed.cc:566 msgid "File Format" msgstr "Формат файлов" @@ -2149,28 +2157,28 @@ msgid "hide track" msgstr "Скрыть дорожку" #: automation_time_axis.cc:255 automation_time_axis.cc:307 -#: automation_time_axis.cc:496 gain_meter.cc:196 generic_pluginui.cc:456 -#: generic_pluginui.cc:733 panner_ui.cc:150 +#: automation_time_axis.cc:496 gain_meter.cc:194 generic_pluginui.cc:456 +#: generic_pluginui.cc:746 panner_ui.cc:150 msgid "Automation|Manual" msgstr "Вручную" #: automation_time_axis.cc:257 automation_time_axis.cc:318 #: automation_time_axis.cc:501 editor.cc:1933 editor.cc:2010 -#: editor_actions.cc:118 editor_actions.cc:1865 gain_meter.cc:199 -#: generic_pluginui.cc:459 generic_pluginui.cc:735 midi_time_axis.cc:1488 +#: editor_actions.cc:118 editor_actions.cc:1865 gain_meter.cc:197 +#: generic_pluginui.cc:459 generic_pluginui.cc:748 midi_time_axis.cc:1488 #: midi_time_axis.cc:1491 midi_time_axis.cc:1494 panner_ui.cc:153 msgid "Play" msgstr "Воспр." #: automation_time_axis.cc:259 automation_time_axis.cc:329 -#: automation_time_axis.cc:506 gain_meter.cc:202 generic_pluginui.cc:462 -#: generic_pluginui.cc:737 panner_ui.cc:156 +#: automation_time_axis.cc:506 gain_meter.cc:200 generic_pluginui.cc:462 +#: generic_pluginui.cc:750 panner_ui.cc:156 msgid "Write" msgstr "Запись" #: automation_time_axis.cc:261 automation_time_axis.cc:340 -#: automation_time_axis.cc:511 gain_meter.cc:205 generic_pluginui.cc:465 -#: generic_pluginui.cc:739 panner_ui.cc:159 +#: automation_time_axis.cc:511 gain_meter.cc:203 generic_pluginui.cc:465 +#: generic_pluginui.cc:752 panner_ui.cc:159 msgid "Touch" msgstr "Касание" @@ -2183,7 +2191,7 @@ msgid "clear automation" msgstr "Очистить автоматизацию" #: automation_time_axis.cc:485 editor_actions.cc:613 editor_markers.cc:857 -#: location_ui.cc:55 plugin_selector.cc:85 route_time_axis.cc:699 +#: location_ui.cc:55 plugin_selector.cc:85 route_time_axis.cc:708 msgid "Hide" msgstr "Скрыть" @@ -2204,7 +2212,7 @@ msgstr "Дискретный" msgid "Linear" msgstr "Линейная" -#: automation_time_axis.cc:543 rhythm_ferret.cc:110 route_time_axis.cc:638 +#: automation_time_axis.cc:543 rhythm_ferret.cc:110 route_time_axis.cc:647 #: shuttle_control.cc:188 msgid "Mode" msgstr "Режим" @@ -2221,13 +2229,13 @@ msgstr "Изменение пакета" msgid "Direction:" msgstr "Направление:" -#: bundle_manager.cc:205 bundle_manager.cc:209 mixer_strip.cc:156 -#: mixer_strip.cc:2132 +#: bundle_manager.cc:205 bundle_manager.cc:209 mixer_strip.cc:157 +#: mixer_strip.cc:2126 msgid "Input" msgstr "Вход" #: bundle_manager.cc:206 bundle_manager.cc:211 bundle_manager.cc:245 -#: mixer_strip.cc:161 mixer_strip.cc:2135 +#: mixer_strip.cc:162 mixer_strip.cc:2129 msgid "Output" msgstr "Выход" @@ -2237,8 +2245,8 @@ msgid "Edit" msgstr "Правка" #: bundle_manager.cc:265 editor.cc:5493 editor_actions.cc:310 -#: editor_actions.cc:368 plugin_ui.cc:420 processor_box.cc:2227 -#: route_time_axis.cc:704 +#: editor_actions.cc:368 plugin_ui.cc:419 processor_box.cc:2216 +#: route_time_axis.cc:713 msgid "Delete" msgstr "Удалить" @@ -2406,7 +2414,7 @@ msgstr "Время" #: edit_note_dialog.cc:98 editor_regions.cc:114 #: export_timespan_selector.cc:359 export_timespan_selector.cc:421 -#: location_ui.cc:313 midi_list_editor.cc:114 time_info_box.cc:105 +#: location_ui.cc:317 midi_list_editor.cc:114 time_info_box.cc:105 msgid "Length" msgstr "Длительность" @@ -2687,8 +2695,8 @@ msgstr "Симметрично" msgid "Slow" msgstr "Медленно" -#: editor.cc:1390 editor.cc:1483 editor.cc:1545 sfdb_ui.cc:1606 -#: sfdb_ui.cc:1715 +#: editor.cc:1390 editor.cc:1483 editor.cc:1545 sfdb_ui.cc:1633 +#: sfdb_ui.cc:1742 msgid "Fast" msgstr "Быстро" @@ -2708,7 +2716,7 @@ msgstr "Активировать" msgid "Slowest" msgstr "Медленнее всего" -#: editor.cc:1572 route_time_axis.cc:1863 selection.cc:1009 selection.cc:1064 +#: editor.cc:1572 route_time_axis.cc:1877 selection.cc:1009 selection.cc:1064 msgid "programming error: " msgstr "Ошибка в программе: " @@ -2825,7 +2833,7 @@ msgid "Select All in Track" msgstr "Выделить всё на дорожке" #: editor.cc:1942 editor.cc:2019 editor_actions.cc:185 -#: export_timespan_selector.cc:53 processor_box.cc:2235 +#: export_timespan_selector.cc:53 processor_box.cc:2224 msgid "Select All" msgstr "Выделить всё" @@ -2877,15 +2885,15 @@ msgstr "Создать выделение между указателем и к msgid "Select" msgstr "Выделить" -#: editor.cc:1965 editor.cc:2036 editor_actions.cc:309 processor_box.cc:2220 +#: editor.cc:1965 editor.cc:2036 editor_actions.cc:309 processor_box.cc:2209 msgid "Cut" msgstr "Вырезать" -#: editor.cc:1966 editor.cc:2037 editor_actions.cc:312 processor_box.cc:2223 +#: editor.cc:1966 editor.cc:2037 editor_actions.cc:312 processor_box.cc:2212 msgid "Copy" msgstr "Копировать" -#: editor.cc:1967 editor.cc:2038 editor_actions.cc:313 processor_box.cc:2231 +#: editor.cc:1967 editor.cc:2038 editor_actions.cc:313 processor_box.cc:2220 msgid "Paste" msgstr "Вставить" @@ -3090,7 +3098,7 @@ msgstr "Очистить списки воспроизведения" msgid "Please wait while %1 loads visual data." msgstr "Дождитесь загрузки визуальных данных в %1." -#: editor.cc:5492 editor_markers.cc:940 panner_ui.cc:393 processor_box.cc:2251 +#: editor.cc:5492 editor_markers.cc:940 panner_ui.cc:393 processor_box.cc:2240 msgid "Edit..." msgstr "Изменить" @@ -3139,7 +3147,7 @@ msgstr "Слои" msgid "Position" msgstr "Положение" -#: editor_actions.cc:101 gain_meter.cc:124 gain_meter.cc:755 panner_ui.cc:177 +#: editor_actions.cc:101 gain_meter.cc:120 gain_meter.cc:787 panner_ui.cc:177 #: panner_ui.cc:586 msgid "Trim" msgstr "Обрезать" @@ -3231,8 +3239,8 @@ msgstr "Дополнительный счётчик" msgid "Separate" msgstr "Разделить" -#: editor_actions.cc:132 mixer_strip.cc:1916 route_time_axis.cc:199 -#: route_time_axis.cc:2397 +#: editor_actions.cc:132 mixer_strip.cc:1913 route_time_axis.cc:208 +#: route_time_axis.cc:2417 msgid "Solo" msgstr "Соло" @@ -3244,7 +3252,7 @@ msgstr "Подвыборки" msgid "Timecode fps" msgstr "Скорость (FPS) тайм-кода" -#: editor_actions.cc:137 route_time_axis.cc:421 +#: editor_actions.cc:137 route_time_axis.cc:430 msgid "Height" msgstr "Высота" @@ -3368,7 +3376,7 @@ msgstr "К началу области" msgid "Playhead to Range End" msgstr "К концу области" -#: editor_actions.cc:186 export_timespan_selector.cc:61 processor_box.cc:2237 +#: editor_actions.cc:186 export_timespan_selector.cc:61 processor_box.cc:2226 msgid "Deselect All" msgstr "Снять все выделения" @@ -3637,8 +3645,8 @@ msgid "Toggle Active" msgstr "Переключить активность" #: editor_actions.cc:370 editor_actions.cc:1716 editor_markers.cc:876 -#: editor_markers.cc:941 editor_snapshots.cc:121 mixer_strip.cc:1488 -#: route_time_axis.cc:701 +#: editor_markers.cc:941 editor_snapshots.cc:121 mixer_strip.cc:1494 +#: route_time_axis.cc:710 msgid "Remove" msgstr "Удалить" @@ -3646,19 +3654,19 @@ msgstr "Удалить" msgid "Fit Selected Tracks" msgstr "Только выделенные дорожки" -#: editor_actions.cc:376 time_axis_view.cc:1298 +#: editor_actions.cc:376 time_axis_view.cc:1301 msgid "Largest" msgstr "Огромная" -#: editor_actions.cc:379 time_axis_view.cc:1299 +#: editor_actions.cc:379 time_axis_view.cc:1302 msgid "Larger" msgstr "Больше" -#: editor_actions.cc:382 editor_rulers.cc:375 time_axis_view.cc:1300 +#: editor_actions.cc:382 editor_rulers.cc:375 time_axis_view.cc:1303 msgid "Large" msgstr "Большая" -#: editor_actions.cc:388 editor_rulers.cc:379 time_axis_view.cc:1302 +#: editor_actions.cc:388 editor_rulers.cc:379 time_axis_view.cc:1305 msgid "Small" msgstr "Маленькая" @@ -4025,7 +4033,7 @@ msgstr "" #: editor_actions.cc:652 editor_audio_import.cc:279 #: session_import_dialog.cc:74 session_import_dialog.cc:94 -#: session_metadata_dialog.cc:297 editor_videotimeline.cc:107 +#: session_metadata_dialog.cc:297 editor_videotimeline.cc:108 msgid "Import" msgstr "Импортировать" @@ -4103,7 +4111,7 @@ msgstr "Приклеить к тактам и долям" msgid "Remove Sync" msgstr "Удалить синхронизатор" -#: editor_actions.cc:1752 mixer_strip.cc:1903 route_time_axis.cc:200 +#: editor_actions.cc:1752 mixer_strip.cc:1903 route_time_axis.cc:209 msgid "Mute" msgstr "Молча" @@ -4376,7 +4384,7 @@ msgstr "" "В этом сеансе уже есть исходный файл с именем %1. Вы хотите импортировать %2 " "как новый источник или пропустить его?" -#: editor_audio_import.cc:279 editor_videotimeline.cc:107 +#: editor_audio_import.cc:279 editor_videotimeline.cc:108 msgid "Cancel Import" msgstr "Отменить импорт" @@ -4424,7 +4432,7 @@ msgstr "Начало видеофайла" #: editor_drag.cc:1702 msgid "Diff:" -msgstr "" +msgstr "Разница:" #: editor_drag.cc:1722 msgid "Move Video" @@ -4610,7 +4618,7 @@ msgid "end" msgstr "Конец" #: editor_markers.cc:646 editor_ops.cc:1744 editor_ops.cc:1764 -#: editor_ops.cc:1788 editor_ops.cc:1815 location_ui.cc:1005 +#: editor_ops.cc:1788 editor_ops.cc:1815 location_ui.cc:1017 msgid "add marker" msgstr "добавка маркера" @@ -4618,7 +4626,7 @@ msgstr "добавка маркера" msgid "range" msgstr "область" -#: editor_markers.cc:713 location_ui.cc:840 +#: editor_markers.cc:713 location_ui.cc:852 msgid "remove marker" msgstr "удаление маркера" @@ -4695,7 +4703,7 @@ msgid "Rename Range" msgstr "Переименовать выделение" #: editor_markers.cc:1363 editor_mouse.cc:2510 processor_box.cc:1768 -#: processor_box.cc:2233 route_time_axis.cc:968 route_ui.cc:1535 +#: processor_box.cc:2222 route_time_axis.cc:982 route_ui.cc:1535 msgid "Rename" msgstr "Переименовать" @@ -5326,7 +5334,7 @@ msgstr "" msgid "Length of region fade-out (units: secondary clock), () if dsisabled" msgstr "" -#: editor_regions.cc:118 mixer_strip.cc:1960 mono_panner.cc:179 +#: editor_regions.cc:118 mixer_strip.cc:1953 mono_panner.cc:179 #: stereo_panner.cc:217 stereo_panner.cc:240 msgid "L" msgstr "Л" @@ -5343,8 +5351,9 @@ msgstr "" msgid "Region position glued to Bars|Beats time?" msgstr "" -#: editor_regions.cc:120 editor_routes.cc:207 gain_meter.cc:723 -#: mixer_strip.cc:1934 panner_ui.cc:554 stereo_panner.cc:237 +#: editor_regions.cc:120 editor_routes.cc:207 gain_meter.cc:755 +#: mixer_strip.cc:1930 meter_strip.cc:272 panner_ui.cc:554 +#: stereo_panner.cc:237 msgid "M" msgstr "В" @@ -5413,7 +5422,8 @@ msgstr "Название дорожи/шины" msgid "Track/Bus visible ?" msgstr "Дорожка или шина видима?" -#: editor_routes.cc:204 mixer_strip.cc:1951 route_time_axis.cc:2387 +#: editor_routes.cc:204 mixer_strip.cc:1944 meter_strip.cc:286 +#: route_time_axis.cc:2407 msgid "A" msgstr "A" @@ -5421,7 +5431,7 @@ msgstr "A" msgid "Track/Bus active ?" msgstr "Дорожка или шина активна?" -#: editor_routes.cc:205 mixer_strip.cc:1935 +#: editor_routes.cc:205 mixer_strip.cc:1931 msgid "I" msgstr "ВХ" @@ -5429,7 +5439,7 @@ msgstr "ВХ" msgid "MIDI input enabled" msgstr "Вход MIDI включен" -#: editor_routes.cc:206 mixer_strip.cc:1933 mono_panner.cc:198 +#: editor_routes.cc:206 mixer_strip.cc:1929 mono_panner.cc:198 #: stereo_panner.cc:215 stereo_panner.cc:242 msgid "R" msgstr "П" @@ -5442,7 +5452,7 @@ msgstr "Готовность к записи" msgid "Muted" msgstr "" -#: editor_routes.cc:208 mixer_strip.cc:1947 +#: editor_routes.cc:208 mixer_strip.cc:1940 meter_strip.cc:282 msgid "S" msgstr "S" @@ -5454,7 +5464,7 @@ msgstr "..." msgid "SI" msgstr "" -#: editor_routes.cc:209 mixer_strip.cc:351 rc_option_editor.cc:1872 +#: editor_routes.cc:209 mixer_strip.cc:352 rc_option_editor.cc:1872 msgid "Solo Isolated" msgstr "Изолирование соло" @@ -5736,7 +5746,7 @@ msgstr "192КГц" #: engine_dialog.cc:127 engine_dialog.cc:132 engine_dialog.cc:169 #: engine_dialog.cc:552 midi_channel_selector.cc:163 #: midi_channel_selector.cc:402 midi_channel_selector.cc:438 -#: rc_option_editor.cc:1250 sfdb_ui.cc:542 +#: rc_option_editor.cc:1250 sfdb_ui.cc:541 msgid "None" msgstr "Нет" @@ -5785,7 +5795,7 @@ msgstr "Драйвер:" msgid "Audio Interface:" msgstr "Звуковой интерфейс:" -#: engine_dialog.cc:187 sfdb_ui.cc:148 sfdb_ui.cc:261 sfdb_ui.cc:266 +#: engine_dialog.cc:187 sfdb_ui.cc:149 sfdb_ui.cc:262 sfdb_ui.cc:267 msgid "Sample rate:" msgstr "Частота сэмплирования:" @@ -5907,7 +5917,7 @@ msgstr "Значению AudioSetup для %1 не хватает данных" msgid "configuration files contain a JACK server path that doesn't exist (%1)" msgstr "" -#: export_channel_selector.cc:45 sfdb_ui.cc:146 +#: export_channel_selector.cc:45 sfdb_ui.cc:147 msgid "Channels:" msgstr "Каналов:" @@ -6184,6 +6194,10 @@ msgstr "Параметры FLAC" msgid "Broadcast Wave options" msgstr "Параметры Broadcast Wave" +#: export_format_selector.cc:136 +msgid "Do you really want to remove the format?" +msgstr "Вы действительно хотите удалить этот формат?" + #: export_preset_selector.cc:28 msgid "Preset" msgstr "Профиль" @@ -6194,6 +6208,10 @@ msgid "" "Perhaps it references a format that has been removed?" msgstr "" +#: export_preset_selector.cc:156 +msgid "Do you really want to remove this preset?" +msgstr "Вы действительно хотите удалить этот профиль?" + #: export_timespan_selector.cc:46 msgid "Show Times as:" msgstr "Показать время как:" @@ -6206,36 +6224,32 @@ msgstr " до " msgid "Range" msgstr "Диапазон" -#: gain_meter.cc:109 gain_meter.cc:431 gain_meter.cc:820 +#: gain_meter.cc:105 gain_meter.cc:356 gain_meter.cc:461 gain_meter.cc:852 msgid "-inf" msgstr "-inf" -#: gain_meter.cc:115 gain_meter.cc:869 +#: gain_meter.cc:111 gain_meter.cc:909 msgid "Fader automation mode" msgstr "Режим автоматизации фейдера" -#: gain_meter.cc:116 gain_meter.cc:870 +#: gain_meter.cc:112 gain_meter.cc:910 msgid "Fader automation type" msgstr "Тип автоматизации фейдера" -#: gain_meter.cc:125 gain_meter.cc:759 panner_ui.cc:178 panner_ui.cc:590 +#: gain_meter.cc:121 gain_meter.cc:791 panner_ui.cc:178 panner_ui.cc:590 msgid "Abs" msgstr "Абс" -#: gain_meter.cc:334 -msgid "-Inf" -msgstr "-Inf" - -#: gain_meter.cc:726 mixer_strip.cc:1954 panner_ui.cc:557 -#: route_time_axis.cc:2391 +#: gain_meter.cc:758 mixer_strip.cc:1947 meter_strip.cc:289 panner_ui.cc:557 +#: route_time_axis.cc:2411 msgid "P" msgstr "P" -#: gain_meter.cc:729 panner_ui.cc:560 +#: gain_meter.cc:761 panner_ui.cc:560 msgid "T" msgstr "К" -#: gain_meter.cc:732 panner_ui.cc:563 +#: gain_meter.cc:764 panner_ui.cc:563 msgid "W" msgstr "З" @@ -6247,7 +6261,7 @@ msgstr "Профили" msgid "Switches" msgstr "Переключатели" -#: generic_pluginui.cc:242 generic_pluginui.cc:376 processor_box.cc:2210 +#: generic_pluginui.cc:242 generic_pluginui.cc:376 processor_box.cc:2199 msgid "Controls" msgstr "Управление" @@ -6275,7 +6289,7 @@ msgstr "Управление звуковыми соединениями" msgid "MIDI Connection Manager" msgstr "Управление MIDI-соединениями" -#: global_port_matrix.cc:204 io_selector.cc:216 +#: global_port_matrix.cc:213 io_selector.cc:216 msgid "port" msgstr "порт" @@ -6427,11 +6441,11 @@ msgstr "Импортируется файл: %1 из %2" msgid "I/O selector" msgstr "Выбор входов и выходов" -#: io_selector.cc:266 +#: io_selector.cc:265 msgid "%1 input" msgstr "%1 вход" -#: io_selector.cc:268 +#: io_selector.cc:267 msgid "%1 output" msgstr "%1 выход" @@ -6507,7 +6521,7 @@ msgstr[2] "%1 сэмплов" msgid "Reset" msgstr "Сбросить" -#: latency_gui.cc:151 rhythm_ferret.cc:274 sfdb_ui.cc:1734 +#: latency_gui.cc:151 rhythm_ferret.cc:274 sfdb_ui.cc:1761 msgid "programming error: %1 (%2)" msgstr "Ошибка в программе: %1 (%2)" @@ -6535,63 +6549,63 @@ msgstr "Композитор:" msgid "Pre-Emphasis" msgstr "" -#: location_ui.cc:310 +#: location_ui.cc:314 msgid "Remove this range" msgstr "Удалить эту область" -#: location_ui.cc:311 +#: location_ui.cc:315 msgid "Start time - middle click to locate here" msgstr "" -#: location_ui.cc:312 +#: location_ui.cc:316 msgid "End time - middle click to locate here" msgstr "" -#: location_ui.cc:315 +#: location_ui.cc:319 msgid "Set range start from playhead location" msgstr "Установить начало диапазона по указателю воспроизведения" -#: location_ui.cc:316 +#: location_ui.cc:320 msgid "Set range end from playhead location" msgstr "Установить конец диапазона по указателю воспроизведения" -#: location_ui.cc:320 +#: location_ui.cc:324 msgid "Remove this marker" msgstr "Удалить этот маркер" -#: location_ui.cc:321 +#: location_ui.cc:325 msgid "Position - middle click to locate here" msgstr "" -#: location_ui.cc:323 +#: location_ui.cc:327 msgid "Set marker time from playhead location" msgstr "" -#: location_ui.cc:462 +#: location_ui.cc:494 msgid "You cannot put a CD marker at the start of the session" msgstr "Размещение маркера CD в начале сеанса невозможно" -#: location_ui.cc:708 +#: location_ui.cc:720 msgid "New Marker" msgstr "Создать маркер" -#: location_ui.cc:709 +#: location_ui.cc:721 msgid "New Range" msgstr "Создать область" -#: location_ui.cc:722 +#: location_ui.cc:734 msgid "Loop/Punch Ranges" msgstr "Диапазоны петель/врезок" -#: location_ui.cc:747 +#: location_ui.cc:759 msgid "Markers (Including CD Index)" msgstr "Маркеры (включая индекс CD)" -#: location_ui.cc:782 +#: location_ui.cc:794 msgid "Ranges (Including CD Track Ranges)" msgstr "Диапазоны (включая диапазоны дорожек CD)" -#: location_ui.cc:1024 +#: location_ui.cc:1036 msgid "add range marker" msgstr "добавка маркера выделения" @@ -7263,152 +7277,152 @@ msgstr "" msgid "Could not find mixer.bindings in search path %1" msgstr "" -#: mixer_strip.cc:91 mixer_strip.cc:119 mixer_strip.cc:1720 +#: mixer_strip.cc:92 mixer_strip.cc:120 mixer_strip.cc:1720 msgid "pre" msgstr "lj" -#: mixer_strip.cc:93 mixer_strip.cc:121 mixer_strip.cc:352 mixer_strip.cc:1293 +#: mixer_strip.cc:94 mixer_strip.cc:122 mixer_strip.cc:353 mixer_strip.cc:1299 #: rc_option_editor.cc:1873 msgid "Comments" msgstr "Комментарии" -#: mixer_strip.cc:145 +#: mixer_strip.cc:146 msgid "Click to toggle the width of this mixer strip." msgstr "Щёлкните для переключения ширины полоски микшера" -#: mixer_strip.cc:147 +#: mixer_strip.cc:148 msgid "" "\n" "%1-%2-click to toggle the width of all strips." msgstr "" -#: mixer_strip.cc:154 +#: mixer_strip.cc:155 msgid "Hide this mixer strip" msgstr "Скрыть полоску микшера" -#: mixer_strip.cc:165 +#: mixer_strip.cc:166 msgid "Click to select metering point" msgstr "Щёлкните для выбора точка замера" -#: mixer_strip.cc:171 +#: mixer_strip.cc:172 msgid "tupni" msgstr "" -#: mixer_strip.cc:190 +#: mixer_strip.cc:191 msgid "Isolate Solo" msgstr "Изолировать соло" -#: mixer_strip.cc:199 +#: mixer_strip.cc:200 msgid "Lock Solo Status" msgstr "Статус блокировки солирования" -#: mixer_strip.cc:201 mixer_strip.cc:1929 +#: mixer_strip.cc:202 mixer_strip.cc:1925 msgid "lock" msgstr "Блок" -#: mixer_strip.cc:202 mixer_strip.cc:1928 +#: mixer_strip.cc:203 mixer_strip.cc:1924 msgid "iso" msgstr "Изол" -#: mixer_strip.cc:256 +#: mixer_strip.cc:257 msgid "Mix group" msgstr "Группа микса" -#: mixer_strip.cc:349 rc_option_editor.cc:1870 +#: mixer_strip.cc:350 rc_option_editor.cc:1870 msgid "Phase Invert" msgstr "Инверсия фазы" -#: mixer_strip.cc:350 rc_option_editor.cc:1871 route_ui.cc:1213 +#: mixer_strip.cc:351 rc_option_editor.cc:1871 route_ui.cc:1213 msgid "Solo Safe" msgstr "Блокировка солирования" -#: mixer_strip.cc:353 mixer_ui.cc:124 route_time_axis.cc:664 +#: mixer_strip.cc:354 mixer_ui.cc:124 route_time_axis.cc:673 msgid "Group" msgstr "Группа" -#: mixer_strip.cc:354 rc_option_editor.cc:1874 +#: mixer_strip.cc:355 rc_option_editor.cc:1874 msgid "Meter Point" msgstr "Точка измерения" -#: mixer_strip.cc:466 +#: mixer_strip.cc:469 msgid "Enable/Disable MIDI input" msgstr "Включить или выключить MIDI-вход" -#: mixer_strip.cc:616 +#: mixer_strip.cc:621 msgid "" "Aux\n" "Sends" msgstr "" -#: mixer_strip.cc:640 +#: mixer_strip.cc:645 msgid "Snd" msgstr "Псл" -#: mixer_strip.cc:694 mixer_strip.cc:822 processor_box.cc:2152 +#: mixer_strip.cc:700 mixer_strip.cc:828 processor_box.cc:2141 msgid "Not connected to JACK - no I/O changes are possible" msgstr "Нет соединения с JACK, любые изменения входа-выхода невозможны" -#: mixer_strip.cc:1089 +#: mixer_strip.cc:1095 msgid "INPUT to %1" msgstr "ВХОД в %1" -#: mixer_strip.cc:1092 +#: mixer_strip.cc:1098 msgid "OUTPUT from %1" msgstr "ВЫХОД из %1" -#: mixer_strip.cc:1167 +#: mixer_strip.cc:1173 msgid "Disconnected" msgstr "Нет соединения" -#: mixer_strip.cc:1296 +#: mixer_strip.cc:1302 msgid "*Comments*" msgstr "*Кмт*" -#: mixer_strip.cc:1303 +#: mixer_strip.cc:1309 msgid "Cmt" msgstr "Кмт" -#: mixer_strip.cc:1306 +#: mixer_strip.cc:1312 msgid "*Cmt*" msgstr "*Кмт*" -#: mixer_strip.cc:1312 +#: mixer_strip.cc:1318 msgid "Click to Add/Edit Comments" msgstr "Нажмите для добавления/правки комментариев" -#: mixer_strip.cc:1351 +#: mixer_strip.cc:1357 msgid ": comment editor" msgstr ": редактор комментариев" -#: mixer_strip.cc:1428 +#: mixer_strip.cc:1434 msgid "Grp" msgstr "Грп" -#: mixer_strip.cc:1431 +#: mixer_strip.cc:1437 msgid "~G" msgstr "нГр" -#: mixer_strip.cc:1460 +#: mixer_strip.cc:1466 msgid "Comments..." msgstr "Комментарии..." -#: mixer_strip.cc:1462 +#: mixer_strip.cc:1468 msgid "Save As Template..." msgstr "Сохранить как шаблон..." -#: mixer_strip.cc:1468 route_group_dialog.cc:39 route_time_axis.cc:687 +#: mixer_strip.cc:1474 route_group_dialog.cc:39 route_time_axis.cc:696 msgid "Active" msgstr "Активность" -#: mixer_strip.cc:1475 +#: mixer_strip.cc:1481 msgid "Adjust Latency..." msgstr "Скорректировать задержку..." -#: mixer_strip.cc:1478 +#: mixer_strip.cc:1484 msgid "Protect Against Denormals" msgstr "Защищать от отклонений" -#: mixer_strip.cc:1484 route_time_axis.cc:426 +#: mixer_strip.cc:1490 route_time_axis.cc:435 msgid "Remote Control ID..." msgstr "ID для удалённого управления..." @@ -7448,31 +7462,63 @@ msgstr "" msgid "Disk" msgstr "Диск" -#: mixer_strip.cc:1920 monitor_section.cc:63 +#: mixer_strip.cc:1917 monitor_section.cc:63 msgid "AFL" msgstr "AFL" -#: mixer_strip.cc:1923 monitor_section.cc:64 +#: mixer_strip.cc:1920 monitor_section.cc:64 msgid "PFL" msgstr "PFL" -#: mixer_strip.cc:1936 +#: mixer_strip.cc:1932 msgid "D" msgstr "" -#: mixer_strip.cc:1959 +#: mixer_strip.cc:1952 #, fuzzy msgid "i" msgstr "вх" -#: mixer_strip.cc:2133 +#: mixer_strip.cc:2127 msgid "Pre-fader" msgstr "До фейдера" -#: mixer_strip.cc:2134 +#: mixer_strip.cc:2128 msgid "Post-fader" msgstr "После фейдера" +#: mixer_strip.cc:2135 meter_strip.cc:575 +msgid "Peak" +msgstr "Пиковое значение" + +#: mixer_strip.cc:2136 meter_strip.cc:576 +msgid "RMS + Peak" +msgstr "Среднеквадратичное + пиковое значение" + +#: mixer_strip.cc:2155 meter_strip.cc:579 +msgid "Change all in Group to Peak" +msgstr "Поменять все в группе на пиковое" + +#: mixer_strip.cc:2156 meter_strip.cc:580 +msgid "Change all in Group to RMS + Peak" +msgstr "Поменять все в группе на среднеквадратичное + пиковое" + +#: mixer_strip.cc:2157 meter_strip.cc:581 +msgid "Change all to Peak" +msgstr "Поменять все на пиковое" + +#: mixer_strip.cc:2158 meter_strip.cc:582 +msgid "Change all to RMS + Peak" +msgstr "Поменять все на среднеквадратичное + пиковое" + +#: mixer_strip.cc:2159 meter_strip.cc:583 +msgid "Change same track-type to Peak" +msgstr "Поменять дорожки одного типа на пиковое" + +#: mixer_strip.cc:2160 meter_strip.cc:584 +msgid "Change same track-type to RMS + Peak" +msgstr "Поменять дорожки одного типа на среднеквадратичное + пиковое" + #: mixer_ui.cc:1189 msgid "track display list item for renamed strip not found!" msgstr "" @@ -7481,7 +7527,7 @@ msgstr "" msgid "-all-" msgstr "-все-" -#: mixer_ui.cc:1792 +#: mixer_ui.cc:1794 msgid "Strips" msgstr "Каналы" @@ -7642,7 +7688,7 @@ msgstr "Левый:%3d, Правый:%3d" #: mono_panner_editor.cc:33 msgid "Mono Panner" -msgstr "" +msgstr "Монопанорама" #: mono_panner_editor.cc:44 mono_panner_editor.cc:49 #: stereo_panner_editor.cc:46 stereo_panner_editor.cc:51 @@ -7865,7 +7911,7 @@ msgstr "" msgid "Panner (2D)" msgstr "Панорамирование (2D)" -#: panner2d.cc:783 panner_ui.cc:384 plugin_ui.cc:452 +#: panner2d.cc:783 panner_ui.cc:384 plugin_ui.cc:451 msgid "Bypass" msgstr "Обход" @@ -8038,7 +8084,7 @@ msgstr "По категории" msgid "Eh? LADSPA plugins don't have editors!" msgstr "Что? У эффектов LADSPA нет своих редакторов!" -#: plugin_ui.cc:125 plugin_ui.cc:228 +#: plugin_ui.cc:125 plugin_ui.cc:227 msgid "" "unknown type of editor-supplying plugin (note: no VST support in this " "version of %1)" @@ -8048,51 +8094,51 @@ msgstr "" msgid "unknown type of editor-supplying plugin" msgstr "" -#: plugin_ui.cc:258 +#: plugin_ui.cc:257 msgid "" "unknown type of editor-supplying plugin (note: no linuxVST support in this " "version of %1)" msgstr "" -#: plugin_ui.cc:330 +#: plugin_ui.cc:329 msgid "create_lv2_editor called on non-LV2 plugin" msgstr "" -#: plugin_ui.cc:418 +#: plugin_ui.cc:417 msgid "Add" msgstr "Добавить" -#: plugin_ui.cc:422 +#: plugin_ui.cc:421 msgid "Description" msgstr "Описание" -#: plugin_ui.cc:423 +#: plugin_ui.cc:422 msgid "Plugin analysis" msgstr "Частотный анализ модуля" -#: plugin_ui.cc:430 +#: plugin_ui.cc:429 msgid "" "Presets (if any) for this plugin\n" "(Both factory and user-created)" msgstr "Все доступные профили этого модуля,как «заводские», так и собственные" -#: plugin_ui.cc:431 +#: plugin_ui.cc:430 msgid "Save a new preset" msgstr "Сохранить новый профиль" -#: plugin_ui.cc:432 +#: plugin_ui.cc:431 msgid "Save the current preset" msgstr "Сохранить текущий профиль" -#: plugin_ui.cc:433 +#: plugin_ui.cc:432 msgid "Delete the current preset" msgstr "Удалить текущий профиль" -#: plugin_ui.cc:434 +#: plugin_ui.cc:433 msgid "Disable signal processing by the plugin" msgstr "Выключить обработку сигнала этим модулем" -#: plugin_ui.cc:467 plugin_ui.cc:632 +#: plugin_ui.cc:466 plugin_ui.cc:662 msgid "" "Click to allow the plugin to receive keyboard events that %1 would normally " "use as a shortcut" @@ -8100,30 +8146,42 @@ msgstr "" "Щёлкните, чтобы разрешить этому модулю получать клавиатурные события, " "которые %1 обычно использует как горячие клавиши" -#: plugin_ui.cc:468 +#: plugin_ui.cc:467 msgid "Click to enable/disable this plugin" msgstr "Щелкните, чтобы включить или отключить этот модуль" -#: plugin_ui.cc:507 +#: plugin_ui.cc:506 msgid "latency (%1 sample)" msgid_plural "latency (%1 samples)" msgstr[0] "Задержка (%1 сэмпл)" msgstr[1] "Задержка (%1 сэмпла)" msgstr[2] "Задержка (%1 сэмплов)" -#: plugin_ui.cc:509 +#: plugin_ui.cc:508 msgid "latency (%1 ms)" msgstr "Задержка (%1 мс)" -#: plugin_ui.cc:520 +#: plugin_ui.cc:519 msgid "Edit Latency" msgstr "Изменить задержку" -#: plugin_ui.cc:559 +#: plugin_ui.cc:558 msgid "Plugin preset %1 not found" msgstr "Предустановка модуля %1 не обнаружена" -#: plugin_ui.cc:639 +#: plugin_ui.cc:595 +msgid "" +"Plugin presets are not supported in this build of %1. Consider paying for a " +"full version" +msgstr "" + +#: plugin_ui.cc:615 plugin_ui.cc:630 +msgid "" +"Plugin presets are not supported in this build of %1. Consider paying for a " +"newer version" +msgstr "" + +#: plugin_ui.cc:669 msgid "Click to allow normal use of %1 keyboard shortcuts" msgstr "" "Щёлкните, чтобы переключиться на обычное использование горячих клавиш %1" @@ -8228,46 +8286,46 @@ msgstr "Выполняется определение..." msgid "Port Insert " msgstr "Вставка порта" -#: port_matrix.cc:323 port_matrix.cc:342 +#: port_matrix.cc:325 port_matrix.cc:344 msgid "Sources" msgstr "Источники" -#: port_matrix.cc:324 port_matrix.cc:343 +#: port_matrix.cc:326 port_matrix.cc:345 msgid "Destinations" msgstr "Назначения" -#: port_matrix.cc:419 port_matrix.cc:427 +#: port_matrix.cc:421 port_matrix.cc:429 #, c-format msgid "Add %s %s" msgstr "Добавить %s %s" -#: port_matrix.cc:435 +#: port_matrix.cc:437 #, c-format msgid "Rename '%s'..." msgstr "Переименовать '%s'..." -#: port_matrix.cc:451 +#: port_matrix.cc:453 msgid "Remove all" msgstr "Удалить все" -#: port_matrix.cc:471 port_matrix.cc:483 +#: port_matrix.cc:473 port_matrix.cc:485 #, c-format msgid "%s all" msgstr "%s все" -#: port_matrix.cc:506 +#: port_matrix.cc:508 msgid "Rescan" msgstr "Просканировать заново" -#: port_matrix.cc:508 +#: port_matrix.cc:510 msgid "Show individual ports" msgstr "Показывать порты раздельно" -#: port_matrix.cc:514 +#: port_matrix.cc:516 msgid "Flip" msgstr "Повернуть матрицу" -#: port_matrix.cc:702 +#: port_matrix.cc:704 msgid "" "It is not possible to add a port here, as the first processor in the track " "or buss cannot support the new configuration." @@ -8275,31 +8333,31 @@ msgstr "" "Невозможно добавить сюда порт, поскольку первый обработчик дорожки или шины " "не может поддерживать новую конфигурацию." -#: port_matrix.cc:705 +#: port_matrix.cc:707 msgid "Cannot add port" msgstr "Невозможно добавить порт" -#: port_matrix.cc:727 +#: port_matrix.cc:729 msgid "Port removal not allowed" msgstr "Удаление портов не разрешено" -#: port_matrix.cc:728 +#: port_matrix.cc:730 msgid "" "This port cannot be removed, as the first plugin in the track or buss cannot " "accept the new number of inputs." msgstr "" -#: port_matrix.cc:945 +#: port_matrix.cc:947 #, c-format msgid "Remove '%s'" msgstr "Удалить '%s'" -#: port_matrix.cc:960 +#: port_matrix.cc:962 #, c-format msgid "%s all from '%s'" msgstr "%s все из '%s'" -#: port_matrix.cc:1026 +#: port_matrix.cc:1028 msgid "channel" msgstr "канал" @@ -8317,12 +8375,17 @@ msgid "" "Double-click to show GUI.\n" "Alt+double-click to show generic GUI." msgstr "" +"%1\n" +"Двойной щелчок вызывает собственный диалог модуля.\n" +"Alt+ двойной щелчок вызывает генерируемый хостом диалог с параметрами." #: processor_box.cc:258 msgid "" "%1\n" "Double-click to show generic GUI." msgstr "" +"%1\n" +"Двойной щелчок вызывает генерируемый хостом диалог с параметрами." #: processor_box.cc:371 msgid "Show All Controls" @@ -8479,51 +8542,51 @@ msgstr "" "послефейдерные обработчики из \"%1\" ?\n" "(отмена невозможна)" -#: processor_box.cc:2198 +#: processor_box.cc:2187 msgid "New Plugin" msgstr "Добавить модуль" -#: processor_box.cc:2201 +#: processor_box.cc:2190 msgid "New Insert" msgstr "Добавить возврат" -#: processor_box.cc:2204 +#: processor_box.cc:2193 msgid "New External Send ..." msgstr "Добавить внешний посыл с портом JACK..." -#: processor_box.cc:2208 +#: processor_box.cc:2197 msgid "New Aux Send ..." msgstr "Добавить внешний посыл без порта JACK..." -#: processor_box.cc:2212 +#: processor_box.cc:2201 msgid "Clear (all)" msgstr "Очистить (всё)" -#: processor_box.cc:2214 +#: processor_box.cc:2203 msgid "Clear (pre-fader)" msgstr "Очистить (до фейдера)" -#: processor_box.cc:2216 +#: processor_box.cc:2205 msgid "Clear (post-fader)" msgstr "Очистить (после фейдера)" -#: processor_box.cc:2242 +#: processor_box.cc:2231 msgid "Activate All" msgstr "Активировать все" -#: processor_box.cc:2244 +#: processor_box.cc:2233 msgid "Deactivate All" msgstr "Деактивировать все" -#: processor_box.cc:2246 +#: processor_box.cc:2235 msgid "A/B Plugins" msgstr "Отключить все" -#: processor_box.cc:2255 +#: processor_box.cc:2244 msgid "Edit with generic controls..." msgstr "Изменить с интерфейсом хоста..." -#: processor_box.cc:2531 +#: processor_box.cc:2544 msgid "%1: %2 (by %3)" msgstr "%1: %2 (автор — %3)" @@ -8644,7 +8707,6 @@ msgid "Recording (seconds of buffering):" msgstr "Запись (в секундах):" #: rc_option_editor.cc:656 -#, fuzzy msgid "Control Surface Protocol" msgstr "Устройства управления" @@ -8660,11 +8722,11 @@ msgstr "" #: rc_option_editor.cc:817 msgid "Show Video Export Info before export" -msgstr "" +msgstr "Показывать диалог с вводной информацией об экспорте видео" #: rc_option_editor.cc:818 msgid "Show Video Server Startup Dialog" -msgstr "" +msgstr "Показывать диалог с параметрами видеосервера" #: rc_option_editor.cc:819 msgid "Advanced Setup (remote video server)" @@ -8705,12 +8767,16 @@ msgid "" "When enabled an information window with details is displayed before " "the video-export dialog." msgstr "" +"Если включено, перед экспортом видео показывается окно со справочной " +"информацией" #: rc_option_editor.cc:853 msgid "" "When enabled the video server is never launched automatically without " "confirmation" msgstr "" +"Если включено, видеосервер никогда автоматически не запускается без " +"подтверждения" #: rc_option_editor.cc:993 msgid "%1 Preferences" @@ -8772,7 +8838,7 @@ msgstr "Максимальное число недавних сеансов" msgid "Click gain level" msgstr "Уровень щелчка метронома" -#: rc_option_editor.cc:1083 route_time_axis.cc:206 route_time_axis.cc:667 +#: rc_option_editor.cc:1083 route_time_axis.cc:215 route_time_axis.cc:676 msgid "Automation" msgstr "Автоматизация" @@ -9228,23 +9294,23 @@ msgstr "Солирование приоритетнее приглушения" #: rc_option_editor.cc:1665 msgid "Default track / bus muting options" -msgstr "Параметры приглушения дорожки/шины по умолчанию" +msgstr "Приглушение дорожек и шин по умолчанию затрагивает" #: rc_option_editor.cc:1670 msgid "Mute affects pre-fader sends" -msgstr "Приглушение затрагивает предфейдерные посылы" +msgstr "Предфейдерные посылы" #: rc_option_editor.cc:1678 msgid "Mute affects post-fader sends" -msgstr "Приглушение затрагивает послефейдерные посылы" +msgstr "Послефейдерные посылы" #: rc_option_editor.cc:1686 msgid "Mute affects control outputs" -msgstr "Приглушение затрагивает выходы мониторинга" +msgstr "Выходы мониторинга" #: rc_option_editor.cc:1694 msgid "Mute affects main outputs" -msgstr "Приглушение затрагивает основные выходы" +msgstr "Основные выходы" #: rc_option_editor.cc:1710 msgid "Send MIDI Time Code" @@ -9300,6 +9366,9 @@ msgid "" " (requires a restart of %1 to take effect)\n" " (if available for your language preferences)" msgstr "" +"Использовать перевод интерфейса %1\n" +" (вступает в силу после перезапуска %1)\n" +" (если локализация для вашего языка доступна)" #: rc_option_editor.cc:1812 msgid "Keyboard" @@ -9323,7 +9392,8 @@ msgstr "Следуют порядку редактора" #: rc_option_editor.cc:1838 rc_option_editor.cc:1846 rc_option_editor.cc:1856 #: rc_option_editor.cc:1877 rc_option_editor.cc:1886 rc_option_editor.cc:1894 -#: rc_option_editor.cc:1908 rc_option_editor.cc:1925 +#: rc_option_editor.cc:1908 rc_option_editor.cc:1927 rc_option_editor.cc:1943 +#: rc_option_editor.cc:1957 msgid "Preferences|GUI" msgstr "Интерфейс" @@ -9341,7 +9411,7 @@ msgstr "Интерфейс" #: rc_option_editor.cc:1862 msgid "update transport clock display every 40ms instead of every 100ms" -msgstr "" +msgstr "Обновлять счётчик транспорта каждые 40мс вместо каждых 100мс" #: rc_option_editor.cc:1879 msgid "Mixer Strip" @@ -9352,14 +9422,14 @@ msgid "Use narrow strips in the mixer by default" msgstr "Использовать тонкие полоски в микшере по умолчанию" #: rc_option_editor.cc:1898 -msgid "Meter hold time" -msgstr "Задержка индикатора" +msgid "Peak hold time" +msgstr "Удерживание пика" #: rc_option_editor.cc:1904 msgid "short" msgstr "Короткое" -#: rc_option_editor.cc:1905 rc_option_editor.cc:1920 +#: rc_option_editor.cc:1905 msgid "medium" msgstr "Среднее" @@ -9368,28 +9438,74 @@ msgid "long" msgstr "Долгое" #: rc_option_editor.cc:1912 -msgid "Meter fall-off" -msgstr "Спадание индикатора" +msgid "DPM fall-off" +msgstr "Скорость спадания" #: rc_option_editor.cc:1918 -msgid "slowest" -msgstr "Самое медленное" +msgid "slowest [6.6dB/sec]" +msgstr "Самое медленное [6,6 Дб/с]" #: rc_option_editor.cc:1919 -msgid "slow" -msgstr "Медленное" +msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)" +msgstr "Медленное [8,6 Дб/с] (BBC PPM, EBU PPM)" + +#: rc_option_editor.cc:1920 +msgid "slowish [12.0dB/sec] (DIN)" +msgstr "Неторопливое [12 Дб/с] (DIN)" #: rc_option_editor.cc:1921 -msgid "fast" -msgstr "Быстрое" +msgid "moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)" +msgstr "Умеренное [13,3 Дб/с] (EBU Digi PPM, IRT Digi PPM)" #: rc_option_editor.cc:1922 -msgid "faster" -msgstr "Ещё более быстрее" +msgid "medium [20dB/sec]" +msgstr "Среднее [20 Дб/с]" #: rc_option_editor.cc:1923 -msgid "fastest" -msgstr "Скорейшее" +msgid "fast [32dB/sec]" +msgstr "Быстрое [32 Дб/с]" + +#: rc_option_editor.cc:1924 +msgid "faster [46dB/sec]" +msgstr "Ещё быстрее [46 Дб/с]" + +#: rc_option_editor.cc:1925 +msgid "fastest [70dB/sec]" +msgstr "Самое быстрое [70 Дб/с]" + +#: rc_option_editor.cc:1931 +msgid "Meter line-up level" +msgstr "Уровень выравнивания" + +#: rc_option_editor.cc:1936 +msgid "-24dB" +msgstr "-24 Дб" + +#: rc_option_editor.cc:1937 +msgid "-20dB (SMPTE)" +msgstr "-20 Дб (SMPTE)" + +#: rc_option_editor.cc:1938 +msgid "-18dB (EBU)" +msgstr "-18 Дб (EBU)" + +#: rc_option_editor.cc:1939 +msgid "-15dB" +msgstr "-15 Дб" + +#: rc_option_editor.cc:1941 +msgid "Configure meter-ticks and color-knee point." +msgstr "" + +#: rc_option_editor.cc:1947 +msgid "Peak threshold [dBFS]" +msgstr "Порог пика (dbFS)" + +#: rc_option_editor.cc:1955 +msgid "" +"Specify the audio signal level in dbFS at and above which the meter-peak " +"indicator will flash red." +msgstr "" #: region_editor.cc:79 msgid "audition this region" @@ -9403,7 +9519,7 @@ msgstr "Позиция:" msgid "End:" msgstr "Конец:" -#: region_editor.cc:92 sfdb_ui.cc:140 +#: region_editor.cc:92 sfdb_ui.cc:141 msgid "Length:" msgstr "Длительность:" @@ -9427,23 +9543,23 @@ msgstr "Источники:" msgid "Source:" msgstr "Источник:" -#: region_editor.cc:167 +#: region_editor.cc:166 msgid "Region '%1'" msgstr "Область %1" -#: region_editor.cc:274 +#: region_editor.cc:273 msgid "change region start position" msgstr "смена позиции начала области" -#: region_editor.cc:290 +#: region_editor.cc:289 msgid "change region end position" msgstr "смена позиции конца области" -#: region_editor.cc:310 +#: region_editor.cc:309 msgid "change region length" msgstr "смена длительности области" -#: region_editor.cc:404 region_editor.cc:416 +#: region_editor.cc:403 region_editor.cc:415 msgid "change region sync point" msgstr "смена синхронизатора областей" @@ -9651,198 +9767,197 @@ msgstr "Выходы" msgid "Plugins, Inserts & Sends" msgstr "Модули, возвраты и посылы" -#: route_params_ui.cc:211 +#: route_params_ui.cc:207 msgid "route display list item for renamed route not found!" msgstr "" -#: route_params_ui.cc:258 route_params_ui.cc:286 +#: route_params_ui.cc:254 route_params_ui.cc:282 #, c-format msgid "Playback delay: % samples" msgstr "Задержка воспроизведения: % сэмплов" -#: route_params_ui.cc:478 +#: route_params_ui.cc:474 msgid "NO TRACK" msgstr "НЕТ ДОРОЖЕК" -#: route_params_ui.cc:611 route_params_ui.cc:612 +#: route_params_ui.cc:607 route_params_ui.cc:608 msgid "No Track or Bus Selected" msgstr "Нет выбранных дорожек или шин" -#: route_time_axis.cc:96 +#: route_time_axis.cc:97 msgid "g" msgstr "г" -#: route_time_axis.cc:97 +#: route_time_axis.cc:98 msgid "p" msgstr "сп" -#: route_time_axis.cc:98 +#: route_time_axis.cc:99 msgid "a" msgstr "а" -#: route_time_axis.cc:168 +#: route_time_axis.cc:173 msgid "Record (Right-click for Step Edit)" msgstr "Запись (правая клавиша мыши активирует пошаговый ввод)" -#: route_time_axis.cc:171 +#: route_time_axis.cc:176 msgid "Record" msgstr "Запись" -#: route_time_axis.cc:201 +#: route_time_axis.cc:210 msgid "Route Group" msgstr "Группа маршрутизации" -#: route_time_axis.cc:204 +#: route_time_axis.cc:213 msgid "MIDI Controllers and Automation" msgstr "MIDI-контроллеры и автоматизация" -#: route_time_axis.cc:381 +#: route_time_axis.cc:390 msgid "Show All Automation" msgstr "Показать всю автоматизацию" -#: route_time_axis.cc:384 +#: route_time_axis.cc:393 msgid "Show Existing Automation" msgstr "Показать существующую автоматизацию" -#: route_time_axis.cc:387 +#: route_time_axis.cc:396 msgid "Hide All Automation" msgstr "Скрыть всю автоматизацию" -#: route_time_axis.cc:396 -#, fuzzy +#: route_time_axis.cc:405 msgid "Processor automation" -msgstr "Очистить автоматизацию" +msgstr "Автоматизация обработчика" -#: route_time_axis.cc:415 +#: route_time_axis.cc:424 msgid "Color..." msgstr "Цвет..." -#: route_time_axis.cc:472 +#: route_time_axis.cc:481 msgid "Overlaid" msgstr "Перекрывают друг друга" -#: route_time_axis.cc:478 +#: route_time_axis.cc:487 msgid "Stacked" msgstr "В стопке" -#: route_time_axis.cc:486 +#: route_time_axis.cc:495 msgid "Layers" msgstr "Слои" -#: route_time_axis.cc:555 +#: route_time_axis.cc:564 msgid "Automatic (based on I/O connections)" msgstr "Автоматическое (по соединениям входа-выхода)" -#: route_time_axis.cc:564 +#: route_time_axis.cc:573 msgid "(Currently: Existing Material)" msgstr "(Сейчас: с записанным материалом)" -#: route_time_axis.cc:567 +#: route_time_axis.cc:576 msgid "(Currently: Capture Time)" msgstr "(Сейчас: по времени захвата)" -#: route_time_axis.cc:575 +#: route_time_axis.cc:584 msgid "Align With Existing Material" msgstr "С записанным материалом" -#: route_time_axis.cc:580 +#: route_time_axis.cc:589 msgid "Align With Capture Time" msgstr "По времени захвата" -#: route_time_axis.cc:585 +#: route_time_axis.cc:594 msgid "Alignment" msgstr "Выравнивание" -#: route_time_axis.cc:620 +#: route_time_axis.cc:629 msgid "Normal Mode" msgstr "Обычный режим" -#: route_time_axis.cc:626 +#: route_time_axis.cc:635 msgid "Tape Mode" msgstr "Плёночный режим" -#: route_time_axis.cc:632 +#: route_time_axis.cc:641 msgid "Non-Layered Mode" msgstr "Бесслойный режим" -#: route_time_axis.cc:645 route_time_axis.cc:1587 +#: route_time_axis.cc:654 route_time_axis.cc:1601 msgid "Playlist" msgstr "Список" -#: route_time_axis.cc:965 +#: route_time_axis.cc:979 msgid "Rename Playlist" msgstr "Переименовать список воспроизведения" -#: route_time_axis.cc:966 +#: route_time_axis.cc:980 msgid "New name for playlist:" msgstr "Новое название списка воспроизведения:" -#: route_time_axis.cc:1051 +#: route_time_axis.cc:1065 msgid "New Copy Playlist" msgstr "Новая копия списка воспроизведения" -#: route_time_axis.cc:1052 route_time_axis.cc:1105 +#: route_time_axis.cc:1066 route_time_axis.cc:1119 msgid "Name for new playlist:" msgstr "Название нового списка воспроизведения:" -#: route_time_axis.cc:1104 +#: route_time_axis.cc:1118 msgid "New Playlist" msgstr "Новый список воспроизведения" -#: route_time_axis.cc:1295 +#: route_time_axis.cc:1309 msgid "You cannot create a track with that name as it is reserved for %1" msgstr "" "Вы не можете добавить дорожку с названием, которое зарезервировано для %1" -#: route_time_axis.cc:1476 +#: route_time_axis.cc:1490 msgid "New Copy..." msgstr "Создать копию..." -#: route_time_axis.cc:1480 +#: route_time_axis.cc:1494 msgid "New Take" msgstr "Новый дубль" -#: route_time_axis.cc:1481 +#: route_time_axis.cc:1495 msgid "Copy Take" msgstr "Скопировать дубль" -#: route_time_axis.cc:1486 +#: route_time_axis.cc:1500 msgid "Clear Current" msgstr "Очистить текущий" -#: route_time_axis.cc:1489 +#: route_time_axis.cc:1503 msgid "Select From All..." msgstr "Выбрать из всех..." -#: route_time_axis.cc:1577 +#: route_time_axis.cc:1591 msgid "Take: %1.%2" msgstr "Дубль: %1.%2" -#: route_time_axis.cc:2267 +#: route_time_axis.cc:2291 msgid "Underlays" msgstr "" -#: route_time_axis.cc:2270 +#: route_time_axis.cc:2294 msgid "Remove \"%1\"" msgstr "Удалить «%1»" -#: route_time_axis.cc:2320 route_time_axis.cc:2357 +#: route_time_axis.cc:2344 route_time_axis.cc:2381 msgid "programming error: underlay reference pointer pairs are inconsistent!" msgstr "" -#: route_time_axis.cc:2388 +#: route_time_axis.cc:2408 msgid "After-fade listen (AFL)" msgstr "Прослушивание после фейдера (AFL)" -#: route_time_axis.cc:2392 +#: route_time_axis.cc:2412 msgid "Pre-fade listen (PFL)" msgstr "Прослушивание до фейдера (PFL)" -#: route_time_axis.cc:2396 +#: route_time_axis.cc:2416 msgid "s" msgstr "с" -#: route_time_axis.cc:2400 +#: route_time_axis.cc:2419 msgid "m" msgstr "м" @@ -10397,6 +10512,7 @@ msgid "" "Use Video File's FPS Instead of Timecode Value for Timeline and Video " "Monitor." msgstr "" +"Использовать частоту кадров видео вместо таймкода в проекте и видеомониторе" #: session_option_editor.cc:91 msgid "" @@ -10576,155 +10692,207 @@ msgstr "Приклеивать новые маркеры к тактам и до msgid "Glue new regions to bars and beats" msgstr "Приклеивать новые области к тактам и долям" -#: sfdb_ui.cc:87 sfdb_ui.cc:107 sfdb_ui.cc:116 +#: session_option_editor.cc:275 session_option_editor.cc:277 +#: session_option_editor.cc:284 session_option_editor.cc:291 +#: session_option_editor.cc:298 session_option_editor.cc:300 +#: session_option_editor.cc:307 session_option_editor.cc:314 +#: session_option_editor.cc:321 session_option_editor.cc:323 +msgid "Meterbridge" +msgstr "Панель индикаторов" + +#: session_option_editor.cc:275 +msgid "Route Display" +msgstr "Показывать в маршрутизации" + +#: session_option_editor.cc:279 +msgid "Show Midi Tracks" +msgstr "MIDI-дорожки" + +#: session_option_editor.cc:286 +msgid "Show Busses" +msgstr "Шины" + +#: session_option_editor.cc:293 +msgid "Include Master Bus" +msgstr "Мастер-шина" + +#: session_option_editor.cc:298 +msgid "Button Area" +msgstr "Показывать в кнопках" + +#: session_option_editor.cc:302 +msgid "Rec-enable Button" +msgstr "Переключатель записываемости" + +#: session_option_editor.cc:309 +msgid "Mute Button" +msgstr "Переключатель приглушения" + +#: session_option_editor.cc:316 +msgid "Solo Button" +msgstr "Переключатель солирования" + +#: session_option_editor.cc:321 +msgid "Name Labels" +msgstr "Показывать в метках имён" + +#: session_option_editor.cc:325 +msgid "Track Name" +msgstr "Название дорожи" + +#: sfdb_ui.cc:88 sfdb_ui.cc:108 sfdb_ui.cc:117 msgid "as new tracks" msgstr "как новые дорожки" -#: sfdb_ui.cc:89 sfdb_ui.cc:109 +#: sfdb_ui.cc:90 sfdb_ui.cc:110 msgid "to selected tracks" msgstr "в выделенные дорожки" -#: sfdb_ui.cc:91 sfdb_ui.cc:111 +#: sfdb_ui.cc:92 sfdb_ui.cc:112 msgid "to region list" msgstr "в список областей" -#: sfdb_ui.cc:93 sfdb_ui.cc:113 +#: sfdb_ui.cc:94 sfdb_ui.cc:114 msgid "as new tape tracks" msgstr "как новые плёночные дорожки" -#: sfdb_ui.cc:97 +#: sfdb_ui.cc:98 msgid "programming error: unknown import mode string %1" msgstr "Ошибка в программе: неизвестная строка режима импорта %1" -#: sfdb_ui.cc:124 +#: sfdb_ui.cc:125 msgid "Auto-play" msgstr "Автовоспр." -#: sfdb_ui.cc:130 sfdb_ui.cc:237 +#: sfdb_ui.cc:131 sfdb_ui.cc:238 msgid "Sound File Information" msgstr "Информация о файле" -#: sfdb_ui.cc:142 +#: sfdb_ui.cc:143 msgid "Timestamp:" msgstr "Отметка времени:" -#: sfdb_ui.cc:144 +#: sfdb_ui.cc:145 msgid "Format:" msgstr "Формат:" -#: sfdb_ui.cc:183 sfdb_ui.cc:530 +#: sfdb_ui.cc:184 sfdb_ui.cc:529 msgid "Tags:" msgstr "Метки:" -#: sfdb_ui.cc:320 +#: sfdb_ui.cc:321 msgid "Auditioning of MIDI files is not yet supported" msgstr "Прослушивание файлов MIDI пока что не реализовано" -#: sfdb_ui.cc:327 +#: sfdb_ui.cc:328 msgid "Could not read file: %1 (%2)." msgstr "Не удалось прочитать файл: %1 (%2)" -#: sfdb_ui.cc:349 +#: sfdb_ui.cc:350 msgid "Could not access soundfile: " msgstr "Файл недоступен: " -#: sfdb_ui.cc:403 +#: sfdb_ui.cc:404 msgid "SoundFileBox: Could not tokenize string: " msgstr "" -#: sfdb_ui.cc:423 sfdb_ui.cc:425 +#: sfdb_ui.cc:424 sfdb_ui.cc:426 msgid "Search" msgstr "Искать" -#: sfdb_ui.cc:449 +#: sfdb_ui.cc:450 msgid "Audio and MIDI files" msgstr "Звуковые и MIDI-файлы" -#: sfdb_ui.cc:452 +#: sfdb_ui.cc:453 msgid "Audio files" msgstr "Звуковые файлы" -#: sfdb_ui.cc:455 +#: sfdb_ui.cc:456 msgid "MIDI files" msgstr "Файлы MIDI" -#: sfdb_ui.cc:458 add_video_dialog.cc:131 +#: sfdb_ui.cc:459 add_video_dialog.cc:131 msgid "All files" msgstr "Все файлы" -#: sfdb_ui.cc:477 add_video_dialog.cc:142 +#: sfdb_ui.cc:478 add_video_dialog.cc:142 msgid "Browse Files" msgstr "Обзор файлов" -#: sfdb_ui.cc:506 +#: sfdb_ui.cc:507 msgid "Paths" msgstr "Расположения" -#: sfdb_ui.cc:517 +#: sfdb_ui.cc:516 msgid "Search Tags" msgstr "Поиск по меткам" -#: sfdb_ui.cc:535 +#: sfdb_ui.cc:534 msgid "Sort:" msgstr "Критерий сортировки:" -#: sfdb_ui.cc:543 +#: sfdb_ui.cc:542 msgid "Longest" msgstr "Более длинные" -#: sfdb_ui.cc:544 +#: sfdb_ui.cc:543 msgid "Shortest" msgstr "Более короткие" -#: sfdb_ui.cc:545 +#: sfdb_ui.cc:544 msgid "Newest" msgstr "Более новые" -#: sfdb_ui.cc:546 +#: sfdb_ui.cc:545 msgid "Oldest" msgstr "Более старые" -#: sfdb_ui.cc:547 +#: sfdb_ui.cc:546 msgid "Most downloaded" msgstr "Чаще скачиваемые" -#: sfdb_ui.cc:548 +#: sfdb_ui.cc:547 msgid "Least downloaded" msgstr "Реже скачиваемые" -#: sfdb_ui.cc:549 +#: sfdb_ui.cc:548 msgid "Highest rated" msgstr "Выше оценённые" -#: sfdb_ui.cc:550 +#: sfdb_ui.cc:549 msgid "Lowest rated" msgstr "Ниже оценённые" -#: sfdb_ui.cc:555 +#: sfdb_ui.cc:554 msgid "More" msgstr "" -#: sfdb_ui.cc:572 +#: sfdb_ui.cc:558 +msgid "Similar" +msgstr "" + +#: sfdb_ui.cc:570 msgid "ID" msgstr "ID" -#: sfdb_ui.cc:573 add_video_dialog.cc:83 +#: sfdb_ui.cc:571 add_video_dialog.cc:83 msgid "Filename" msgstr "Имя файла" -#: sfdb_ui.cc:575 +#: sfdb_ui.cc:573 msgid "Duration" msgstr "Длительность" -#: sfdb_ui.cc:576 +#: sfdb_ui.cc:574 msgid "Size" msgstr "Размер" -#: sfdb_ui.cc:577 +#: sfdb_ui.cc:575 msgid "Samplerate" msgstr "Частота сэмплирования" -#: sfdb_ui.cc:578 +#: sfdb_ui.cc:576 msgid "License" msgstr "Лицензия" @@ -10745,88 +10913,70 @@ msgstr "" msgid "Press to close this window without importing any files" msgstr "Нажмите, чтобы закрыть это окно, ничего не импортируя" -#: sfdb_ui.cc:846 -msgid "found %1 match" -msgid_plural "found %1 matches" -msgstr[0] "Найдено %1 совпадение" -msgstr[1] "Найдено %1 совпадения" -msgstr[2] "Найдено %1 совпадений" - -#: sfdb_ui.cc:862 +#: sfdb_ui.cc:813 msgid "SoundFileBrowser: Could not tokenize string: " msgstr "" -#: sfdb_ui.cc:960 +#: sfdb_ui.cc:1013 msgid "%1 more page of 100 results available" msgid_plural "%1 more pages of 100 results available" msgstr[0] "Ещё %1 страница из 100 доступных" msgstr[1] "Ещё %1 страницы из 100 доступных" msgstr[2] "Ещё %1 страниц из 100 доступных" -#: sfdb_ui.cc:965 +#: sfdb_ui.cc:1018 msgid "No more results available" msgstr "Больше результатов нет" -#: sfdb_ui.cc:1029 +#: sfdb_ui.cc:1082 msgid "B" msgstr "Б" -#: sfdb_ui.cc:1031 +#: sfdb_ui.cc:1084 msgid "kB" msgstr "КБ" -#: sfdb_ui.cc:1033 sfdb_ui.cc:1035 +#: sfdb_ui.cc:1086 sfdb_ui.cc:1088 msgid "MB" msgstr "МБ" -#: sfdb_ui.cc:1037 +#: sfdb_ui.cc:1090 msgid "GB" msgstr "ГБ" -#: sfdb_ui.cc:1070 -msgid "Search returned no results." -msgstr "" - -#: sfdb_ui.cc:1072 -msgid "Found %1 match" -msgid_plural "Found %1 matches" -msgstr[0] "Найдено %1 совпадение" -msgstr[1] "Найдено %1 совпадения" -msgstr[2] "Найдено %1 совпадений" - -#: sfdb_ui.cc:1277 sfdb_ui.cc:1585 sfdb_ui.cc:1635 sfdb_ui.cc:1653 +#: sfdb_ui.cc:1304 sfdb_ui.cc:1612 sfdb_ui.cc:1662 sfdb_ui.cc:1680 msgid "one track per file" msgstr "Одна дорожка на файл" -#: sfdb_ui.cc:1280 sfdb_ui.cc:1636 sfdb_ui.cc:1654 +#: sfdb_ui.cc:1307 sfdb_ui.cc:1663 sfdb_ui.cc:1681 msgid "one track per channel" msgstr "Одна дорожка на канал" -#: sfdb_ui.cc:1288 sfdb_ui.cc:1638 sfdb_ui.cc:1655 +#: sfdb_ui.cc:1315 sfdb_ui.cc:1665 sfdb_ui.cc:1682 msgid "sequence files" msgstr "" -#: sfdb_ui.cc:1291 sfdb_ui.cc:1643 +#: sfdb_ui.cc:1318 sfdb_ui.cc:1670 msgid "all files in one track" msgstr "Все файлы в одну дорожку" -#: sfdb_ui.cc:1292 sfdb_ui.cc:1637 +#: sfdb_ui.cc:1319 sfdb_ui.cc:1664 msgid "merge files" msgstr "Объединить файлы" -#: sfdb_ui.cc:1298 sfdb_ui.cc:1640 +#: sfdb_ui.cc:1325 sfdb_ui.cc:1667 msgid "one region per file" msgstr "Одна область на файл" -#: sfdb_ui.cc:1301 sfdb_ui.cc:1641 +#: sfdb_ui.cc:1328 sfdb_ui.cc:1668 msgid "one region per channel" msgstr "Одна область на канал" -#: sfdb_ui.cc:1306 sfdb_ui.cc:1642 sfdb_ui.cc:1656 +#: sfdb_ui.cc:1333 sfdb_ui.cc:1669 sfdb_ui.cc:1683 msgid "all files in one region" msgstr "Все файлы в одной области" -#: sfdb_ui.cc:1373 +#: sfdb_ui.cc:1400 msgid "" "One or more of the selected files\n" "cannot be used by %1" @@ -10834,55 +10984,55 @@ msgstr "" "Один или более выбранных файлов\n" "не могут быть использованы в %1" -#: sfdb_ui.cc:1513 +#: sfdb_ui.cc:1540 msgid "Copy files to session" msgstr "Скопировать файлы в сеанс" -#: sfdb_ui.cc:1530 sfdb_ui.cc:1693 +#: sfdb_ui.cc:1557 sfdb_ui.cc:1720 msgid "file timestamp" msgstr "По отметке времени файла" -#: sfdb_ui.cc:1531 sfdb_ui.cc:1695 +#: sfdb_ui.cc:1558 sfdb_ui.cc:1722 msgid "edit point" msgstr "По курсору редактора" -#: sfdb_ui.cc:1532 sfdb_ui.cc:1697 +#: sfdb_ui.cc:1559 sfdb_ui.cc:1724 msgid "playhead" msgstr "По указателю воспр." -#: sfdb_ui.cc:1533 +#: sfdb_ui.cc:1560 msgid "session start" msgstr "В начало сеанса" -#: sfdb_ui.cc:1538 +#: sfdb_ui.cc:1565 msgid "Add files as ..." msgstr "Добавить файлы как..." -#: sfdb_ui.cc:1560 +#: sfdb_ui.cc:1587 msgid "Insert at" msgstr "Куда вставить" -#: sfdb_ui.cc:1573 +#: sfdb_ui.cc:1600 msgid "Mapping" msgstr "Способ вставки" -#: sfdb_ui.cc:1591 +#: sfdb_ui.cc:1618 msgid "Conversion quality" msgstr "Качество преобразования:" -#: sfdb_ui.cc:1603 sfdb_ui.cc:1709 +#: sfdb_ui.cc:1630 sfdb_ui.cc:1736 msgid "Best" msgstr "Наилучшее" -#: sfdb_ui.cc:1604 sfdb_ui.cc:1711 +#: sfdb_ui.cc:1631 sfdb_ui.cc:1738 msgid "Good" msgstr "Хорошее" -#: sfdb_ui.cc:1605 sfdb_ui.cc:1713 +#: sfdb_ui.cc:1632 sfdb_ui.cc:1740 msgid "Quick" msgstr "Быстрое" -#: sfdb_ui.cc:1607 +#: sfdb_ui.cc:1634 msgid "Fastest" msgstr "Быстрее всего" @@ -11148,10 +11298,6 @@ msgstr "" msgid "Click to open the program website in your web browser" msgstr "" -#: startup.cc:594 -msgid "What would you like to do ?" -msgstr "Что вы хотите сделать?" - #: startup.cc:729 msgid "Open" msgstr "Открыть" @@ -11764,7 +11910,7 @@ msgstr "Рисовать кнопки плоскими" #: theme_manager.cc:61 msgid "All floating windows are dialogs" -msgstr "" +msgstr "Все плавающие окна являются диалогами" #: theme_manager.cc:62 msgid "Draw waveforms with color gradient" @@ -11977,7 +12123,7 @@ msgstr "Соотношение сторон:" msgid " %1 fps" msgstr " %1 к/с" -#: editor_videotimeline.cc:138 +#: editor_videotimeline.cc:146 msgid "Export Successful: %1" msgstr "Экспорт успешно завершён: %1" @@ -12049,7 +12195,7 @@ msgstr "Файл вывода:" #: transcode_video_dialog.cc:60 export_video_dialog.cc:72 msgid "Abort" -msgstr "" +msgstr "Прервать" #: transcode_video_dialog.cc:62 msgid "Height = " @@ -12061,7 +12207,7 @@ msgstr "" #: transcode_video_dialog.cc:69 msgid "Debug Mode: Print ffmpeg Command and Output to stdout." -msgstr "" +msgstr "Режим отладки: вывод команд ffmpeg в stdout" #: transcode_video_dialog.cc:106 msgid "File Information" @@ -12097,9 +12243,8 @@ msgid "Geometry:" msgstr "Геометрия:" #: transcode_video_dialog.cc:154 -#, fuzzy msgid "??" -msgstr "???" +msgstr "" #: transcode_video_dialog.cc:175 msgid "Import Settings" @@ -12111,7 +12256,7 @@ msgstr "Не импортировать видео" #: transcode_video_dialog.cc:181 msgid "Reference From Current Location" -msgstr "" +msgstr "Использовать исходный видеофайл" #: transcode_video_dialog.cc:183 msgid "Import/Transcode Video to Session" @@ -12143,7 +12288,7 @@ msgstr "Не удалось извлечь звуковую дорожку." #: transcode_video_dialog.cc:373 msgid "Transcoding Video.." -msgstr "" +msgstr "Перекодирование видео..." #: transcode_video_dialog.cc:407 msgid "Transcoding Failed." @@ -12162,9 +12307,8 @@ msgid "Server Executable:" msgstr "Исполняемый файл сервера:" #: video_server_dialog.cc:45 -#, fuzzy msgid "Server Docroot:" -msgstr "Сервер:" +msgstr "" #: video_server_dialog.cc:51 msgid "Don't show this dialog again. (Reset in Edit->Preferences)." @@ -12223,14 +12367,12 @@ msgid "Confirm Overwrite" msgstr "Подтвердите перезапись" #: utils_videotl.cc:63 -#, fuzzy msgid "A file with the same name already exists. Do you want to overwrite it?" msgstr "Снимок с таким названием уже есть. Перезаписать его?" #: utils_videotl.cc:73 utils_videotl.cc:89 -#, fuzzy msgid "Cannot create video folder \"%1\" (%2)" -msgstr "Не удалось создать пользовательскую папку %3: %1 (%2)" +msgstr "Не удалось создать папку для видео: \"%1\" (%2)" #: export_video_dialog.cc:65 msgid "Export Video File " @@ -12261,9 +12403,8 @@ msgid "Codec Optimizations:" msgstr "Оптимизация кодека:" #: export_video_dialog.cc:83 -#, fuzzy msgid "Deinterlace" -msgstr "Указатель по центру" +msgstr "" #: export_video_dialog.cc:84 msgid "Use [2] B-frames (MPEG 2 or 4 only)" @@ -12316,81 +12457,81 @@ msgstr "от 00:00:00:00 до конца видео" msgid "from the video's start to the video's end" msgstr "от начала до конца видео" -#: export_video_dialog.cc:166 +#: export_video_dialog.cc:183 msgid "Settings:" msgstr "Параметры:" -#: export_video_dialog.cc:174 +#: export_video_dialog.cc:191 msgid "Range:" msgstr "Диапазон:" -#: export_video_dialog.cc:177 +#: export_video_dialog.cc:194 msgid "Preset:" msgstr "Профиль:" -#: export_video_dialog.cc:180 +#: export_video_dialog.cc:197 msgid "Video Codec:" msgstr "Видеокодек:" -#: export_video_dialog.cc:183 +#: export_video_dialog.cc:200 msgid "Video KBit/s:" msgstr "Скорость видеопотока (Кбит/с):" -#: export_video_dialog.cc:186 +#: export_video_dialog.cc:203 msgid "Audio Codec:" msgstr "Звуковой кодек:" -#: export_video_dialog.cc:189 +#: export_video_dialog.cc:206 msgid "Audio KBit/s:" msgstr "Скорость звукового потока (Кбит/с):" -#: export_video_dialog.cc:192 +#: export_video_dialog.cc:209 msgid "Audio Samplerate:" msgstr "Частота сэмплирования звука:" -#: export_video_dialog.cc:369 +#: export_video_dialog.cc:386 msgid "Normalizing audio" msgstr "Выполняется нормировка звука" -#: export_video_dialog.cc:373 +#: export_video_dialog.cc:390 msgid "Exporting audio" -msgstr "" +msgstr "Экспорт звука" -#: export_video_dialog.cc:419 +#: export_video_dialog.cc:436 msgid "Exporting Audio..." msgstr "Экспортируется звук..." -#: export_video_dialog.cc:476 +#: export_video_dialog.cc:493 msgid "" "Export Video: Cannot query duration of video-file, using duration from " "timeline instead." msgstr "" -#: export_video_dialog.cc:505 +#: export_video_dialog.cc:522 msgid "Export Video: No Master Out Ports to Connect for Audio Export" msgstr "" -#: export_video_dialog.cc:544 +#: export_video_dialog.cc:561 msgid "Encoding Video..." msgstr "Кодируется видео..." -#: export_video_dialog.cc:563 +#: export_video_dialog.cc:580 msgid "Export Video: Video input file cannot be read." msgstr "" -#: export_video_dialog.cc:661 +#: export_video_dialog.cc:678 msgid "Encoding Video.. Pass 1/2" msgstr "Выполняется кодирование видео. Проход 1/2." -#: export_video_dialog.cc:673 +#: export_video_dialog.cc:690 msgid "Encoding Video.. Pass 2/2" msgstr "Выполняется кодирование видео. Проход 2/2." -#: export_video_dialog.cc:761 +#: export_video_dialog.cc:778 msgid "Transcoding failed." msgstr "Не удалось выполнить перекодировку." -#: export_video_dialog.cc:930 export_video_dialog.cc:950 +#: export_video_dialog.cc:947 export_video_dialog.cc:967 msgid "Save Exported Video File" msgstr "Сохранить экспортированный видеофайл" @@ -12404,34 +12545,49 @@ msgstr "" #: export_video_infobox.cc:43 msgid "Video Export Info" +msgstr "Справка по экспорту видео" + +#: export_video_infobox.cc:48 +msgid "" +"Video encoding is a non-trivial task with many details.\n" +"\n" +"Please see the manual at %1/video-timeline/operations/#export.\n" +"\n" +"Open Manual in Browser? " msgstr "" -#: export_video_infobox.cc:46 -msgid "" -"Ardour video export is not recommended for mastering!\n" -"While 'ffmpeg' (which is used by ardour) can produce high-quality files, " -"this export lacks the possibility to tweak many settings. We recommend to " -"use 'winff', 'devede' or 'dvdauthor' to mux & master. Nevertheless this " -"video-export comes in handy to do quick snapshots, intermediates, dailies or " -"online videos.\n" -"\n" -"The soundtrack is created from the master-bus of the current Ardour " -"session.\n" -"\n" -"The video soure defaults to the file used in the video timeline, which may " -"not the best quality to start with, you should the original video file.\n" -"\n" -"If the export-range is longer than the original video, black video frames " -"are prefixed and/or appended. This process may fail with non-standard pixel-" -"aspect-ratios.\n" -"\n" -"The file-format is determined by the extension that you choose for the " -"output file (.avi, .mov, .flv, .ogv,...)\n" -"Note: not all combinations of format+codec+settings produce files which are " -"according so spec. e.g. flv files require sample-rates of 22.1kHz or " -"44.1kHz, mpeg containers can not be used with ac3 audio-codec, etc. If in " -"doubt, use one of the built-in presets." -msgstr "" +#~ msgid "-Inf" +#~ msgstr "-Inf" + +#~ msgid "slowest" +#~ msgstr "Самое медленное" + +#~ msgid "slow" +#~ msgstr "Медленное" + +#~ msgid "fast" +#~ msgstr "Быстрое" + +#~ msgid "faster" +#~ msgstr "Ещё более быстрее" + +#~ msgid "fastest" +#~ msgstr "Скорейшее" + +#~ msgid "found %1 match" +#~ msgid_plural "found %1 matches" +#~ msgstr[0] "Найдено %1 совпадение" +#~ msgstr[1] "Найдено %1 совпадения" +#~ msgstr[2] "Найдено %1 совпадений" + +#~ msgid "Found %1 match" +#~ msgid_plural "Found %1 matches" +#~ msgstr[0] "Найдено %1 совпадение" +#~ msgstr[1] "Найдено %1 совпадения" +#~ msgstr[2] "Найдено %1 совпадений" + +#~ msgid "What would you like to do ?" +#~ msgstr "Что вы хотите сделать?" #~ msgid "Control surfaces" #~ msgstr "Устройства управления" @@ -14227,9 +14383,6 @@ msgstr "" #~ msgid "solo change" #~ msgstr "смена солирования" -#~ msgid "rec-enable change" -#~ msgstr "смена записываемости" - #~ msgid "Solo Lock" #~ msgstr "Запереть солирование" From 23bf9b11c64037bba655b66ee36301e63fe5bd0c Mon Sep 17 00:00:00 2001 From: "Michael R. Fisher" Date: Sun, 14 Jul 2013 21:06:25 -0500 Subject: [PATCH 026/221] Use a static string variable for dll path. Making this consistent with all other funtions in this file. --- libs/ardour/filesystem_paths.cc | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/libs/ardour/filesystem_paths.cc b/libs/ardour/filesystem_paths.cc index 73bfaff137..bea0e330b9 100644 --- a/libs/ardour/filesystem_paths.cc +++ b/libs/ardour/filesystem_paths.cc @@ -86,11 +86,14 @@ user_config_directory () std::string ardour_dll_directory () { - std::string s = Glib::getenv("ARDOUR_DLL_PATH"); + static std::string s; + if (s.empty()) { - std::cerr << _("ARDOUR_DLL_PATH not set in environment - exiting\n"); - ::exit (1); - } + s = Glib::getenv("ARDOUR_DLL_PATH"); + std::cerr << _("ARDOUR_DLL_PATH not set in environment - exiting\n"); + ::exit (1); + } + return s; } From 879bab6a5305ba48573d2ca8c08422350ead0269 Mon Sep 17 00:00:00 2001 From: "Michael R. Fisher" Date: Sun, 14 Jul 2013 21:16:08 -0500 Subject: [PATCH 027/221] Formatting only. --- libs/ardour/filesystem_paths.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libs/ardour/filesystem_paths.cc b/libs/ardour/filesystem_paths.cc index bea0e330b9..d3ec807e1c 100644 --- a/libs/ardour/filesystem_paths.cc +++ b/libs/ardour/filesystem_paths.cc @@ -89,10 +89,10 @@ ardour_dll_directory () static std::string s; if (s.empty()) { - s = Glib::getenv("ARDOUR_DLL_PATH"); - std::cerr << _("ARDOUR_DLL_PATH not set in environment - exiting\n"); - ::exit (1); - } + s = Glib::getenv("ARDOUR_DLL_PATH"); + std::cerr << _("ARDOUR_DLL_PATH not set in environment - exiting\n"); + ::exit (1); + } return s; } From e487814e9dc52b712d7c5cd242ce4fac76397b1a Mon Sep 17 00:00:00 2001 From: "Michael R. Fisher" Date: Sun, 14 Jul 2013 21:19:59 -0500 Subject: [PATCH 028/221] Lazily load bundled LV2 plugins in LV2PluginInfo::discover() - Do this instead of finding them in the static ctor of LV2World - Prevents usage of ARDOUR_DLL_PATH environment variable before it is set in main(...) --- libs/ardour/lv2_plugin.cc | 49 +++++++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 18 deletions(-) diff --git a/libs/ardour/lv2_plugin.cc b/libs/ardour/lv2_plugin.cc index d49f8412b7..6d4a71869f 100644 --- a/libs/ardour/lv2_plugin.cc +++ b/libs/ardour/lv2_plugin.cc @@ -112,6 +112,8 @@ public: LV2World (); ~LV2World (); + void load_bundled_plugins(); + LilvWorld* world; LilvNode* atom_AtomPort; @@ -140,6 +142,9 @@ public: LilvNode* time_Position; LilvNode* ui_GtkUI; LilvNode* ui_external; + +private: + bool _bundle_checked; }; static LV2World _world; @@ -1903,27 +1908,10 @@ static bool lv2_filter (const string& str, void *arg) LV2World::LV2World() : world(lilv_world_new()) + , _bundle_checked(false) { lilv_world_load_all(world); - cout << "Scanning folders for bundled LV2s: " << ARDOUR::lv2_bundled_search_path().to_string() << endl; - PathScanner scanner; - vector *plugin_objects = scanner (ARDOUR::lv2_bundled_search_path().to_string(), lv2_filter, 0, true, true); - if (plugin_objects) { - for ( vector::iterator x = plugin_objects->begin(); x != plugin_objects->end (); ++x) { -#ifdef WINDOWS - string uri = "file:///" + **x + "/"; -#else - string uri = "file://" + **x + "/"; -#endif - LilvNode *node = lilv_new_uri(world, uri.c_str()); - lilv_world_load_bundle(world, node); - lilv_node_free(node); - } - } - delete (plugin_objects); - - atom_AtomPort = lilv_new_uri(world, LV2_ATOM__AtomPort); atom_Chunk = lilv_new_uri(world, LV2_ATOM__Chunk); atom_Sequence = lilv_new_uri(world, LV2_ATOM__Sequence); @@ -1982,6 +1970,29 @@ LV2World::~LV2World() lilv_node_free(atom_AtomPort); } +void +LV2World::load_bundled_plugins() +{ + if (!_bundle_checked) { + cout << "Scanning folders for bundled LV2s: " << ARDOUR::lv2_bundled_search_path().to_string() << endl; + PathScanner scanner; + vector *plugin_objects = scanner (ARDOUR::lv2_bundled_search_path().to_string(), lv2_filter, 0, true, true); + if (plugin_objects) { + for ( vector::iterator x = plugin_objects->begin(); x != plugin_objects->end (); ++x) { +#ifdef WINDOWS + string uri = "file:///" + **x + "/"; +#else + string uri = "file://" + **x + "/"; +#endif + LilvNode *node = lilv_new_uri(world, uri.c_str()); + lilv_world_load_bundle(world, node); + lilv_node_free(node); + } + } + delete (plugin_objects); + } +} + LV2PluginInfo::LV2PluginInfo (const void* c_plugin) : _c_plugin(c_plugin) { @@ -2013,6 +2024,8 @@ LV2PluginInfo::load(Session& session) PluginInfoList* LV2PluginInfo::discover() { + _world.load_bundled_plugins(); + PluginInfoList* plugs = new PluginInfoList; const LilvPlugins* plugins = lilv_world_get_all_plugins(_world.world); From be44b3c37b572a02cb4607c0da4fb62791bb3dad Mon Sep 17 00:00:00 2001 From: "Michael R. Fisher" Date: Sun, 14 Jul 2013 21:22:34 -0500 Subject: [PATCH 029/221] set the flag true --- libs/ardour/lv2_plugin.cc | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/libs/ardour/lv2_plugin.cc b/libs/ardour/lv2_plugin.cc index 6d4a71869f..df33e6c38d 100644 --- a/libs/ardour/lv2_plugin.cc +++ b/libs/ardour/lv2_plugin.cc @@ -1980,16 +1980,18 @@ LV2World::load_bundled_plugins() if (plugin_objects) { for ( vector::iterator x = plugin_objects->begin(); x != plugin_objects->end (); ++x) { #ifdef WINDOWS - string uri = "file:///" + **x + "/"; + string uri = "file:///" + **x + "/"; #else - string uri = "file://" + **x + "/"; + string uri = "file://" + **x + "/"; #endif - LilvNode *node = lilv_new_uri(world, uri.c_str()); - lilv_world_load_bundle(world, node); - lilv_node_free(node); - } + LilvNode *node = lilv_new_uri(world, uri.c_str()); + lilv_world_load_bundle(world, node); + lilv_node_free(node); } + } delete (plugin_objects); + + _bundle_checked = true; } } From 453713178f88649455cc7bcad0087239a369aae6 Mon Sep 17 00:00:00 2001 From: "Michael R. Fisher" Date: Sun, 14 Jul 2013 21:40:20 -0500 Subject: [PATCH 030/221] Housekeeping --- libs/ardour/filesystem_paths.cc | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/libs/ardour/filesystem_paths.cc b/libs/ardour/filesystem_paths.cc index d3ec807e1c..73bfaff137 100644 --- a/libs/ardour/filesystem_paths.cc +++ b/libs/ardour/filesystem_paths.cc @@ -86,14 +86,11 @@ user_config_directory () std::string ardour_dll_directory () { - static std::string s; - + std::string s = Glib::getenv("ARDOUR_DLL_PATH"); if (s.empty()) { - s = Glib::getenv("ARDOUR_DLL_PATH"); std::cerr << _("ARDOUR_DLL_PATH not set in environment - exiting\n"); ::exit (1); - } - + } return s; } From 6908ad1053a42bf98bfc576e481424d6a4c073df Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Mon, 15 Jul 2013 15:04:20 +0200 Subject: [PATCH 031/221] move ardour meter globals into dedicated namespace (TODO meter_patters typedef) --- gtk2_ardour/gain_meter.cc | 1 + gtk2_ardour/meter_patterns.cc | 40 ++++++++++++++++++++--------------- gtk2_ardour/meter_patterns.h | 8 ++++--- gtk2_ardour/meter_strip.cc | 1 + gtk2_ardour/meterbridge.cc | 1 + gtk2_ardour/mixer_strip.cc | 1 + 6 files changed, 32 insertions(+), 20 deletions(-) diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc index 36ed5e918e..1148c6b889 100644 --- a/gtk2_ardour/gain_meter.cc +++ b/gtk2_ardour/gain_meter.cc @@ -60,6 +60,7 @@ using namespace Gtkmm2ext; using namespace Gtk; using namespace std; using Gtkmm2ext::Keyboard; +using namespace ArdourMeter; GainMeterBase::GainMeterBase (Session* s, bool horizontal, int fader_length, int fader_girth) : gain_adjustment (gain_to_slider_position_with_max (1.0, Config->get_max_gain()), 0.0, 1.0, 0.01, 0.1) diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index f749927e9a..cb5209d8ea 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -35,18 +35,27 @@ using namespace PBD; using namespace Gtk; using namespace Gtkmm2ext; using namespace std; - +using namespace ArdourMeter; static const int max_pattern_metric_size = 1026; -sigc::signal ResetAllPeakDisplays; -sigc::signal ResetRoutePeakDisplays; -sigc::signal ResetGroupPeakDisplays; -sigc::signal RedrawMetrics; +sigc::signal ArdourMeter::ResetAllPeakDisplays; +sigc::signal ArdourMeter::ResetRoutePeakDisplays; +sigc::signal ArdourMeter::ResetGroupPeakDisplays; +sigc::signal ArdourMeter::RedrawMetrics; -sigc::signal SetMeterTypeMulti; +sigc::signal ArdourMeter::SetMeterTypeMulti; -cairo_pattern_t* +namespace ArdourMeter { + typedef std::map TickPatterns; + typedef std::map MetricPatterns; +} + +static ArdourMeter::TickPatterns ticks_patterns; +static ArdourMeter::MetricPatterns metric_patterns; + + +static cairo_pattern_t* meter_render_ticks (Gtk::Widget& w, vector types) { Glib::RefPtr win (w.get_window()); @@ -195,7 +204,7 @@ meter_render_ticks (Gtk::Widget& w, vector types) } -cairo_pattern_t* +static cairo_pattern_t* meter_render_metrics (Gtk::Widget& w, vector types) { Glib::RefPtr win (w.get_window()); @@ -407,10 +416,8 @@ meter_render_metrics (Gtk::Widget& w, vector types) } -typedef std::map TickPatterns; -static TickPatterns ticks_patterns; - -gint meter_expose_ticks (GdkEventExpose *ev, std::vector types, Gtk::DrawingArea *mta) +gint +ArdourMeter::meter_expose_ticks (GdkEventExpose *ev, std::vector types, Gtk::DrawingArea *mta) { Glib::RefPtr win (mta->get_window()); cairo_t* cr; @@ -446,10 +453,8 @@ gint meter_expose_ticks (GdkEventExpose *ev, std::vector types return true; } -typedef std::map MetricPatterns; -static MetricPatterns metric_patterns; - -gint meter_expose_metrics (GdkEventExpose *ev, std::vector types, Gtk::DrawingArea *mma) +gint +ArdourMeter::meter_expose_metrics (GdkEventExpose *ev, std::vector types, Gtk::DrawingArea *mma) { Glib::RefPtr win (mma->get_window()); cairo_t* cr; @@ -485,7 +490,8 @@ gint meter_expose_metrics (GdkEventExpose *ev, std::vector typ return true; } -void meter_clear_pattern_cache(int which) { +void +ArdourMeter::meter_clear_pattern_cache(int which) { MetricPatterns::iterator i = metric_patterns.begin(); TickPatterns::iterator j = ticks_patterns.begin(); diff --git a/gtk2_ardour/meter_patterns.h b/gtk2_ardour/meter_patterns.h index a664f478f2..9ac8ce308a 100644 --- a/gtk2_ardour/meter_patterns.h +++ b/gtk2_ardour/meter_patterns.h @@ -27,6 +27,9 @@ #include "gtkmm2ext/cairo_widget.h" #include + +namespace ArdourMeter { + extern sigc::signal ResetAllPeakDisplays; extern sigc::signal ResetRoutePeakDisplays; extern sigc::signal ResetGroupPeakDisplays; @@ -34,13 +37,12 @@ extern sigc::signal RedrawMetrics; extern sigc::signal SetMeterTypeMulti; -cairo_pattern_t* meter_render_ticks (Gtk::Widget& w, std::vector types); -cairo_pattern_t* meter_render_metrics (Gtk::Widget& w, std::vector types); - gint meter_expose_ticks (GdkEventExpose *ev, std::vector types, Gtk::DrawingArea *mta); gint meter_expose_metrics (GdkEventExpose *ev, std::vector types, Gtk::DrawingArea *mma); void meter_clear_pattern_cache(int which=7); +} + #endif diff --git a/gtk2_ardour/meter_strip.cc b/gtk2_ardour/meter_strip.cc index 88a946585a..c5d32d6680 100644 --- a/gtk2_ardour/meter_strip.cc +++ b/gtk2_ardour/meter_strip.cc @@ -52,6 +52,7 @@ using namespace PBD; using namespace Gtk; using namespace Gtkmm2ext; using namespace std; +using namespace ArdourMeter; PBD::Signal1 MeterStrip::CatchDeletion; PBD::Signal0 MeterStrip::MetricChanged; diff --git a/gtk2_ardour/meterbridge.cc b/gtk2_ardour/meterbridge.cc index 24b21656d1..cdecb36c7c 100644 --- a/gtk2_ardour/meterbridge.cc +++ b/gtk2_ardour/meterbridge.cc @@ -62,6 +62,7 @@ using namespace Gtk; using namespace Glib; using namespace Gtkmm2ext; using namespace std; +using namespace ArdourMeter; using PBD::atoi; diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index 98b208f317..cd3185fcbf 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -71,6 +71,7 @@ using namespace PBD; using namespace Gtk; using namespace Gtkmm2ext; using namespace std; +using namespace ArdourMeter; int MixerStrip::scrollbar_height = 0; PBD::Signal1 MixerStrip::CatchDeletion; From 9b1d7fd2f7c9167d9d7b7aa3115497ab65747877 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Mon, 15 Jul 2013 14:38:24 +0200 Subject: [PATCH 032/221] simplify meter-type context menu in preparation for adding more meter-types --- gtk2_ardour/meter_patterns.cc | 15 +++++++++++++++ gtk2_ardour/meter_patterns.h | 2 ++ gtk2_ardour/meter_strip.cc | 19 +++++++++++-------- gtk2_ardour/mixer_strip.cc | 19 +++++++++++-------- 4 files changed, 39 insertions(+), 16 deletions(-) diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index cb5209d8ea..80655af7b9 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -54,6 +54,21 @@ namespace ArdourMeter { static ArdourMeter::TickPatterns ticks_patterns; static ArdourMeter::MetricPatterns metric_patterns; +const std::string +ArdourMeter::meter_type_string (ARDOUR::MeterType mt) +{ + switch (mt) { + case MeterPeak: + return _("Peak"); + break; + case MeterKrms: + return _("RMS + Peak"); + break; + default: + return _("???"); + break; + } +} static cairo_pattern_t* meter_render_ticks (Gtk::Widget& w, vector types) diff --git a/gtk2_ardour/meter_patterns.h b/gtk2_ardour/meter_patterns.h index 9ac8ce308a..90ef4ec980 100644 --- a/gtk2_ardour/meter_patterns.h +++ b/gtk2_ardour/meter_patterns.h @@ -42,6 +42,8 @@ gint meter_expose_metrics (GdkEventExpose *ev, std::vector typ void meter_clear_pattern_cache(int which=7); +const std::string meter_type_string (ARDOUR::MeterType); + } #endif diff --git a/gtk2_ardour/meter_strip.cc b/gtk2_ardour/meter_strip.cc index c5d32d6680..44144114a4 100644 --- a/gtk2_ardour/meter_strip.cc +++ b/gtk2_ardour/meter_strip.cc @@ -571,16 +571,19 @@ MeterStrip::popup_level_meter_menu (GdkEventButton* ev) RadioMenuItem::Group group; _suspend_menu_callbacks = true; - add_level_meter_item (items, group, _("Peak"), MeterPeak); - add_level_meter_item (items, group, _("RMS + Peak"), MeterKrms); + add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterPeak), MeterPeak); + add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterKrms), MeterKrms); + + MeterType cmt = _route->meter_type(); + const std::string cmn = ArdourMeter::meter_type_string(cmt); items.push_back (SeparatorElem()); - items.push_back (MenuElem (_("Change all in Group to Peak"), sigc::bind (SetMeterTypeMulti, -1, _route->route_group(), MeterPeak))); - items.push_back (MenuElem (_("Change all in Group to RMS + Peak"), sigc::bind (SetMeterTypeMulti, -1, _route->route_group(), MeterKrms))); - items.push_back (MenuElem (_("Change all to Peak"), sigc::bind (SetMeterTypeMulti, 0, _route->route_group(), MeterPeak))); - items.push_back (MenuElem (_("Change all to RMS + Peak"), sigc::bind (SetMeterTypeMulti, 0, _route->route_group(), MeterKrms))); - items.push_back (MenuElem (_("Change same track-type to Peak"), sigc::bind (SetMeterTypeMulti, _strip_type, _route->route_group(), MeterPeak))); - items.push_back (MenuElem (_("Change same track-type to RMS + Peak"), sigc::bind (SetMeterTypeMulti, _strip_type, _route->route_group(), MeterKrms))); + items.push_back (MenuElem (string_compose(_("Change all in Group to %1"), cmn), + sigc::bind (SetMeterTypeMulti, -1, _route->route_group(), cmt))); + items.push_back (MenuElem (string_compose(_("Change all to %1"), cmn), + sigc::bind (SetMeterTypeMulti, 0, _route->route_group(), cmt))); + items.push_back (MenuElem (string_compose(_("Change same track-type to %1"), cmn), + sigc::bind (SetMeterTypeMulti, _strip_type, _route->route_group(), cmt))); m->popup (ev->button, ev->time); _suspend_menu_callbacks = false; diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index cd3185fcbf..6128780cf0 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -2133,8 +2133,8 @@ MixerStrip::popup_level_meter_menu (GdkEventButton* ev) RadioMenuItem::Group tgroup; items.push_back (SeparatorElem()); - add_level_meter_item_type (items, tgroup, _("Peak"), MeterPeak); - add_level_meter_item_type (items, tgroup, _("RMS + Peak"), MeterKrms); + add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterPeak), MeterPeak); + add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterKrms), MeterKrms); int _strip_type; if (_route->is_master()) { @@ -2152,13 +2152,16 @@ MixerStrip::popup_level_meter_menu (GdkEventButton* ev) _strip_type = 1; } + MeterType cmt = _route->meter_type(); + const std::string cmn = ArdourMeter::meter_type_string(cmt); + items.push_back (SeparatorElem()); - items.push_back (MenuElem (_("Change all in Group to Peak"), sigc::bind (SetMeterTypeMulti, -1, _route->route_group(), MeterPeak))); - items.push_back (MenuElem (_("Change all in Group to RMS + Peak"), sigc::bind (SetMeterTypeMulti, -1, _route->route_group(), MeterKrms))); - items.push_back (MenuElem (_("Change all to Peak"), sigc::bind (SetMeterTypeMulti, 0, _route->route_group(), MeterPeak))); - items.push_back (MenuElem (_("Change all to RMS + Peak"), sigc::bind (SetMeterTypeMulti, 0, _route->route_group(), MeterKrms))); - items.push_back (MenuElem (_("Change same track-type to Peak"), sigc::bind (SetMeterTypeMulti, _strip_type, _route->route_group(), MeterPeak))); - items.push_back (MenuElem (_("Change same track-type to RMS + Peak"), sigc::bind (SetMeterTypeMulti, _strip_type, _route->route_group(), MeterKrms))); + items.push_back (MenuElem (string_compose(_("Change all in Group to %1"), cmn), + sigc::bind (SetMeterTypeMulti, -1, _route->route_group(), cmt))); + items.push_back (MenuElem (string_compose(_("Change all to %1"), cmn), + sigc::bind (SetMeterTypeMulti, 0, _route->route_group(), cmt))); + items.push_back (MenuElem (string_compose(_("Change same track-type to %1"), cmn), + sigc::bind (SetMeterTypeMulti, _strip_type, _route->route_group(), cmt))); m->popup (ev->button, ev->time); _suspend_menu_callbacks = false; From 80aa2574819e947668092c660d767e25a661c6f1 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Mon, 15 Jul 2013 15:00:22 +0200 Subject: [PATCH 033/221] add VU and IEC meter DSP (from jmeters) --- gtk2_ardour/meter_patterns.cc | 9 +++ gtk2_ardour/meter_strip.cc | 3 + gtk2_ardour/mixer_strip.cc | 3 + libs/ardour/ardour/iec1ppmdsp.h | 51 ++++++++++++++ libs/ardour/ardour/iec2ppmdsp.h | 51 ++++++++++++++ libs/ardour/{ => ardour}/kmeterdsp.h | 5 +- libs/ardour/ardour/meter.h | 10 ++- libs/ardour/ardour/types.h | 5 +- libs/ardour/ardour/vumeterdsp.h | 49 +++++++++++++ libs/ardour/iec1ppmdsp.cc | 100 +++++++++++++++++++++++++++ libs/ardour/iec2ppmdsp.cc | 100 +++++++++++++++++++++++++++ libs/ardour/kmeterdsp.cc | 23 +++--- libs/ardour/meter.cc | 93 ++++++++++++++++++++++--- libs/ardour/vumeterdsp.cc | 89 ++++++++++++++++++++++++ libs/ardour/wscript | 3 + 15 files changed, 567 insertions(+), 27 deletions(-) create mode 100644 libs/ardour/ardour/iec1ppmdsp.h create mode 100644 libs/ardour/ardour/iec2ppmdsp.h rename libs/ardour/{ => ardour}/kmeterdsp.h (95%) create mode 100644 libs/ardour/ardour/vumeterdsp.h create mode 100644 libs/ardour/iec1ppmdsp.cc create mode 100644 libs/ardour/iec2ppmdsp.cc create mode 100644 libs/ardour/vumeterdsp.cc diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index 80655af7b9..ccf24fcefc 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -64,6 +64,15 @@ ArdourMeter::meter_type_string (ARDOUR::MeterType mt) case MeterKrms: return _("RMS + Peak"); break; + case MeterIEC1: + return _("DIN"); + break; + case MeterIEC2: + return _("EBU/BBC"); + break; + case MeterVU: + return _("VU"); + break; default: return _("???"); break; diff --git a/gtk2_ardour/meter_strip.cc b/gtk2_ardour/meter_strip.cc index 44144114a4..3a8410867a 100644 --- a/gtk2_ardour/meter_strip.cc +++ b/gtk2_ardour/meter_strip.cc @@ -573,6 +573,9 @@ MeterStrip::popup_level_meter_menu (GdkEventButton* ev) _suspend_menu_callbacks = true; add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterPeak), MeterPeak); add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterKrms), MeterKrms); + add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterIEC1), MeterIEC1); + add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterIEC2), MeterIEC2); + add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterVU), MeterVU); MeterType cmt = _route->meter_type(); const std::string cmn = ArdourMeter::meter_type_string(cmt); diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index 6128780cf0..dec072b067 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -2135,6 +2135,9 @@ MixerStrip::popup_level_meter_menu (GdkEventButton* ev) add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterPeak), MeterPeak); add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterKrms), MeterKrms); + add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC1), MeterIEC1); + add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC2), MeterIEC2); + add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterVU), MeterVU); int _strip_type; if (_route->is_master()) { diff --git a/libs/ardour/ardour/iec1ppmdsp.h b/libs/ardour/ardour/iec1ppmdsp.h new file mode 100644 index 0000000000..58dea97555 --- /dev/null +++ b/libs/ardour/ardour/iec1ppmdsp.h @@ -0,0 +1,51 @@ +/* + Copyright (C) 2012 Fons Adriaensen + Adopted for Ardour 2013 by Robin Gareus + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef __IEC1PPMDSP_H +#define __IEC1PPMDSP_H + + +class Iec1ppmdsp +{ +public: + + Iec1ppmdsp (void); + ~Iec1ppmdsp (void); + + void process (float *p, int n); + float read (void); + void reset (); + + static void init (float fsamp); + +private: + + float _z1; // filter state + float _z2; // filter state + float _m; // max value since last read() + bool _res; // flag to reset m + + static float _w1; // attack filter coefficient + static float _w2; // attack filter coefficient + static float _w3; // release filter coefficient + static float _g; // gain factor +}; + + +#endif diff --git a/libs/ardour/ardour/iec2ppmdsp.h b/libs/ardour/ardour/iec2ppmdsp.h new file mode 100644 index 0000000000..3574a8bd3f --- /dev/null +++ b/libs/ardour/ardour/iec2ppmdsp.h @@ -0,0 +1,51 @@ +/* + Copyright (C) 2012 Fons Adriaensen + Adopted for Ardour 2013 by Robin Gareus + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef __IEC2PPMDSP_H +#define __IEC2PPMDSP_H + + +class Iec2ppmdsp +{ +public: + + Iec2ppmdsp (void); + ~Iec2ppmdsp (void); + + void process (float *p, int n); + float read (void); + void reset (); + + static void init (float fsamp); + +private: + + float _z1; // filter state + float _z2; // filter state + float _m; // max value since last read() + bool _res; // flag to reset m + + static float _w1; // attack filter coefficient + static float _w2; // attack filter coefficient + static float _w3; // release filter coefficient + static float _g; // gain factor +}; + + +#endif diff --git a/libs/ardour/kmeterdsp.h b/libs/ardour/ardour/kmeterdsp.h similarity index 95% rename from libs/ardour/kmeterdsp.h rename to libs/ardour/ardour/kmeterdsp.h index 9c2309e09c..eca3c76695 100644 --- a/libs/ardour/kmeterdsp.h +++ b/libs/ardour/ardour/kmeterdsp.h @@ -1,6 +1,6 @@ /* Copyright (C) 2008-2011 Fons Adriaensen - Adopted for Ardour 2013 by Robin Gareus + Adopted for Ardour 2013 by Robin Gareus This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -29,9 +29,10 @@ public: void process (float *p, int n); float read (); - static void init (int fsamp); void reset (); + static void init (int fsamp); + private: float _z1; // filter state diff --git a/libs/ardour/ardour/meter.h b/libs/ardour/ardour/meter.h index 31ebc76179..4ac140fd04 100644 --- a/libs/ardour/ardour/meter.h +++ b/libs/ardour/ardour/meter.h @@ -23,7 +23,11 @@ #include "ardour/types.h" #include "ardour/processor.h" #include "pbd/fastlog.h" -#include "kmeterdsp.h" + +#include "ardour/kmeterdsp.h" +#include "ardour/iec1ppmdsp.h" +#include "ardour/iec2ppmdsp.h" +#include "ardour/vumeterdsp.h" namespace ARDOUR { @@ -104,7 +108,11 @@ private: std::vector _visible_peak_power; std::vector _max_peak_signal; std::vector _max_peak_power; + std::vector _kmeter; + std::vector _iec1meter; + std::vector _iec2meter; + std::vector _vumeter; MeterType _meter_type; }; diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h index 05d6d0b27d..df7209b581 100644 --- a/libs/ardour/ardour/types.h +++ b/libs/ardour/ardour/types.h @@ -181,7 +181,10 @@ namespace ARDOUR { MeterMaxSignal = 0x01, MeterMaxPeak = 0x02, MeterPeak = 0x04, - MeterKrms = 0x08 + MeterKrms = 0x08, + MeterIEC1 = 0x10, + MeterIEC2 = 0x20, + MeterVU = 0x40 }; enum TrackMode { diff --git a/libs/ardour/ardour/vumeterdsp.h b/libs/ardour/ardour/vumeterdsp.h new file mode 100644 index 0000000000..86487e8e8e --- /dev/null +++ b/libs/ardour/ardour/vumeterdsp.h @@ -0,0 +1,49 @@ +/* + Copyright (C) 2012 Fons Adriaensen + Adopted for Ardour 2013 by Robin Gareus + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef __VUMETERDSP_H +#define __VUMETERDSP_H + + +class Vumeterdsp +{ +public: + + Vumeterdsp (void); + ~Vumeterdsp (void); + + void process (float *p, int n); + float read (void); + void reset (); + + static void init (float fsamp); + +private: + + float _z1; // filter state + float _z2; // filter state + float _m; // max value since last read() + bool _res; // flag to reset m + + static float _w; // lowpass filter coefficient + static float _g; // gain factor +}; + + +#endif diff --git a/libs/ardour/iec1ppmdsp.cc b/libs/ardour/iec1ppmdsp.cc new file mode 100644 index 0000000000..bed825048f --- /dev/null +++ b/libs/ardour/iec1ppmdsp.cc @@ -0,0 +1,100 @@ +/* + Copyright (C) 2012 Fons Adriaensen + Adopted for Ardour 2013 by Robin Gareus + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include +#include "ardour/iec1ppmdsp.h" + + +float Iec1ppmdsp::_w1; +float Iec1ppmdsp::_w2; +float Iec1ppmdsp::_w3; +float Iec1ppmdsp::_g; + + +Iec1ppmdsp::Iec1ppmdsp (void) : + _z1 (0), + _z2 (0), + _m (0), + _res (true) +{ +} + + +Iec1ppmdsp::~Iec1ppmdsp (void) +{ +} + + +void Iec1ppmdsp::process (float *p, int n) +{ + float z1, z2, m, t; + + z1 = _z1; + z2 = _z2; + m = _res ? 0: _m; + _res = false; + + n /= 4; + while (n--) + { + z1 *= _w3; + z2 *= _w3; + t = fabsf (*p++); + if (t > z1) z1 += _w1 * (t - z1); + if (t > z2) z2 += _w2 * (t - z2); + t = fabsf (*p++); + if (t > z1) z1 += _w1 * (t - z1); + if (t > z2) z2 += _w2 * (t - z2); + t = fabsf (*p++); + if (t > z1) z1 += _w1 * (t - z1); + if (t > z2) z2 += _w2 * (t - z2); + t = fabsf (*p++); + if (t > z1) z1 += _w1 * (t - z1); + if (t > z2) z2 += _w2 * (t - z2); + t = z1 + z2; + if (t > m) m = t; + } + + _z1 = z1 + 1e-10f; + _z2 = z2 + 1e-10f; + _m = m; +} + + +float Iec1ppmdsp::read (void) +{ + _res = true; + return _g * _m; +} + +void Iec1ppmdsp::reset () +{ + _z1 = _z2 = _m = .0f; + _res = true; +} + +void Iec1ppmdsp::init (float fsamp) +{ + _w1 = 450.0f / fsamp; + _w2 = 1300.0f / fsamp; + _w3 = 1.0f - 5.4f / fsamp; + _g = 0.5108f; +} + +/* vi:set ts=8 sts=8 sw=4: */ diff --git a/libs/ardour/iec2ppmdsp.cc b/libs/ardour/iec2ppmdsp.cc new file mode 100644 index 0000000000..76862cccd2 --- /dev/null +++ b/libs/ardour/iec2ppmdsp.cc @@ -0,0 +1,100 @@ +/* + Copyright (C) 2012 Fons Adriaensen + Adopted for Ardour 2013 by Robin Gareus + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include +#include "ardour/iec2ppmdsp.h" + + +float Iec2ppmdsp::_w1; +float Iec2ppmdsp::_w2; +float Iec2ppmdsp::_w3; +float Iec2ppmdsp::_g; + + +Iec2ppmdsp::Iec2ppmdsp (void) : + _z1 (0), + _z2 (0), + _m (0), + _res (true) +{ +} + + +Iec2ppmdsp::~Iec2ppmdsp (void) +{ +} + + +void Iec2ppmdsp::process (float *p, int n) +{ + float z1, z2, m, t; + + z1 = _z1; + z2 = _z2; + m = _res ? 0: _m; + _res = false; + + n /= 4; + while (n--) + { + z1 *= _w3; + z2 *= _w3; + t = fabsf (*p++); + if (t > z1) z1 += _w1 * (t - z1); + if (t > z2) z2 += _w2 * (t - z2); + t = fabsf (*p++); + if (t > z1) z1 += _w1 * (t - z1); + if (t > z2) z2 += _w2 * (t - z2); + t = fabsf (*p++); + if (t > z1) z1 += _w1 * (t - z1); + if (t > z2) z2 += _w2 * (t - z2); + t = fabsf (*p++); + if (t > z1) z1 += _w1 * (t - z1); + if (t > z2) z2 += _w2 * (t - z2); + t = z1 + z2; + if (t > m) m = t; + } + + _z1 = z1 + 1e-10f; + _z2 = z2 + 1e-10f; + _m = m; +} + + +float Iec2ppmdsp::read (void) +{ + _res = true; + return _g * _m; +} + +void Iec2ppmdsp::reset () +{ + _z1 = _z2 = _m = .0f; + _res = true; +} + +void Iec2ppmdsp::init (float fsamp) +{ + _w1 = 200.0f / fsamp; + _w2 = 860.0f / fsamp; + _w3 = 1.0f - 4.0f / fsamp; + _g = 0.5141f; +} + +/* vi:set ts=8 sts=8 sw=4: */ diff --git a/libs/ardour/kmeterdsp.cc b/libs/ardour/kmeterdsp.cc index 77d1a87a81..2490ae34ec 100644 --- a/libs/ardour/kmeterdsp.cc +++ b/libs/ardour/kmeterdsp.cc @@ -1,6 +1,6 @@ /* Copyright (C) 2008-2011 Fons Adriaensen - Adopted for Ardour 2013 by Robin Gareus + Adopted for Ardour 2013 by Robin Gareus This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,12 +17,13 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - #include -#include "kmeterdsp.h" +#include "ardour/kmeterdsp.h" + float Kmeterdsp::_omega; + Kmeterdsp::Kmeterdsp (void) : _z1 (0), _z2 (0), @@ -36,6 +37,10 @@ Kmeterdsp::~Kmeterdsp (void) { } +void Kmeterdsp::init (int fsamp) +{ + _omega = 9.72f / fsamp; // ballistic filter coefficient +} void Kmeterdsp::process (float *p, int n) { @@ -93,7 +98,6 @@ void Kmeterdsp::process (float *p, int n) if (s > _rms) _rms = s; } - /* Returns highest _rms value since last call */ float Kmeterdsp::read () { @@ -102,15 +106,10 @@ float Kmeterdsp::read () return rv; } -void Kmeterdsp::init (int fsamp) -{ - _omega = 9.72f / fsamp; // ballistic filter coefficient -} - void Kmeterdsp::reset () { - _z1 = _z2 = _rms = 0.0; - _flag=false; + _z1 = _z2 = _rms = .0f; + _flag = false; } -/* vi:set ts=8 sts=8 sw=8: */ +/* vi:set ts=8 sts=8 sw=4: */ diff --git a/libs/ardour/meter.cc b/libs/ardour/meter.cc index f239a1c4b7..383a5bdfad 100644 --- a/libs/ardour/meter.cc +++ b/libs/ardour/meter.cc @@ -40,13 +40,22 @@ PeakMeter::PeakMeter (Session& s, const std::string& name) : Processor (s, string_compose ("meter-%1", name)) { Kmeterdsp::init(s.nominal_frame_rate()); + Iec1ppmdsp::init(s.nominal_frame_rate()); + Iec2ppmdsp::init(s.nominal_frame_rate()); + Vumeterdsp::init(s.nominal_frame_rate()); } PeakMeter::~PeakMeter () { while (_kmeter.size() > 0) { delete (_kmeter.back()); + delete (_iec1meter.back()); + delete (_iec2meter.back()); + delete (_vumeter.back()); _kmeter.pop_back(); + _iec1meter.pop_back(); + _iec2meter.pop_back(); + _vumeter.pop_back(); } } @@ -100,6 +109,15 @@ PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_fr if (_meter_type & MeterKrms) { _kmeter[i]->process(bufs.get_audio(i).data(), nframes); } + if (_meter_type & MeterIEC1) { + _iec1meter[i]->process(bufs.get_audio(i).data(), nframes); + } + if (_meter_type & MeterIEC2) { + _iec2meter[i]->process(bufs.get_audio(i).data(), nframes); + } + if (_meter_type & MeterVU) { + _vumeter[i]->process(bufs.get_audio(i).data(), nframes); + } } // Zero any excess peaks @@ -167,6 +185,9 @@ PeakMeter::reflect_inputs (const ChanCount& in) for (size_t n = 0; n < n_audio; ++n) { _kmeter[n]->reset(); + _iec1meter[n]->reset(); + _iec2meter[n]->reset(); + _vumeter[n]->reset(); } reset_max(); @@ -202,12 +223,24 @@ PeakMeter::reset_max_channels (const ChanCount& chn) /* alloc/free other audio-only meter types. */ while (_kmeter.size() > n_audio) { delete (_kmeter.back()); + delete (_iec1meter.back()); + delete (_iec2meter.back()); + delete (_vumeter.back()); _kmeter.pop_back(); + _iec1meter.pop_back(); + _iec2meter.pop_back(); + _vumeter.pop_back(); } while (_kmeter.size() < n_audio) { _kmeter.push_back(new Kmeterdsp()); + _iec1meter.push_back(new Iec1ppmdsp()); + _iec2meter.push_back(new Iec2ppmdsp()); + _vumeter.push_back(new Vumeterdsp()); } assert(_kmeter.size() == n_audio); + assert(_iec1meter.size() == n_audio); + assert(_iec2meter.size() == n_audio); + assert(_vumeter.size() == n_audio); } /** To be driven by the Meter signal from IO. @@ -279,32 +312,51 @@ PeakMeter::meter_level(uint32_t n, MeterType type) { switch (type) { case MeterKrms: { - const uint32_t n_midi = current_meters.n_midi(); + const uint32_t n_midi = current_meters.n_midi(); if ((n - n_midi) < _kmeter.size() && (n - n_midi) >= 0) { -#if 0 - return fast_coefficient_to_dB (_kmeter[n-n_midi]->read()); -#else - return accurate_coefficient_to_dB (_kmeter[n-n_midi]->read()); -#endif + return accurate_coefficient_to_dB (_kmeter[n - n_midi]->read()); } - return minus_infinity(); } + break; + case MeterIEC1: + { + const uint32_t n_midi = current_meters.n_midi(); + if ((n - n_midi) < _iec1meter.size() && (n - n_midi) >= 0) { + return accurate_coefficient_to_dB (_iec1meter[n - n_midi]->read()); + } + } + break; + case MeterIEC2: + { + const uint32_t n_midi = current_meters.n_midi(); + if ((n - n_midi) < _iec2meter.size() && (n - n_midi) >= 0) { + return accurate_coefficient_to_dB (_iec2meter[n - n_midi]->read()); + } + } + break; + case MeterVU: + { + const uint32_t n_midi = current_meters.n_midi(); + if ((n - n_midi) < _vumeter.size() && (n - n_midi) >= 0) { + return accurate_coefficient_to_dB (_vumeter[n - n_midi]->read()); + } + } + break; case MeterPeak: return peak_power(n); case MeterMaxSignal: if (n < _max_peak_signal.size()) { return _max_peak_signal[n]; - } else { - return minus_infinity(); } + break; default: case MeterMaxPeak: if (n < _max_peak_power.size()) { return _max_peak_power[n]; - } else { - return minus_infinity(); } + break; } + return minus_infinity(); } void @@ -322,6 +374,25 @@ PeakMeter::set_type(MeterType t) _kmeter[n]->reset(); } } + if (t & MeterIEC1) { + const size_t n_audio = current_meters.n_audio(); + for (size_t n = 0; n < n_audio; ++n) { + _iec1meter[n]->reset(); + } + } + if (t & MeterIEC2) { + const size_t n_audio = current_meters.n_audio(); + for (size_t n = 0; n < n_audio; ++n) { + _iec2meter[n]->reset(); + } + } + if (t & MeterVU) { + const size_t n_audio = current_meters.n_audio(); + for (size_t n = 0; n < n_audio; ++n) { + _vumeter[n]->reset(); + } + } + TypeChanged(t); } diff --git a/libs/ardour/vumeterdsp.cc b/libs/ardour/vumeterdsp.cc new file mode 100644 index 0000000000..67d48f6c54 --- /dev/null +++ b/libs/ardour/vumeterdsp.cc @@ -0,0 +1,89 @@ +/* + Copyright (C) 2012 Fons Adriaensen + Adopted for Ardour 2013 by Robin Gareus + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include +#include "ardour/vumeterdsp.h" + + +float Vumeterdsp::_w; +float Vumeterdsp::_g; + + +Vumeterdsp::Vumeterdsp (void) : + _z1 (0), + _z2 (0), + _m (0), + _res (true) +{ +} + + +Vumeterdsp::~Vumeterdsp (void) +{ +} + + +void Vumeterdsp::process (float *p, int n) +{ + float z1, z2, m, t1, t2; + + z1 = _z1; + z2 = _z2; + m = _res ? 0: _m; + _res = false; + + n /= 4; + while (n--) + { + t2 = z2 / 2; + t1 = fabsf (*p++) - t2; + z1 += _w * (t1 - z1); + t1 = fabsf (*p++) - t2; + z1 += _w * (t1 - z1); + t1 = fabsf (*p++) - t2; + z1 += _w * (t1 - z1); + t1 = fabsf (*p++) - t2; + z1 += _w * (t1 - z1); + z2 += 4 * _w * (z1 - z2); + if (z2 > m) m = z2; + } + + _z1 = z1; + _z2 = z2 + 1e-10f; + _m = m; +} + + +float Vumeterdsp::read (void) +{ + _res = true; + return _g * _m; +} + +void Vumeterdsp::reset () +{ + _z1 = _z2 = _m = .0f; + _res = true; +} + +void Vumeterdsp::init (float fsamp) +{ + _w = 11.1f / fsamp; + _g = 1.5f * 1.571f; +} diff --git a/libs/ardour/wscript b/libs/ardour/wscript index 4e7e23aa1a..ea08636ea8 100644 --- a/libs/ardour/wscript +++ b/libs/ardour/wscript @@ -91,6 +91,8 @@ libardour_sources = [ 'globals.cc', 'graph.cc', 'graphnode.cc', + 'iec1ppmdsp.cc', + 'iec2ppmdsp.cc', 'import.cc', 'instrument_info.cc', 'internal_return.cc', @@ -206,6 +208,7 @@ libardour_sources = [ 'user_bundle.cc', 'utils.cc', 'version.cc', + 'vumeterdsp.cc', 'worker.cc' ] From ce621d1c8a600853be0020942a9664ccee0ab165 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Mon, 15 Jul 2013 15:12:15 +0200 Subject: [PATCH 034/221] add new meter-type enums (amend 80aa2574) --- libs/ardour/enums.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc index 495ff0b4c3..12eb59ce65 100644 --- a/libs/ardour/enums.cc +++ b/libs/ardour/enums.cc @@ -177,6 +177,9 @@ setup_enum_writer () REGISTER_ENUM (MeterMaxPeak); REGISTER_ENUM (MeterPeak); REGISTER_ENUM (MeterKrms); + REGISTER_ENUM (MeterIEC1); + REGISTER_ENUM (MeterIEC2); + REGISTER_ENUM (MeterVU); REGISTER (_MeterType); REGISTER_ENUM (Normal); From d80f672e8487f459d76ab291958bffcded08f0fd Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Mon, 15 Jul 2013 16:07:37 +0200 Subject: [PATCH 035/221] Revert new meter types (postponed until after 3.3 release) This reverts commit ce621d1c8a600853be0020942a9664ccee0ab165. This reverts commit 80aa2574819e947668092c660d767e25a661c6f1. --- gtk2_ardour/meter_patterns.cc | 9 --- gtk2_ardour/meter_strip.cc | 3 - gtk2_ardour/mixer_strip.cc | 3 - libs/ardour/ardour/iec1ppmdsp.h | 51 -------------- libs/ardour/ardour/iec2ppmdsp.h | 51 -------------- libs/ardour/ardour/meter.h | 10 +-- libs/ardour/ardour/types.h | 5 +- libs/ardour/ardour/vumeterdsp.h | 49 ------------- libs/ardour/enums.cc | 3 - libs/ardour/iec1ppmdsp.cc | 100 --------------------------- libs/ardour/iec2ppmdsp.cc | 100 --------------------------- libs/ardour/kmeterdsp.cc | 25 +++---- libs/ardour/{ardour => }/kmeterdsp.h | 5 +- libs/ardour/meter.cc | 93 +++---------------------- libs/ardour/vumeterdsp.cc | 89 ------------------------ libs/ardour/wscript | 3 - 16 files changed, 28 insertions(+), 571 deletions(-) delete mode 100644 libs/ardour/ardour/iec1ppmdsp.h delete mode 100644 libs/ardour/ardour/iec2ppmdsp.h delete mode 100644 libs/ardour/ardour/vumeterdsp.h delete mode 100644 libs/ardour/iec1ppmdsp.cc delete mode 100644 libs/ardour/iec2ppmdsp.cc rename libs/ardour/{ardour => }/kmeterdsp.h (95%) delete mode 100644 libs/ardour/vumeterdsp.cc diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index ccf24fcefc..80655af7b9 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -64,15 +64,6 @@ ArdourMeter::meter_type_string (ARDOUR::MeterType mt) case MeterKrms: return _("RMS + Peak"); break; - case MeterIEC1: - return _("DIN"); - break; - case MeterIEC2: - return _("EBU/BBC"); - break; - case MeterVU: - return _("VU"); - break; default: return _("???"); break; diff --git a/gtk2_ardour/meter_strip.cc b/gtk2_ardour/meter_strip.cc index 3a8410867a..44144114a4 100644 --- a/gtk2_ardour/meter_strip.cc +++ b/gtk2_ardour/meter_strip.cc @@ -573,9 +573,6 @@ MeterStrip::popup_level_meter_menu (GdkEventButton* ev) _suspend_menu_callbacks = true; add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterPeak), MeterPeak); add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterKrms), MeterKrms); - add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterIEC1), MeterIEC1); - add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterIEC2), MeterIEC2); - add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterVU), MeterVU); MeterType cmt = _route->meter_type(); const std::string cmn = ArdourMeter::meter_type_string(cmt); diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index dec072b067..6128780cf0 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -2135,9 +2135,6 @@ MixerStrip::popup_level_meter_menu (GdkEventButton* ev) add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterPeak), MeterPeak); add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterKrms), MeterKrms); - add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC1), MeterIEC1); - add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC2), MeterIEC2); - add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterVU), MeterVU); int _strip_type; if (_route->is_master()) { diff --git a/libs/ardour/ardour/iec1ppmdsp.h b/libs/ardour/ardour/iec1ppmdsp.h deleted file mode 100644 index 58dea97555..0000000000 --- a/libs/ardour/ardour/iec1ppmdsp.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - Copyright (C) 2012 Fons Adriaensen - Adopted for Ardour 2013 by Robin Gareus - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -#ifndef __IEC1PPMDSP_H -#define __IEC1PPMDSP_H - - -class Iec1ppmdsp -{ -public: - - Iec1ppmdsp (void); - ~Iec1ppmdsp (void); - - void process (float *p, int n); - float read (void); - void reset (); - - static void init (float fsamp); - -private: - - float _z1; // filter state - float _z2; // filter state - float _m; // max value since last read() - bool _res; // flag to reset m - - static float _w1; // attack filter coefficient - static float _w2; // attack filter coefficient - static float _w3; // release filter coefficient - static float _g; // gain factor -}; - - -#endif diff --git a/libs/ardour/ardour/iec2ppmdsp.h b/libs/ardour/ardour/iec2ppmdsp.h deleted file mode 100644 index 3574a8bd3f..0000000000 --- a/libs/ardour/ardour/iec2ppmdsp.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - Copyright (C) 2012 Fons Adriaensen - Adopted for Ardour 2013 by Robin Gareus - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -#ifndef __IEC2PPMDSP_H -#define __IEC2PPMDSP_H - - -class Iec2ppmdsp -{ -public: - - Iec2ppmdsp (void); - ~Iec2ppmdsp (void); - - void process (float *p, int n); - float read (void); - void reset (); - - static void init (float fsamp); - -private: - - float _z1; // filter state - float _z2; // filter state - float _m; // max value since last read() - bool _res; // flag to reset m - - static float _w1; // attack filter coefficient - static float _w2; // attack filter coefficient - static float _w3; // release filter coefficient - static float _g; // gain factor -}; - - -#endif diff --git a/libs/ardour/ardour/meter.h b/libs/ardour/ardour/meter.h index 4ac140fd04..31ebc76179 100644 --- a/libs/ardour/ardour/meter.h +++ b/libs/ardour/ardour/meter.h @@ -23,11 +23,7 @@ #include "ardour/types.h" #include "ardour/processor.h" #include "pbd/fastlog.h" - -#include "ardour/kmeterdsp.h" -#include "ardour/iec1ppmdsp.h" -#include "ardour/iec2ppmdsp.h" -#include "ardour/vumeterdsp.h" +#include "kmeterdsp.h" namespace ARDOUR { @@ -108,11 +104,7 @@ private: std::vector _visible_peak_power; std::vector _max_peak_signal; std::vector _max_peak_power; - std::vector _kmeter; - std::vector _iec1meter; - std::vector _iec2meter; - std::vector _vumeter; MeterType _meter_type; }; diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h index df7209b581..05d6d0b27d 100644 --- a/libs/ardour/ardour/types.h +++ b/libs/ardour/ardour/types.h @@ -181,10 +181,7 @@ namespace ARDOUR { MeterMaxSignal = 0x01, MeterMaxPeak = 0x02, MeterPeak = 0x04, - MeterKrms = 0x08, - MeterIEC1 = 0x10, - MeterIEC2 = 0x20, - MeterVU = 0x40 + MeterKrms = 0x08 }; enum TrackMode { diff --git a/libs/ardour/ardour/vumeterdsp.h b/libs/ardour/ardour/vumeterdsp.h deleted file mode 100644 index 86487e8e8e..0000000000 --- a/libs/ardour/ardour/vumeterdsp.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - Copyright (C) 2012 Fons Adriaensen - Adopted for Ardour 2013 by Robin Gareus - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -#ifndef __VUMETERDSP_H -#define __VUMETERDSP_H - - -class Vumeterdsp -{ -public: - - Vumeterdsp (void); - ~Vumeterdsp (void); - - void process (float *p, int n); - float read (void); - void reset (); - - static void init (float fsamp); - -private: - - float _z1; // filter state - float _z2; // filter state - float _m; // max value since last read() - bool _res; // flag to reset m - - static float _w; // lowpass filter coefficient - static float _g; // gain factor -}; - - -#endif diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc index 12eb59ce65..495ff0b4c3 100644 --- a/libs/ardour/enums.cc +++ b/libs/ardour/enums.cc @@ -177,9 +177,6 @@ setup_enum_writer () REGISTER_ENUM (MeterMaxPeak); REGISTER_ENUM (MeterPeak); REGISTER_ENUM (MeterKrms); - REGISTER_ENUM (MeterIEC1); - REGISTER_ENUM (MeterIEC2); - REGISTER_ENUM (MeterVU); REGISTER (_MeterType); REGISTER_ENUM (Normal); diff --git a/libs/ardour/iec1ppmdsp.cc b/libs/ardour/iec1ppmdsp.cc deleted file mode 100644 index bed825048f..0000000000 --- a/libs/ardour/iec1ppmdsp.cc +++ /dev/null @@ -1,100 +0,0 @@ -/* - Copyright (C) 2012 Fons Adriaensen - Adopted for Ardour 2013 by Robin Gareus - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -#include -#include "ardour/iec1ppmdsp.h" - - -float Iec1ppmdsp::_w1; -float Iec1ppmdsp::_w2; -float Iec1ppmdsp::_w3; -float Iec1ppmdsp::_g; - - -Iec1ppmdsp::Iec1ppmdsp (void) : - _z1 (0), - _z2 (0), - _m (0), - _res (true) -{ -} - - -Iec1ppmdsp::~Iec1ppmdsp (void) -{ -} - - -void Iec1ppmdsp::process (float *p, int n) -{ - float z1, z2, m, t; - - z1 = _z1; - z2 = _z2; - m = _res ? 0: _m; - _res = false; - - n /= 4; - while (n--) - { - z1 *= _w3; - z2 *= _w3; - t = fabsf (*p++); - if (t > z1) z1 += _w1 * (t - z1); - if (t > z2) z2 += _w2 * (t - z2); - t = fabsf (*p++); - if (t > z1) z1 += _w1 * (t - z1); - if (t > z2) z2 += _w2 * (t - z2); - t = fabsf (*p++); - if (t > z1) z1 += _w1 * (t - z1); - if (t > z2) z2 += _w2 * (t - z2); - t = fabsf (*p++); - if (t > z1) z1 += _w1 * (t - z1); - if (t > z2) z2 += _w2 * (t - z2); - t = z1 + z2; - if (t > m) m = t; - } - - _z1 = z1 + 1e-10f; - _z2 = z2 + 1e-10f; - _m = m; -} - - -float Iec1ppmdsp::read (void) -{ - _res = true; - return _g * _m; -} - -void Iec1ppmdsp::reset () -{ - _z1 = _z2 = _m = .0f; - _res = true; -} - -void Iec1ppmdsp::init (float fsamp) -{ - _w1 = 450.0f / fsamp; - _w2 = 1300.0f / fsamp; - _w3 = 1.0f - 5.4f / fsamp; - _g = 0.5108f; -} - -/* vi:set ts=8 sts=8 sw=4: */ diff --git a/libs/ardour/iec2ppmdsp.cc b/libs/ardour/iec2ppmdsp.cc deleted file mode 100644 index 76862cccd2..0000000000 --- a/libs/ardour/iec2ppmdsp.cc +++ /dev/null @@ -1,100 +0,0 @@ -/* - Copyright (C) 2012 Fons Adriaensen - Adopted for Ardour 2013 by Robin Gareus - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -#include -#include "ardour/iec2ppmdsp.h" - - -float Iec2ppmdsp::_w1; -float Iec2ppmdsp::_w2; -float Iec2ppmdsp::_w3; -float Iec2ppmdsp::_g; - - -Iec2ppmdsp::Iec2ppmdsp (void) : - _z1 (0), - _z2 (0), - _m (0), - _res (true) -{ -} - - -Iec2ppmdsp::~Iec2ppmdsp (void) -{ -} - - -void Iec2ppmdsp::process (float *p, int n) -{ - float z1, z2, m, t; - - z1 = _z1; - z2 = _z2; - m = _res ? 0: _m; - _res = false; - - n /= 4; - while (n--) - { - z1 *= _w3; - z2 *= _w3; - t = fabsf (*p++); - if (t > z1) z1 += _w1 * (t - z1); - if (t > z2) z2 += _w2 * (t - z2); - t = fabsf (*p++); - if (t > z1) z1 += _w1 * (t - z1); - if (t > z2) z2 += _w2 * (t - z2); - t = fabsf (*p++); - if (t > z1) z1 += _w1 * (t - z1); - if (t > z2) z2 += _w2 * (t - z2); - t = fabsf (*p++); - if (t > z1) z1 += _w1 * (t - z1); - if (t > z2) z2 += _w2 * (t - z2); - t = z1 + z2; - if (t > m) m = t; - } - - _z1 = z1 + 1e-10f; - _z2 = z2 + 1e-10f; - _m = m; -} - - -float Iec2ppmdsp::read (void) -{ - _res = true; - return _g * _m; -} - -void Iec2ppmdsp::reset () -{ - _z1 = _z2 = _m = .0f; - _res = true; -} - -void Iec2ppmdsp::init (float fsamp) -{ - _w1 = 200.0f / fsamp; - _w2 = 860.0f / fsamp; - _w3 = 1.0f - 4.0f / fsamp; - _g = 0.5141f; -} - -/* vi:set ts=8 sts=8 sw=4: */ diff --git a/libs/ardour/kmeterdsp.cc b/libs/ardour/kmeterdsp.cc index 2490ae34ec..77d1a87a81 100644 --- a/libs/ardour/kmeterdsp.cc +++ b/libs/ardour/kmeterdsp.cc @@ -1,6 +1,6 @@ /* Copyright (C) 2008-2011 Fons Adriaensen - Adopted for Ardour 2013 by Robin Gareus + Adopted for Ardour 2013 by Robin Gareus This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,13 +17,12 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include -#include "ardour/kmeterdsp.h" +#include +#include "kmeterdsp.h" float Kmeterdsp::_omega; - Kmeterdsp::Kmeterdsp (void) : _z1 (0), _z2 (0), @@ -37,10 +36,6 @@ Kmeterdsp::~Kmeterdsp (void) { } -void Kmeterdsp::init (int fsamp) -{ - _omega = 9.72f / fsamp; // ballistic filter coefficient -} void Kmeterdsp::process (float *p, int n) { @@ -98,6 +93,7 @@ void Kmeterdsp::process (float *p, int n) if (s > _rms) _rms = s; } + /* Returns highest _rms value since last call */ float Kmeterdsp::read () { @@ -106,10 +102,15 @@ float Kmeterdsp::read () return rv; } -void Kmeterdsp::reset () +void Kmeterdsp::init (int fsamp) { - _z1 = _z2 = _rms = .0f; - _flag = false; + _omega = 9.72f / fsamp; // ballistic filter coefficient } -/* vi:set ts=8 sts=8 sw=4: */ +void Kmeterdsp::reset () +{ + _z1 = _z2 = _rms = 0.0; + _flag=false; +} + +/* vi:set ts=8 sts=8 sw=8: */ diff --git a/libs/ardour/ardour/kmeterdsp.h b/libs/ardour/kmeterdsp.h similarity index 95% rename from libs/ardour/ardour/kmeterdsp.h rename to libs/ardour/kmeterdsp.h index eca3c76695..9c2309e09c 100644 --- a/libs/ardour/ardour/kmeterdsp.h +++ b/libs/ardour/kmeterdsp.h @@ -1,6 +1,6 @@ /* Copyright (C) 2008-2011 Fons Adriaensen - Adopted for Ardour 2013 by Robin Gareus + Adopted for Ardour 2013 by Robin Gareus This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -29,9 +29,8 @@ public: void process (float *p, int n); float read (); - void reset (); - static void init (int fsamp); + void reset (); private: diff --git a/libs/ardour/meter.cc b/libs/ardour/meter.cc index 383a5bdfad..f239a1c4b7 100644 --- a/libs/ardour/meter.cc +++ b/libs/ardour/meter.cc @@ -40,22 +40,13 @@ PeakMeter::PeakMeter (Session& s, const std::string& name) : Processor (s, string_compose ("meter-%1", name)) { Kmeterdsp::init(s.nominal_frame_rate()); - Iec1ppmdsp::init(s.nominal_frame_rate()); - Iec2ppmdsp::init(s.nominal_frame_rate()); - Vumeterdsp::init(s.nominal_frame_rate()); } PeakMeter::~PeakMeter () { while (_kmeter.size() > 0) { delete (_kmeter.back()); - delete (_iec1meter.back()); - delete (_iec2meter.back()); - delete (_vumeter.back()); _kmeter.pop_back(); - _iec1meter.pop_back(); - _iec2meter.pop_back(); - _vumeter.pop_back(); } } @@ -109,15 +100,6 @@ PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_fr if (_meter_type & MeterKrms) { _kmeter[i]->process(bufs.get_audio(i).data(), nframes); } - if (_meter_type & MeterIEC1) { - _iec1meter[i]->process(bufs.get_audio(i).data(), nframes); - } - if (_meter_type & MeterIEC2) { - _iec2meter[i]->process(bufs.get_audio(i).data(), nframes); - } - if (_meter_type & MeterVU) { - _vumeter[i]->process(bufs.get_audio(i).data(), nframes); - } } // Zero any excess peaks @@ -185,9 +167,6 @@ PeakMeter::reflect_inputs (const ChanCount& in) for (size_t n = 0; n < n_audio; ++n) { _kmeter[n]->reset(); - _iec1meter[n]->reset(); - _iec2meter[n]->reset(); - _vumeter[n]->reset(); } reset_max(); @@ -223,24 +202,12 @@ PeakMeter::reset_max_channels (const ChanCount& chn) /* alloc/free other audio-only meter types. */ while (_kmeter.size() > n_audio) { delete (_kmeter.back()); - delete (_iec1meter.back()); - delete (_iec2meter.back()); - delete (_vumeter.back()); _kmeter.pop_back(); - _iec1meter.pop_back(); - _iec2meter.pop_back(); - _vumeter.pop_back(); } while (_kmeter.size() < n_audio) { _kmeter.push_back(new Kmeterdsp()); - _iec1meter.push_back(new Iec1ppmdsp()); - _iec2meter.push_back(new Iec2ppmdsp()); - _vumeter.push_back(new Vumeterdsp()); } assert(_kmeter.size() == n_audio); - assert(_iec1meter.size() == n_audio); - assert(_iec2meter.size() == n_audio); - assert(_vumeter.size() == n_audio); } /** To be driven by the Meter signal from IO. @@ -312,51 +279,32 @@ PeakMeter::meter_level(uint32_t n, MeterType type) { switch (type) { case MeterKrms: { - const uint32_t n_midi = current_meters.n_midi(); + const uint32_t n_midi = current_meters.n_midi(); if ((n - n_midi) < _kmeter.size() && (n - n_midi) >= 0) { - return accurate_coefficient_to_dB (_kmeter[n - n_midi]->read()); +#if 0 + return fast_coefficient_to_dB (_kmeter[n-n_midi]->read()); +#else + return accurate_coefficient_to_dB (_kmeter[n-n_midi]->read()); +#endif } + return minus_infinity(); } - break; - case MeterIEC1: - { - const uint32_t n_midi = current_meters.n_midi(); - if ((n - n_midi) < _iec1meter.size() && (n - n_midi) >= 0) { - return accurate_coefficient_to_dB (_iec1meter[n - n_midi]->read()); - } - } - break; - case MeterIEC2: - { - const uint32_t n_midi = current_meters.n_midi(); - if ((n - n_midi) < _iec2meter.size() && (n - n_midi) >= 0) { - return accurate_coefficient_to_dB (_iec2meter[n - n_midi]->read()); - } - } - break; - case MeterVU: - { - const uint32_t n_midi = current_meters.n_midi(); - if ((n - n_midi) < _vumeter.size() && (n - n_midi) >= 0) { - return accurate_coefficient_to_dB (_vumeter[n - n_midi]->read()); - } - } - break; case MeterPeak: return peak_power(n); case MeterMaxSignal: if (n < _max_peak_signal.size()) { return _max_peak_signal[n]; + } else { + return minus_infinity(); } - break; default: case MeterMaxPeak: if (n < _max_peak_power.size()) { return _max_peak_power[n]; + } else { + return minus_infinity(); } - break; } - return minus_infinity(); } void @@ -374,25 +322,6 @@ PeakMeter::set_type(MeterType t) _kmeter[n]->reset(); } } - if (t & MeterIEC1) { - const size_t n_audio = current_meters.n_audio(); - for (size_t n = 0; n < n_audio; ++n) { - _iec1meter[n]->reset(); - } - } - if (t & MeterIEC2) { - const size_t n_audio = current_meters.n_audio(); - for (size_t n = 0; n < n_audio; ++n) { - _iec2meter[n]->reset(); - } - } - if (t & MeterVU) { - const size_t n_audio = current_meters.n_audio(); - for (size_t n = 0; n < n_audio; ++n) { - _vumeter[n]->reset(); - } - } - TypeChanged(t); } diff --git a/libs/ardour/vumeterdsp.cc b/libs/ardour/vumeterdsp.cc deleted file mode 100644 index 67d48f6c54..0000000000 --- a/libs/ardour/vumeterdsp.cc +++ /dev/null @@ -1,89 +0,0 @@ -/* - Copyright (C) 2012 Fons Adriaensen - Adopted for Ardour 2013 by Robin Gareus - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -#include -#include "ardour/vumeterdsp.h" - - -float Vumeterdsp::_w; -float Vumeterdsp::_g; - - -Vumeterdsp::Vumeterdsp (void) : - _z1 (0), - _z2 (0), - _m (0), - _res (true) -{ -} - - -Vumeterdsp::~Vumeterdsp (void) -{ -} - - -void Vumeterdsp::process (float *p, int n) -{ - float z1, z2, m, t1, t2; - - z1 = _z1; - z2 = _z2; - m = _res ? 0: _m; - _res = false; - - n /= 4; - while (n--) - { - t2 = z2 / 2; - t1 = fabsf (*p++) - t2; - z1 += _w * (t1 - z1); - t1 = fabsf (*p++) - t2; - z1 += _w * (t1 - z1); - t1 = fabsf (*p++) - t2; - z1 += _w * (t1 - z1); - t1 = fabsf (*p++) - t2; - z1 += _w * (t1 - z1); - z2 += 4 * _w * (z1 - z2); - if (z2 > m) m = z2; - } - - _z1 = z1; - _z2 = z2 + 1e-10f; - _m = m; -} - - -float Vumeterdsp::read (void) -{ - _res = true; - return _g * _m; -} - -void Vumeterdsp::reset () -{ - _z1 = _z2 = _m = .0f; - _res = true; -} - -void Vumeterdsp::init (float fsamp) -{ - _w = 11.1f / fsamp; - _g = 1.5f * 1.571f; -} diff --git a/libs/ardour/wscript b/libs/ardour/wscript index ea08636ea8..4e7e23aa1a 100644 --- a/libs/ardour/wscript +++ b/libs/ardour/wscript @@ -91,8 +91,6 @@ libardour_sources = [ 'globals.cc', 'graph.cc', 'graphnode.cc', - 'iec1ppmdsp.cc', - 'iec2ppmdsp.cc', 'import.cc', 'instrument_info.cc', 'internal_return.cc', @@ -208,7 +206,6 @@ libardour_sources = [ 'user_bundle.cc', 'utils.cc', 'version.cc', - 'vumeterdsp.cc', 'worker.cc' ] From d64d4b881d89acb0caaf8f7becf7bf4ad7341cef Mon Sep 17 00:00:00 2001 From: "Michael R. Fisher" Date: Mon, 15 Jul 2013 12:42:09 -0500 Subject: [PATCH 036/221] Fix typo in osx BETA startup screen - Step #2 was being skipped in the text --- gtk2_ardour/startup.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gtk2_ardour/startup.cc b/gtk2_ardour/startup.cc index ca598ba949..82914d79a8 100644 --- a/gtk2_ardour/startup.cc +++ b/gtk2_ardour/startup.cc @@ -197,11 +197,11 @@ it is still at the beta stage on OS X. So, a few guidelines:\n\ \n\ 1) Please do NOT use this software with the expectation that it is stable or reliable\n\ though it may be so, depending on your workflow.\n\ -3) Please do NOT use the forums at ardour.org to report issues.\n\ -4) Please DO use the bugtracker at http://tracker.ardour.org/ to report issues\n\ +2) Please do NOT use the forums at ardour.org to report issues.\n\ +3) Please DO use the bugtracker at http://tracker.ardour.org/ to report issues\n\ making sure to note the product version number as 3.0-beta.\n\ -5) Please DO use the ardour-users mailing list to discuss ideas and pass on comments.\n\ -6) Please DO join us on IRC for real time discussions about ardour3. You\n\ +4) Please DO use the ardour-users mailing list to discuss ideas and pass on comments.\n\ +5) Please DO join us on IRC for real time discussions about ardour3. You\n\ can get there directly from Ardour via the Help->Chat menu option.\n\ \n\ Full information on all the above can be found on the support page at\n\ From abb8d61dea9da9d6560d25427b92b60d74fec109 Mon Sep 17 00:00:00 2001 From: "Michael R. Fisher" Date: Mon, 15 Jul 2013 12:48:33 -0500 Subject: [PATCH 037/221] Correcting Indentation Errors --- gtk2_ardour/startup.cc | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/gtk2_ardour/startup.cc b/gtk2_ardour/startup.cc index 82914d79a8..433b80ff92 100644 --- a/gtk2_ardour/startup.cc +++ b/gtk2_ardour/startup.cc @@ -189,9 +189,9 @@ ArdourStartup::ready_without_display () const void ArdourStartup::setup_prerelease_page () { - VBox* vbox = manage (new VBox); - Label* label = manage (new Label); - label->set_markup (_("Welcome to this BETA release of Ardour 3.0\n\n\ + VBox* vbox = manage (new VBox); + Label* label = manage (new Label); + label->set_markup (_("Welcome to this BETA release of Ardour 3.0\n\n\ Ardour 3.0 has been released for Linux but because of the lack of testers,\n\ it is still at the beta stage on OS X. So, a few guidelines:\n\ \n\ @@ -209,13 +209,13 @@ Full information on all the above can be found on the support page at\n\ http://ardour.org/support\n\ ")); - vbox->set_border_width (12); - vbox->pack_start (*label, false, false, 12); - vbox->show_all (); - - append_page (*vbox); - set_page_type (*vbox, ASSISTANT_PAGE_CONTENT); - set_page_title (*vbox, _("This is a BETA RELEASE")); + vbox->set_border_width (12); + vbox->pack_start (*label, false, false, 12); + vbox->show_all (); + + append_page (*vbox); + set_page_type (*vbox, ASSISTANT_PAGE_CONTENT); + set_page_title (*vbox, _("This is a BETA RELEASE")); set_page_complete (*vbox, true); } From 08e6dcde7621c309f3abc2779a196b2b86f19060 Mon Sep 17 00:00:00 2001 From: "Michael R. Fisher" Date: Mon, 15 Jul 2013 13:00:35 -0500 Subject: [PATCH 038/221] Startup BETA Mac Screen - Pull version number from VERSIONSTRING --- gtk2_ardour/startup.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gtk2_ardour/startup.cc b/gtk2_ardour/startup.cc index 433b80ff92..e7edf5e995 100644 --- a/gtk2_ardour/startup.cc +++ b/gtk2_ardour/startup.cc @@ -191,15 +191,15 @@ ArdourStartup::setup_prerelease_page () { VBox* vbox = manage (new VBox); Label* label = manage (new Label); - label->set_markup (_("Welcome to this BETA release of Ardour 3.0\n\n\ -Ardour 3.0 has been released for Linux but because of the lack of testers,\n\ + label->set_markup (string_compose (_("Welcome to this BETA release of Ardour %1\n\n\ +Ardour %1 has been released for Linux but because of the lack of testers,\n\ it is still at the beta stage on OS X. So, a few guidelines:\n\ \n\ 1) Please do NOT use this software with the expectation that it is stable or reliable\n\ though it may be so, depending on your workflow.\n\ 2) Please do NOT use the forums at ardour.org to report issues.\n\ 3) Please DO use the bugtracker at http://tracker.ardour.org/ to report issues\n\ - making sure to note the product version number as 3.0-beta.\n\ + making sure to note the product version number as %1-beta.\n\ 4) Please DO use the ardour-users mailing list to discuss ideas and pass on comments.\n\ 5) Please DO join us on IRC for real time discussions about ardour3. You\n\ can get there directly from Ardour via the Help->Chat menu option.\n\ @@ -207,7 +207,7 @@ it is still at the beta stage on OS X. So, a few guidelines:\n\ Full information on all the above can be found on the support page at\n\ \n\ http://ardour.org/support\n\ -")); +"), VERSIONSTRING)); vbox->set_border_width (12); vbox->pack_start (*label, false, false, 12); From 9f6d97376da6a29f8386c7e6d2dbdd20f83a867a Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 16 Jul 2013 00:56:36 +0200 Subject: [PATCH 039/221] add option to disable cairo-RGBA overlays for meters. --- libs/gtkmm2ext/fastmeter.cc | 11 ++++++++--- libs/gtkmm2ext/gtkmm2ext/fastmeter.h | 2 ++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/libs/gtkmm2ext/fastmeter.cc b/libs/gtkmm2ext/fastmeter.cc index c0bcb05af5..6ea1a6dd4b 100644 --- a/libs/gtkmm2ext/fastmeter.cc +++ b/libs/gtkmm2ext/fastmeter.cc @@ -23,6 +23,8 @@ #include #include +#include + #include #include #include @@ -37,6 +39,7 @@ using namespace std; int FastMeter::min_pattern_metric_size = 16; int FastMeter::max_pattern_metric_size = 1024; +bool FastMeter::no_rgba_overlay = false; FastMeter::Pattern10Map FastMeter::vm_pattern_cache; FastMeter::PatternBgMap FastMeter::vb_pattern_cache; @@ -61,6 +64,7 @@ FastMeter::FastMeter (long hold, unsigned long dimen, Orientation o, int len, last_peak_rect.height = 0; highlight = false; + no_rgba_overlay = ! Glib::getenv("NO_METER_SHADE").empty(); _clr[0] = clr0; _clr[1] = clr1; @@ -173,7 +177,7 @@ FastMeter::generate_meter_pattern ( cairo_pattern_add_color_stop_rgb (pat, 1.0, r/255.0, g/255.0, b/255.0); - if (shade) { + if (shade && !no_rgba_overlay) { cairo_pattern_t* shade_pattern = cairo_pattern_create_linear (0.0, 0.0, width, 0.0); cairo_pattern_add_color_stop_rgba (shade_pattern, 0, 1.0, 1.0, 1.0, 0.2); cairo_pattern_add_color_stop_rgba (shade_pattern, 1, 0.0, 0.0, 0.0, 0.3); @@ -221,7 +225,7 @@ FastMeter::generate_meter_background ( cairo_pattern_add_color_stop_rgb (pat, 1.0, r0/255.0, g0/255.0, b0/255.0); - if (shade) { + if (shade && !no_rgba_overlay) { cairo_pattern_t* shade_pattern = cairo_pattern_create_linear (0.0, 0.0, width, 0.0); cairo_pattern_add_color_stop_rgba (shade_pattern, 0.0, 1.0, 1.0, 1.0, 0.15); cairo_pattern_add_color_stop_rgba (shade_pattern, 0.6, 0.0, 0.0, 0.0, 0.10); @@ -417,7 +421,8 @@ FastMeter::vertical_expose (GdkEventExpose* ev) cairo_set_source (cr, fgpattern->cobj()); cairo_rectangle (cr, 1, last_peak_rect.y, pixwidth, last_peak_rect.height); - if (bright_hold) { + + if (bright_hold && !no_rgba_overlay) { cairo_fill_preserve (cr); cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.3); } diff --git a/libs/gtkmm2ext/gtkmm2ext/fastmeter.h b/libs/gtkmm2ext/gtkmm2ext/fastmeter.h index f065020a57..15c962deb4 100644 --- a/libs/gtkmm2ext/gtkmm2ext/fastmeter.h +++ b/libs/gtkmm2ext/gtkmm2ext/fastmeter.h @@ -96,6 +96,8 @@ private: bool vertical_expose (GdkEventExpose*); void queue_vertical_redraw (const Glib::RefPtr&, float); + static bool no_rgba_overlay; + static Cairo::RefPtr generate_meter_pattern ( int w, int h, int *clr, float *stp, bool shade); static Cairo::RefPtr request_vertical_meter ( From 332deec1553ceabd6716af9797a965a80ad9dfed Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 15 Jul 2013 20:04:37 -0400 Subject: [PATCH 040/221] tweaks to NO_PLUGIN_STATE logic --- libs/ardour/plugin.cc | 2 +- libs/ardour/route.cc | 22 +++++++++++++--------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/libs/ardour/plugin.cc b/libs/ardour/plugin.cc index e76353e8d5..9b2170c349 100644 --- a/libs/ardour/plugin.cc +++ b/libs/ardour/plugin.cc @@ -395,7 +395,7 @@ Plugin::get_state () add_state (root); #else if (!seen_get_state_message) { - info << string_compose (_("Saving AudioUnit settings is not supported in this build of %1. Consider paying for a newer version"), + info << string_compose (_("Saving plugin settings is not supported in this build of %1. Consider paying for the full version"), PROGRAM_NAME) << endmsg; seen_get_state_message = true; diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index e87cb4b03f..9d7dc8792b 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -2558,21 +2558,25 @@ Route::set_processor_state (const XMLNode& node) continue; } -#ifndef NO_PLUGIN_STATE - if (processor->set_state (**niter, Stateful::current_state_version) != 0) { - /* This processor could not be configured. Turn it into a UnknownProcessor */ - processor.reset (new UnknownProcessor (_session, **niter)); - } -#else if (boost::dynamic_pointer_cast(processor)) { +#ifndef NO_PLUGIN_STATE if (processor->set_state (**niter, Stateful::current_state_version) != 0) { /* This processor could not be configured. Turn it into a UnknownProcessor */ processor.reset (new UnknownProcessor (_session, **niter)); } - } else { - /* plugin, but ::set_state() not * allowed no message here - things will get too verbose */ - } +#else + /* plugin, with NO_PLUGIN_STATE defined + * =>::set_state() not allowed. Do not + * display a message here - things will + * get too verbose. + */ #endif + } else { + if (processor->set_state (**niter, Stateful::current_state_version) != 0) { + /* This processor could not be configured. Turn it into a UnknownProcessor */ + processor.reset (new UnknownProcessor (_session, **niter)); + } + } /* we have to note the monitor send here, otherwise a new one will be created and the state of this one will be lost. From 90f5eb4a31bebeb315d4c36f20b1aefe110657d0 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 15 Jul 2013 20:35:31 -0400 Subject: [PATCH 041/221] more plugin state debugging --- libs/ardour/route.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index 9d7dc8792b..d48fbeff96 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -2559,12 +2559,15 @@ Route::set_processor_state (const XMLNode& node) } if (boost::dynamic_pointer_cast(processor)) { + cerr << "Working on plugin processor state for " << processor->name() << endl; #ifndef NO_PLUGIN_STATE + cerr << "plugin state allowed\n"; if (processor->set_state (**niter, Stateful::current_state_version) != 0) { /* This processor could not be configured. Turn it into a UnknownProcessor */ processor.reset (new UnknownProcessor (_session, **niter)); } #else + cerr << "plugin state dis-allowed\n"; /* plugin, with NO_PLUGIN_STATE defined * =>::set_state() not allowed. Do not * display a message here - things will From 9cb678ebcc2ca0c7993bdd182c9e6ad1f8adf09a Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 15 Jul 2013 22:23:16 -0400 Subject: [PATCH 042/221] finally get to the bottom of where NO_PLUGIN_STATE needs to be in order to be useful --- libs/ardour/audio_unit.cc | 2 ++ libs/ardour/ladspa_plugin.cc | 10 ++++++++++ libs/ardour/lv2_plugin.cc | 3 +++ libs/ardour/plugin_insert.cc | 6 ++++++ libs/ardour/route.cc | 24 +++--------------------- libs/ardour/vst_plugin.cc | 4 +++- 6 files changed, 27 insertions(+), 22 deletions(-) diff --git a/libs/ardour/audio_unit.cc b/libs/ardour/audio_unit.cc index 0e9a11e6df..20a55e49f9 100644 --- a/libs/ardour/audio_unit.cc +++ b/libs/ardour/audio_unit.cc @@ -1717,6 +1717,7 @@ AUPlugin::set_state(const XMLNode& node, int version) return -1; } +#ifndef NO_PLUGIN_STATE if (node.children().empty()) { return -1; } @@ -1752,6 +1753,7 @@ AUPlugin::set_state(const XMLNode& node, int version) } CFRelease (propertyList); } +#endif Plugin::set_state (node, version); return ret; diff --git a/libs/ardour/ladspa_plugin.cc b/libs/ardour/ladspa_plugin.cc index cebff59771..1ab00e0b34 100644 --- a/libs/ardour/ladspa_plugin.cc +++ b/libs/ardour/ladspa_plugin.cc @@ -34,6 +34,7 @@ #include "pbd/compose.h" #include "pbd/error.h" #include "pbd/xml++.h" +#include "pbd/stacktrace.h" #include "midi++/manager.h" @@ -360,6 +361,7 @@ LadspaPlugin::set_state (const XMLNode& node, int version) return set_state_2X (node, version); } +#ifndef NO_PLUGIN_STATE XMLNodeList nodes; XMLProperty *prop; XMLNodeConstIterator iter; @@ -367,6 +369,7 @@ LadspaPlugin::set_state (const XMLNode& node, int version) const char *port; const char *data; uint32_t port_id; +#endif LocaleGuard lg (X_("POSIX")); if (node.name() != state_node_name()) { @@ -374,6 +377,8 @@ LadspaPlugin::set_state (const XMLNode& node, int version) return -1; } +#ifndef NO_PLUGIN_STATE + nodes = node.children ("Port"); for (iter = nodes.begin(); iter != nodes.end(); ++iter) { @@ -396,6 +401,7 @@ LadspaPlugin::set_state (const XMLNode& node, int version) sscanf (port, "%" PRIu32, &port_id); set_parameter (port_id, atof(data)); } +#endif latency_compute_run (); @@ -405,6 +411,7 @@ LadspaPlugin::set_state (const XMLNode& node, int version) int LadspaPlugin::set_state_2X (const XMLNode& node, int /* version */) { +#ifndef NO_PLUGIN_STATE XMLNodeList nodes; XMLProperty *prop; XMLNodeConstIterator iter; @@ -412,6 +419,7 @@ LadspaPlugin::set_state_2X (const XMLNode& node, int /* version */) const char *port; const char *data; uint32_t port_id; +#endif LocaleGuard lg (X_("POSIX")); if (node.name() != state_node_name()) { @@ -419,6 +427,7 @@ LadspaPlugin::set_state_2X (const XMLNode& node, int /* version */) return -1; } +#ifndef NO_PLUGIN_STATE nodes = node.children ("port"); for(iter = nodes.begin(); iter != nodes.end(); ++iter){ @@ -443,6 +452,7 @@ LadspaPlugin::set_state_2X (const XMLNode& node, int /* version */) } latency_compute_run (); +#endif return 0; } diff --git a/libs/ardour/lv2_plugin.cc b/libs/ardour/lv2_plugin.cc index df33e6c38d..5ea76934a5 100644 --- a/libs/ardour/lv2_plugin.cc +++ b/libs/ardour/lv2_plugin.cc @@ -1233,6 +1233,8 @@ LV2Plugin::set_state(const XMLNode& node, int version) return -1; } +#ifndef NO_PLUGIN_STATE + if (version < 3000) { nodes = node.children("port"); } else { @@ -1288,6 +1290,7 @@ LV2Plugin::set_state(const XMLNode& node, int version) } latency_compute_run(); +#endif return Plugin::set_state(node, version); } diff --git a/libs/ardour/plugin_insert.cc b/libs/ardour/plugin_insert.cc index 23cebf4276..998a03e3aa 100644 --- a/libs/ardour/plugin_insert.cc +++ b/libs/ardour/plugin_insert.cc @@ -882,7 +882,12 @@ PluginInsert::set_control_ids (const XMLNode& node, int version) if ((prop = (*iter)->property (X_("parameter"))) != 0) { uint32_t p = atoi (prop->value()); + + /* this may create the new controllable */ + boost::shared_ptr c = control (Evoral::Parameter (PluginAutomation, 0, p)); + +#ifndef NO_PLUGIN_STATE if (!c) { continue; } @@ -890,6 +895,7 @@ PluginInsert::set_control_ids (const XMLNode& node, int version) if (ac) { ac->set_state (**iter, version); } +#endif } } } diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index d48fbeff96..dad1922488 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -2558,27 +2558,9 @@ Route::set_processor_state (const XMLNode& node) continue; } - if (boost::dynamic_pointer_cast(processor)) { - cerr << "Working on plugin processor state for " << processor->name() << endl; -#ifndef NO_PLUGIN_STATE - cerr << "plugin state allowed\n"; - if (processor->set_state (**niter, Stateful::current_state_version) != 0) { - /* This processor could not be configured. Turn it into a UnknownProcessor */ - processor.reset (new UnknownProcessor (_session, **niter)); - } -#else - cerr << "plugin state dis-allowed\n"; - /* plugin, with NO_PLUGIN_STATE defined - * =>::set_state() not allowed. Do not - * display a message here - things will - * get too verbose. - */ -#endif - } else { - if (processor->set_state (**niter, Stateful::current_state_version) != 0) { - /* This processor could not be configured. Turn it into a UnknownProcessor */ - processor.reset (new UnknownProcessor (_session, **niter)); - } + if (processor->set_state (**niter, Stateful::current_state_version) != 0) { + /* This processor could not be configured. Turn it into a UnknownProcessor */ + processor.reset (new UnknownProcessor (_session, **niter)); } /* we have to note the monitor send here, otherwise a new one will be created diff --git a/libs/ardour/vst_plugin.cc b/libs/ardour/vst_plugin.cc index c385e71a5a..b80a594495 100644 --- a/libs/ardour/vst_plugin.cc +++ b/libs/ardour/vst_plugin.cc @@ -197,14 +197,15 @@ int VSTPlugin::set_state (const XMLNode& node, int version) { LocaleGuard lg (X_("POSIX")); + int ret = -1; if (node.name() != state_node_name()) { error << _("Bad node sent to VSTPlugin::set_state") << endmsg; return 0; } +#ifndef NO_PLUGIN_STATE XMLNode* child; - int ret = -1; if ((child = find_named_node (node, X_("chunk"))) != 0) { @@ -237,6 +238,7 @@ VSTPlugin::set_state (const XMLNode& node, int version) ret = 0; } +#endif Plugin::set_state (node, version); return ret; From 7f6765ece4391cfed18577a92dd15c16da9fefe1 Mon Sep 17 00:00:00 2001 From: "Michael R. Fisher" Date: Mon, 15 Jul 2013 16:35:20 -0500 Subject: [PATCH 043/221] OSX GUI - Prevent compiler errors when -std=c++11 is switched on --- gtk2_ardour/au_pluginui.mm | 2 +- gtk2_ardour/cocoacarbon.mm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gtk2_ardour/au_pluginui.mm b/gtk2_ardour/au_pluginui.mm index 7bebcee84f..bbae272116 100644 --- a/gtk2_ardour/au_pluginui.mm +++ b/gtk2_ardour/au_pluginui.mm @@ -658,7 +658,7 @@ AUPluginUI::parent_cocoa_window () /* move the au_view down so that it doesn't overlap the top_box contents */ - NSPoint origin = { 0, a.height }; + NSPoint origin = { 0, static_cast (a.height) }; [au_view setFrameOrigin:origin]; [view addSubview:au_view positioned:NSWindowBelow relativeTo:nil]; diff --git a/gtk2_ardour/cocoacarbon.mm b/gtk2_ardour/cocoacarbon.mm index 072008e9a1..76b92cb91f 100644 --- a/gtk2_ardour/cocoacarbon.mm +++ b/gtk2_ardour/cocoacarbon.mm @@ -112,7 +112,7 @@ set_language_preference () break; } } - NSRange r = { 0, count }; + NSRange r = { 0, static_cast (count) }; setenv ("LANGUAGE", [[[languages subarrayWithRange:r] componentsJoinedByString:@":"] UTF8String], 0); cout << "LANGUAGE set to " << getenv ("LANGUAGE") << endl; } From 5e739dbfc1ee5b631c285c68f69327951db53494 Mon Sep 17 00:00:00 2001 From: "Michael R. Fisher" Date: Mon, 15 Jul 2013 16:38:54 -0500 Subject: [PATCH 044/221] Typo fixed: call class method instead of trying to use as a variable --- libs/evoral/evoral/PatchChange.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/evoral/evoral/PatchChange.hpp b/libs/evoral/evoral/PatchChange.hpp index b1a42c6f2e..53b50a3383 100644 --- a/libs/evoral/evoral/PatchChange.hpp +++ b/libs/evoral/evoral/PatchChange.hpp @@ -123,7 +123,7 @@ public: return time() < o.time(); } - if (bank != o.bank()) { + if (bank() != o.bank()) { return bank() < o.bank(); } From 3e11c80ac3adc2679b013e0d24746e4cc6308a1c Mon Sep 17 00:00:00 2001 From: "Michael R. Fisher" Date: Mon, 15 Jul 2013 16:42:20 -0500 Subject: [PATCH 045/221] C++11 Building - Add space between macros and quoted strings --- gtk2_ardour/audio_clock.cc | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/gtk2_ardour/audio_clock.cc b/gtk2_ardour/audio_clock.cc index a0b48b3557..12d3a1642f 100644 --- a/gtk2_ardour/audio_clock.cc +++ b/gtk2_ardour/audio_clock.cc @@ -997,18 +997,18 @@ AudioClock::set_slave_info () switch (sync_src) { case JACK: - _left_layout->set_markup (string_compose (""TXTSPAN"%2", + _left_layout->set_markup (string_compose ("" TXTSPAN "%2", INFO_FONT_SIZE, sync_source_to_string(sync_src, true))); _right_layout->set_text (""); break; case MIDIClock: if (slave) { - _left_layout->set_markup (string_compose (""TXTSPAN"%2", + _left_layout->set_markup (string_compose ("" TXTSPAN "%2", INFO_FONT_SIZE, sync_source_to_string(sync_src, true))); - _right_layout->set_markup (string_compose (""TXTSPAN"%2", + _right_layout->set_markup (string_compose ("" TXTSPAN "%2", INFO_FONT_SIZE, slave->approximate_current_delta())); } else { - _left_layout->set_markup (string_compose (""TXTSPAN"%2", + _left_layout->set_markup (string_compose ("" TXTSPAN "%2", INFO_FONT_SIZE, _("--pending--"))); _right_layout->set_text (""); } @@ -1020,21 +1020,21 @@ AudioClock::set_slave_info () TimecodeSlave* tcslave; if ((tcslave = dynamic_cast(_session->slave())) != 0) { matching = (tcslave->apparent_timecode_format() == _session->config.get_timecode_format()); - _left_layout->set_markup (string_compose (""TXTSPAN"%2%4", + _left_layout->set_markup (string_compose ("" TXTSPAN "%2%4", INFO_FONT_SIZE, sync_source_to_string(sync_src, true)[0], (matching?"green":"red"), dynamic_cast(slave)->approximate_current_position())); - _right_layout->set_markup (string_compose (""TXTSPAN"%2", + _right_layout->set_markup (string_compose ("" TXTSPAN "%2", INFO_FONT_SIZE, slave->approximate_current_delta())); } } else { - _left_layout->set_markup (string_compose (""TXTSPAN"%2", + _left_layout->set_markup (string_compose ("" TXTSPAN "%2", INFO_FONT_SIZE, _("--pending--"))); _right_layout->set_text (""); } break; } } else { - _left_layout->set_markup (string_compose (""TXTSPAN"INT/%2", + _left_layout->set_markup (string_compose ("" TXTSPAN "INT/%2", INFO_FONT_SIZE, sync_source_to_string(sync_src, true))); _right_layout->set_text (""); } @@ -1079,17 +1079,17 @@ AudioClock::set_frames (framepos_t when, bool /*force*/) sprintf (buf, "%" PRId64 "Hz", rate); } - _left_layout->set_markup (string_compose (""TXTSPAN"%2 %3", + _left_layout->set_markup (string_compose ("" TXTSPAN "%2 %3", INFO_FONT_SIZE, _("SR"), buf)); float vid_pullup = _session->config.get_video_pullup(); if (vid_pullup == 0.0) { - _right_layout->set_markup (string_compose (""TXTSPAN"%2 off", + _right_layout->set_markup (string_compose ("" TXTSPAN "%2 off", INFO_FONT_SIZE, _("Pull"))); } else { sprintf (buf, _("%+.4f%%"), vid_pullup); - _right_layout->set_markup (string_compose (""TXTSPAN"%2 %3", + _right_layout->set_markup (string_compose ("" TXTSPAN "%2 %3", INFO_FONT_SIZE, _("Pull"), buf)); } } @@ -1233,11 +1233,11 @@ AudioClock::set_bbt (framepos_t when, bool /*force*/) TempoMetric m (_session->tempo_map().metric_at (pos)); sprintf (buf, "%-5.1f", m.tempo().beats_per_minute()); - _left_layout->set_markup (string_compose (""TXTSPAN"%3 %2", + _left_layout->set_markup (string_compose ("" TXTSPAN "%3 %2", INFO_FONT_SIZE, buf, _("Tempo"))); sprintf (buf, "%g/%g", m.meter().divisions_per_bar(), m.meter().note_divisor()); - _right_layout->set_markup (string_compose (""TXTSPAN"%3 %2", + _right_layout->set_markup (string_compose ("" TXTSPAN "%3 %2", INFO_FONT_SIZE, buf, _("Meter"))); } } From 693713ecdb0bd4024f0a45aac6b74bd00d00eae4 Mon Sep 17 00:00:00 2001 From: "Michael R. Fisher" Date: Mon, 15 Jul 2013 16:44:03 -0500 Subject: [PATCH 046/221] Allow compiling with c++11 enabled --- libs/audiographer/audiographer/debug_utils.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libs/audiographer/audiographer/debug_utils.h b/libs/audiographer/audiographer/debug_utils.h index a1d8259716..a1dad22eaf 100644 --- a/libs/audiographer/audiographer/debug_utils.h +++ b/libs/audiographer/audiographer/debug_utils.h @@ -3,6 +3,7 @@ #include "flag_field.h" +#include #include #ifdef __GNUC__ @@ -24,7 +25,7 @@ struct DebugUtils char * res = abi::__cxa_demangle (typeid(obj).name(), 0, 0, &status); if (status == 0) { std::string s(res); - free (res); + std::free (res); return s; } #endif From 65eb0b845f1e028d0b310cfe112730c6a62f3efd Mon Sep 17 00:00:00 2001 From: "Michael R. Fisher" Date: Mon, 15 Jul 2013 16:45:34 -0500 Subject: [PATCH 047/221] Include evoral/Note.hpp before pbd/compose.h - This workaround prevents a clang compiler error about template visibility --- libs/evoral/src/Sequence.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libs/evoral/src/Sequence.cpp b/libs/evoral/src/Sequence.cpp index b56c234d75..204ef58f33 100644 --- a/libs/evoral/src/Sequence.cpp +++ b/libs/evoral/src/Sequence.cpp @@ -24,6 +24,10 @@ #include #include +#if __clang__ +#include "evoral/Note.hpp" +#endif + #include "pbd/compose.h" #include "pbd/error.h" From bf153e58a5e3b31536648bff4b95bf6e0a107c6c Mon Sep 17 00:00:00 2001 From: "Michael R. Fisher" Date: Mon, 15 Jul 2013 16:47:07 -0500 Subject: [PATCH 048/221] C++11 Building - Use new style struct field inititializing - clang with std=c++11 enabled was failing here --- libs/surfaces/generic_midi/interface.cc | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/libs/surfaces/generic_midi/interface.cc b/libs/surfaces/generic_midi/interface.cc index 94edb0ba80..57f56bd399 100644 --- a/libs/surfaces/generic_midi/interface.cc +++ b/libs/surfaces/generic_midi/interface.cc @@ -56,17 +56,17 @@ probe_generic_midi_protocol (ControlProtocolDescriptor* /*descriptor*/) } static ControlProtocolDescriptor generic_midi_descriptor = { - name : "Generic MIDI", - id : "uri://ardour.org/surfaces/generic_midi:0", - ptr : 0, - module : 0, - mandatory : 0, - supports_feedback : true, - probe : probe_generic_midi_protocol, - initialize : new_generic_midi_protocol, - destroy : delete_generic_midi_protocol + .name = "Generic MIDI", + .id = "uri://ardour.org/surfaces/generic_midi:0", + .ptr = 0, + .module = 0, + .mandatory = 0, + .supports_feedback = true, + .probe = probe_generic_midi_protocol, + .initialize = new_generic_midi_protocol, + .destroy = delete_generic_midi_protocol }; - + extern "C" { ControlProtocolDescriptor* From fa1086d82d497d61140bb164abd7b9c94d1a9d28 Mon Sep 17 00:00:00 2001 From: "Michael R. Fisher" Date: Mon, 15 Jul 2013 16:52:50 -0500 Subject: [PATCH 049/221] Dereference pointers in ctors where appropriate. (c++11 wants this) --- gtk2_ardour/window_manager.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gtk2_ardour/window_manager.h b/gtk2_ardour/window_manager.h index 3a80840891..ca33b30234 100644 --- a/gtk2_ardour/window_manager.h +++ b/gtk2_ardour/window_manager.h @@ -151,7 +151,7 @@ class ProxyWithConstructor: public ProxyBase { : ProxyBase (name, menu_name) , creator (c) {} ProxyWithConstructor (const std::string& name, const std::string& menu_name, const boost::function& c, const XMLNode* node) - : ProxyBase (name, menu_name, node) , creator (c) {} + : ProxyBase (name, menu_name, *node) , creator (c) {} Gtk::Window* get (bool create = false) { if (!_window) { @@ -198,7 +198,7 @@ class Proxy : public ProxyBase { : ProxyBase (name, menu_name) {} Proxy (const std::string& name, const std::string& menu_name, const XMLNode* node) - : ProxyBase (name, menu_name, node) {} + : ProxyBase (name, menu_name, *node) {} Gtk::Window* get (bool create = false) { if (!_window) { From 066df0d218ee4391eb3e15259deca5ccc190ed84 Mon Sep 17 00:00:00 2001 From: "Michael R. Fisher" Date: Mon, 15 Jul 2013 16:53:55 -0500 Subject: [PATCH 050/221] Temporary OSX/Clang/C++11 workaround - Adds a directive that includes upon specific conditions - WIP --- libs/pbd/pbd/stl_delete.h | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/libs/pbd/pbd/stl_delete.h b/libs/pbd/pbd/stl_delete.h index 66fb027387..ac2161560c 100644 --- a/libs/pbd/pbd/stl_delete.h +++ b/libs/pbd/pbd/stl_delete.h @@ -20,11 +20,19 @@ #ifndef __libmisc_stl_delete_h__ #define __libmisc_stl_delete_h__ + +#if __clang__ && __APPLE__ && __cplusplus >= 201103L +#include +#ifndef _CPP_VECTOR +#define _CPP_VECTOR +#endif +#endif + /* To actually use any of these deletion functions, you need to first include the revelant container type header. */ #if defined(_CPP_VECTOR) || defined(_GLIBCXX_VECTOR) || defined(__SGI_STL_VECTOR) -template void vector_delete (std::vector *vec) +template void vector_delete (std::vector *vec) { typename std::vector::iterator i; From cdef4aa50f64daf784590a8f27f1ba11c03f1884 Mon Sep 17 00:00:00 2001 From: "Michael R. Fisher" Date: Mon, 15 Jul 2013 17:27:21 -0500 Subject: [PATCH 051/221] Add c++11 enablement options in wscript - adds "--cxx11" toggle for ./waf configure - The switch adds appropriate compiler flags and tests the compiler for usability of c++11 - This 'should' be compatible for linux, osx, and windows systems that have gcc and/or clang with support c++11 --- wscript | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/wscript b/wscript index a6106c0aef..48e30ef7ea 100644 --- a/wscript +++ b/wscript @@ -110,6 +110,22 @@ def set_compiler_flags (conf,opt): # waf adds -O0 -g itself. thanks waf! is_clang = conf.env['CXX'][0].endswith('clang++') + + if conf.options.cxx11: + conf.check_cxx(cxxflags=["-std=c++11"]) + conf.env.append_unique('CXXFLAGS', ['-std=c++11']) + if platform == "darwin": + conf.env.append_unique('CXXFLAGS', ['-stdlib=libc++']) + conf.env.append_unique('LINKFLAGS', ['-lc++']) + # Prevents visibility issues in standard headers + conf.define("_DARWIN_C_SOURCE", 1) + + if is_clang and platform == "darwin": + # Silence warnings about the non-existing osx clang compiler flags + # -compatibility_version and -current_version. These are Waf + # generated and not needed with clang + conf.env.append_unique ("CXXFLAGS", ["-Qunused-arguments"]) + if opt.gprofile: debug_flags = [ '-pg' ] @@ -454,6 +470,8 @@ def options(opt): help='directory where Wine\'s Windows header files can be found') opt.add_option('--noconfirm', action='store_true', default=False, dest='noconfirm', help='Do not ask questions that require confirmation during the build') + opt.add_option('--cxx11', action='store_true', default=False, dest='cxx11', + help='Turn on c++11 compiler flags (-std=c++11)') for i in children: opt.recurse(i) From 9a25fcbfe13f56665beb93a7f248f7ba8eeaa580 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 16 Jul 2013 15:11:50 +0200 Subject: [PATCH 052/221] fix input metering: if meter==input, meter depends on In/Disk see also 29108187ed --- libs/ardour/audio_track.cc | 2 +- libs/ardour/midi_track.cc | 2 +- libs/ardour/track.cc | 10 +++++++++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/libs/ardour/audio_track.cc b/libs/ardour/audio_track.cc index b4ca9e2df8..70f385a890 100644 --- a/libs/ardour/audio_track.cc +++ b/libs/ardour/audio_track.cc @@ -354,7 +354,7 @@ AudioTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_fram fill_buffers_with_input (bufs, _input, nframes); - if (_meter_point == MeterInput) { + if (_meter_point == MeterInput && (_monitoring & MonitorInput)) { _meter->run (bufs, start_frame, end_frame, nframes, true); } diff --git a/libs/ardour/midi_track.cc b/libs/ardour/midi_track.cc index f7f9ff7a59..23077bafc8 100644 --- a/libs/ardour/midi_track.cc +++ b/libs/ardour/midi_track.cc @@ -354,7 +354,7 @@ MidiTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame fill_buffers_with_input (bufs, _input, nframes); - if (_meter_point == MeterInput) { + if (_meter_point == MeterInput && (_monitoring & MonitorInput)) { _meter->run (bufs, start_frame, end_frame, nframes, true); } diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc index 6d153e1cbf..b88cc0480a 100644 --- a/libs/ardour/track.cc +++ b/libs/ardour/track.cc @@ -945,6 +945,14 @@ Track::set_monitoring (MonitorChoice mc) MeterState Track::metering_state () const { - return (_diskstream->record_enabled() || _meter_point == MeterInput) ? MeteringInput : MeteringRoute; + bool rv; + if (_session.transport_rolling ()) { + // audio_track.cc || midi_track.cc roll() runs meter IFF: + rv = _meter_point == MeterInput && (_monitoring & MonitorInput); + } else { + // track no_roll() always metering if + rv = _meter_point == MeterInput; + } + return rv ? MeteringInput : MeteringRoute; } From e9289a19c8101ea584167d468748d2499664bc03 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 16 Jul 2013 16:04:41 +0200 Subject: [PATCH 053/221] fix "monitor mode 11" see http://www.oofus.co.uk/ardour/Ardour3MonitorModesV2.pdf the overall logic can probably be simplified somewhat track-rec-enable on -> always monitor input --- libs/ardour/audio_track.cc | 2 +- libs/ardour/midi_track.cc | 2 +- libs/ardour/track.cc | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libs/ardour/audio_track.cc b/libs/ardour/audio_track.cc index 70f385a890..ad2c3a96e1 100644 --- a/libs/ardour/audio_track.cc +++ b/libs/ardour/audio_track.cc @@ -354,7 +354,7 @@ AudioTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_fram fill_buffers_with_input (bufs, _input, nframes); - if (_meter_point == MeterInput && (_monitoring & MonitorInput)) { + if (_meter_point == MeterInput && (_monitoring & MonitorInput || _diskstream->record_enabled())) { _meter->run (bufs, start_frame, end_frame, nframes, true); } diff --git a/libs/ardour/midi_track.cc b/libs/ardour/midi_track.cc index 23077bafc8..16a0e89077 100644 --- a/libs/ardour/midi_track.cc +++ b/libs/ardour/midi_track.cc @@ -354,7 +354,7 @@ MidiTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame fill_buffers_with_input (bufs, _input, nframes); - if (_meter_point == MeterInput && (_monitoring & MonitorInput)) { + if (_meter_point == MeterInput && (_monitoring & MonitorInput || _diskstream->record_enabled())) { _meter->run (bufs, start_frame, end_frame, nframes, true); } diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc index b88cc0480a..1cf9887594 100644 --- a/libs/ardour/track.cc +++ b/libs/ardour/track.cc @@ -948,7 +948,7 @@ Track::metering_state () const bool rv; if (_session.transport_rolling ()) { // audio_track.cc || midi_track.cc roll() runs meter IFF: - rv = _meter_point == MeterInput && (_monitoring & MonitorInput); + rv = _meter_point == MeterInput && (_monitoring & MonitorInput || _diskstream->record_enabled()); } else { // track no_roll() always metering if rv = _meter_point == MeterInput; From a716f3c55a0bae667977545c3d190f6f78f4db72 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 16 Jul 2013 16:25:27 +0200 Subject: [PATCH 054/221] RMS meter - reset after calculating new data --- libs/ardour/kmeterdsp.cc | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/libs/ardour/kmeterdsp.cc b/libs/ardour/kmeterdsp.cc index 77d1a87a81..afd0f71719 100644 --- a/libs/ardour/kmeterdsp.cc +++ b/libs/ardour/kmeterdsp.cc @@ -46,12 +46,6 @@ void Kmeterdsp::process (float *p, int n) float s, t, z1, z2; - if (_flag) // Display thread has read the rms value. - { - _rms = 0; - _flag = false; - } - // Get filter state. z1 = _z1; z2 = _z2; @@ -88,9 +82,18 @@ void Kmeterdsp::process (float *p, int n) _z1 = z1 + 1e-20f; _z2 = z2 + 1e-20f; - // Adjust RMS value and update maximum since last read(). s = sqrtf (2 * z2); - if (s > _rms) _rms = s; + + if (_flag) // Display thread has read the rms value. + { + _rms = s; + _flag = false; + } + else + { + // Adjust RMS value and update maximum since last read(). + if (s > _rms) _rms = s; + } } From 8f5cc1dbbae40378b9fa7c046d31a12b8497b570 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 16 Jul 2013 17:55:18 +0200 Subject: [PATCH 055/221] increase spacing between meter ticks and labels --- gtk2_ardour/meter_patterns.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index 80655af7b9..7818711922 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -364,11 +364,11 @@ meter_render_metrics (Gtk::Widget& w, vector types) snprintf (buf, sizeof (buf), "%+2d", j->first); pos = height - (gint) floor (height * fraction); if (tickleft) { - cairo_move_to(cr, width-2.5, pos + .5); + cairo_move_to(cr, width-1.5, pos + .5); cairo_line_to(cr, width, pos + .5); } else { cairo_move_to(cr, 0, pos + .5); - cairo_line_to(cr, 2.5, pos + .5); + cairo_line_to(cr, 1.5, pos + .5); } cairo_stroke (cr); break; @@ -398,7 +398,7 @@ meter_render_metrics (Gtk::Widget& w, vector types) p = min (p, height - th); p = max (p, 0); - cairo_move_to (cr, width-4-tw, p); + cairo_move_to (cr, width-3-tw, p); pango_cairo_show_layout (cr, layout->gobj()); } } From 003492cbf9b6636f97eba44481e08cbea46c5fea Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sun, 14 Jul 2013 16:34:49 +0200 Subject: [PATCH 056/221] move ff* structs & typedef into dedicated namespace (further avoid conflicts with plugins) --- gtk2_ardour/export_video_dialog.cc | 4 ++-- gtk2_ardour/transcode_ffmpeg.cc | 14 +++++++------- gtk2_ardour/transcode_ffmpeg.h | 21 +++++++++++---------- gtk2_ardour/transcode_video_dialog.cc | 4 ++-- 4 files changed, 22 insertions(+), 21 deletions(-) diff --git a/gtk2_ardour/export_video_dialog.cc b/gtk2_ardour/export_video_dialog.cc index ce85fad81e..eb4213b237 100644 --- a/gtk2_ardour/export_video_dialog.cc +++ b/gtk2_ardour/export_video_dialog.cc @@ -584,7 +584,7 @@ ExportVideoDialog::encode_pass (int pass) } std::string preset = preset_combo.get_active_text(); - FFSettings ffs ; /* = transcoder->default_encoder_settings(); */ + TranscodeFfmpeg::FFSettings ffs ; /* = transcoder->default_encoder_settings(); */ ffs.clear(); if (fps_checkbox.get_active()) { @@ -740,7 +740,7 @@ ExportVideoDialog::encode_pass (int pass) transcoder->set_avoffset(av_offset / (double)_session->nominal_frame_rate()); } - FFSettings meta = transcoder->default_meta_data(); + TranscodeFfmpeg::FFSettings meta = transcoder->default_meta_data(); if (meta_checkbox.get_active()) { ARDOUR::SessionMetadata * session_data = ARDOUR::SessionMetadata::Metadata(); if (session_data->year() > 0 ) { diff --git a/gtk2_ardour/transcode_ffmpeg.cc b/gtk2_ardour/transcode_ffmpeg.cc index 657b79ffba..9499c6c184 100644 --- a/gtk2_ardour/transcode_ffmpeg.cc +++ b/gtk2_ardour/transcode_ffmpeg.cc @@ -261,10 +261,10 @@ TranscodeFfmpeg::probe () return true; } -FFSettings +TranscodeFfmpeg::FFSettings TranscodeFfmpeg::default_encoder_settings () { - FFSettings ffs; + TranscodeFfmpeg::FFSettings ffs; ffs.clear(); ffs["-vcodec"] = "mpeg4"; ffs["-acodec"] = "ac3"; @@ -273,10 +273,10 @@ TranscodeFfmpeg::default_encoder_settings () return ffs; } -FFSettings +TranscodeFfmpeg::FFSettings TranscodeFfmpeg::default_meta_data () { - FFSettings ffm; + TranscodeFfmpeg::FFSettings ffm; ffm.clear(); ffm["comment"] = "Created with ardour"; return ffm; @@ -308,7 +308,7 @@ TranscodeFfmpeg::format_metadata (std::string key, std::string value) } bool -TranscodeFfmpeg::encode (std::string outfile, std::string inf_a, std::string inf_v, FFSettings ffs, FFSettings meta, bool map) +TranscodeFfmpeg::encode (std::string outfile, std::string inf_a, std::string inf_v, TranscodeFfmpeg::FFSettings ffs, TranscodeFfmpeg::FFSettings meta, bool map) { #define MAX_FFMPEG_ENCODER_ARGS (100) char **argp; @@ -327,11 +327,11 @@ TranscodeFfmpeg::encode (std::string outfile, std::string inf_a, std::string inf argp[a++] = strdup("-i"); argp[a++] = strdup(inf_a.c_str()); - for(FFSettings::const_iterator it = ffs.begin(); it != ffs.end(); ++it) { + for(TranscodeFfmpeg::FFSettings::const_iterator it = ffs.begin(); it != ffs.end(); ++it) { argp[a++] = strdup(it->first.c_str()); argp[a++] = strdup(it->second.c_str()); } - for(FFSettings::const_iterator it = meta.begin(); it != meta.end(); ++it) { + for(TranscodeFfmpeg::FFSettings::const_iterator it = meta.begin(); it != meta.end(); ++it) { argp[a++] = strdup("-metadata"); argp[a++] = format_metadata(it->first.c_str(), it->second.c_str()); } diff --git a/gtk2_ardour/transcode_ffmpeg.h b/gtk2_ardour/transcode_ffmpeg.h index d1f445bf48..61267ac853 100644 --- a/gtk2_ardour/transcode_ffmpeg.h +++ b/gtk2_ardour/transcode_ffmpeg.h @@ -24,14 +24,6 @@ #include "ardour/types.h" #include "system_exec.h" -/* TODO: use a namespace here ? */ -struct FFAudioStream { - std::string name; - std::string stream_id; - uint32_t channels; -}; -typedef std::vector AudioStreams; -typedef std::map FFSettings; /** @class TranscodeFfmpeg * @brief wrapper around ffmpeg and ffprobe command-line utils @@ -46,6 +38,15 @@ class TranscodeFfmpeg : public sigc::trackable { public: + struct FFAudioStream { + std::string name; + std::string stream_id; + uint32_t channels; + }; + typedef std::vector FFAudioStreams; + typedef std::map FFSettings; + + /** instantiate a new transcoder. If a file-name is given, the file's * attributes (fps, duration, geometry etc) are read. * @@ -110,7 +111,7 @@ class TranscodeFfmpeg : public sigc::trackable ARDOUR::framecnt_t get_duration() { return m_duration; } std::string get_codec() { return m_codec; } - AudioStreams get_audio() { return m_audio; } + FFAudioStreams get_audio() { return m_audio; } /** override file duration used with the \ref Progress signal. * @param d duration in video-frames = length_in_seconds * get_fps() @@ -145,7 +146,7 @@ class TranscodeFfmpeg : public sigc::trackable bool ffexecok; bool probeok; - AudioStreams m_audio; + FFAudioStreams m_audio; char *format_metadata (std::string, std::string); void ffmpegparse_v (std::string d, size_t s); diff --git a/gtk2_ardour/transcode_video_dialog.cc b/gtk2_ardour/transcode_video_dialog.cc index fa5d447a3a..5c6ae0c7b4 100644 --- a/gtk2_ardour/transcode_video_dialog.cc +++ b/gtk2_ardour/transcode_video_dialog.cc @@ -88,7 +88,7 @@ TranscodeVideoDialog::TranscodeVideoDialog (Session* s, std::string infile) int w = 0, h = 0; m_aspect = 4.0/3.0; - AudioStreams as; as.clear(); + TranscodeFfmpeg::FFAudioStreams as; as.clear(); path_hbox->pack_start (path_label, false, false, 3); path_hbox->pack_start (path_entry, true, true, 3); @@ -227,7 +227,7 @@ TranscodeVideoDialog::TranscodeVideoDialog (Session* s, std::string infile) t->attach (audio_combo, 1, 4, 2, 3); audio_combo.append_text("No audio"); if (as.size() > 0) { - for (AudioStreams::iterator it = as.begin(); it < as.end(); ++it) { + for (TranscodeFfmpeg::FFAudioStreams::iterator it = as.begin(); it < as.end(); ++it) { audio_combo.append_text((*it).name); } } From c456166dd163e12053c7cfd4554f695ab0d30b68 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 16 Jul 2013 19:36:57 +0200 Subject: [PATCH 057/221] zero meters for inactive tracks --- libs/ardour/audio_track.cc | 3 +++ libs/ardour/meter.cc | 4 ++++ libs/ardour/midi_track.cc | 3 +++ libs/ardour/track.cc | 3 +++ 4 files changed, 13 insertions(+) diff --git a/libs/ardour/audio_track.cc b/libs/ardour/audio_track.cc index ad2c3a96e1..4b33bbd4c6 100644 --- a/libs/ardour/audio_track.cc +++ b/libs/ardour/audio_track.cc @@ -325,6 +325,9 @@ AudioTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_fram if (!_active) { silence (nframes); + if (_meter_point == MeterInput && (_monitoring & MonitorInput || _diskstream->record_enabled())) { + _meter->reset(); + } return 0; } diff --git a/libs/ardour/meter.cc b/libs/ardour/meter.cc index f239a1c4b7..90f0977e4d 100644 --- a/libs/ardour/meter.cc +++ b/libs/ardour/meter.cc @@ -116,6 +116,10 @@ PeakMeter::reset () for (size_t i = 0; i < _peak_signal.size(); ++i) { _peak_signal[i] = 0.0f; } + + for (size_t n = 0; n < _kmeter.size(); ++n) { + _kmeter[n]->reset(); + } } void diff --git a/libs/ardour/midi_track.cc b/libs/ardour/midi_track.cc index 16a0e89077..c7768c7249 100644 --- a/libs/ardour/midi_track.cc +++ b/libs/ardour/midi_track.cc @@ -330,6 +330,9 @@ MidiTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame if (!_active) { silence (nframes); + if (_meter_point == MeterInput && (_monitoring & MonitorInput || _diskstream->record_enabled())) { + _meter->reset(); + } return 0; } diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc index 1cf9887594..d2c9b1deb5 100644 --- a/libs/ardour/track.cc +++ b/libs/ardour/track.cc @@ -347,6 +347,9 @@ Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, if (!_active) { silence (nframes); + if (_meter_point == MeterInput && (_monitoring & MonitorInput || _diskstream->record_enabled())) { + _meter->reset(); + } return 0; } From 2231db91cdeea8111961b3eeb94e2d87df6f9e8a Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 16 Jul 2013 19:37:36 +0200 Subject: [PATCH 058/221] fix metering states 34, 38, 49, 50, 53 and 54 for state descriptions see http://www.oofus.co.uk/ardour/Ardour3MonitorModesV3.pdf --- libs/ardour/io.cc | 4 +++- libs/ardour/track.cc | 19 +++++++++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/libs/ardour/io.cc b/libs/ardour/io.cc index cdb8a4693c..21fdca6e96 100644 --- a/libs/ardour/io.cc +++ b/libs/ardour/io.cc @@ -1639,7 +1639,9 @@ IO::process_input (boost::shared_ptr proc, framepos_t start_frame, fr } _buffers.get_jack_port_addresses (_ports, nframes); - proc->run (_buffers, start_frame, end_frame, nframes, true); + if (proc) { + proc->run (_buffers, start_frame, end_frame, nframes, true); + } } void diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc index d2c9b1deb5..d4c095d738 100644 --- a/libs/ardour/track.cc +++ b/libs/ardour/track.cc @@ -408,8 +408,23 @@ Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, if (be_silent) { if (_meter_point == MeterInput) { - /* still need input monitoring */ - _input->process_input (_meter, start_frame, end_frame, nframes); + /* still need input monitoring and metering */ + + bool const track_rec = _diskstream->record_enabled (); + bool const auto_input = _session.config.get_auto_input (); + bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring; + bool const tape_machine_mode = Config->get_tape_machine_mode (); + + if (!software_monitor && tape_machine_mode && !track_rec) { + _meter->reset(); + _input->process_input (boost::shared_ptr(), start_frame, end_frame, nframes); + } + else if (!software_monitor && !tape_machine_mode && !track_rec && !auto_input) { + _meter->reset(); + _input->process_input (boost::shared_ptr(), start_frame, end_frame, nframes); + } else { + _input->process_input (_meter, start_frame, end_frame, nframes); + } } passthru_silence (start_frame, end_frame, nframes, 0); From f842e8af2340b7836f961e2ebfb100950c5831d3 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 16 Jul 2013 20:37:30 +0200 Subject: [PATCH 059/221] yet another meter+monitoring detail: "explicit Monitor DISK" + "Transport Stop" + "not track rec-en" -> meter is always zero --- libs/ardour/track.cc | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc index d4c095d738..e8eea740b1 100644 --- a/libs/ardour/track.cc +++ b/libs/ardour/track.cc @@ -414,12 +414,19 @@ Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool const auto_input = _session.config.get_auto_input (); bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring; bool const tape_machine_mode = Config->get_tape_machine_mode (); + bool no_meter = false; - if (!software_monitor && tape_machine_mode && !track_rec) { - _meter->reset(); - _input->process_input (boost::shared_ptr(), start_frame, end_frame, nframes); + if (_monitoring & MonitorDisk && !track_rec) { + no_meter=true; + } + else if (!software_monitor && tape_machine_mode && !track_rec) { + no_meter=true; } else if (!software_monitor && !tape_machine_mode && !track_rec && !auto_input) { + no_meter=true; + } + + if (no_meter) { _meter->reset(); _input->process_input (boost::shared_ptr(), start_frame, end_frame, nframes); } else { From 1b97f147eb0af7cbdc6f1311679824b8e383d176 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 16 Jul 2013 14:52:52 -0400 Subject: [PATCH 060/221] Revert "C++11 Building - Use new style struct field inititializing" (this code change breaks gcc on several platforms). This reverts commit bf153e58a5e3b31536648bff4b95bf6e0a107c6c. --- libs/surfaces/generic_midi/interface.cc | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/libs/surfaces/generic_midi/interface.cc b/libs/surfaces/generic_midi/interface.cc index 57f56bd399..94edb0ba80 100644 --- a/libs/surfaces/generic_midi/interface.cc +++ b/libs/surfaces/generic_midi/interface.cc @@ -56,17 +56,17 @@ probe_generic_midi_protocol (ControlProtocolDescriptor* /*descriptor*/) } static ControlProtocolDescriptor generic_midi_descriptor = { - .name = "Generic MIDI", - .id = "uri://ardour.org/surfaces/generic_midi:0", - .ptr = 0, - .module = 0, - .mandatory = 0, - .supports_feedback = true, - .probe = probe_generic_midi_protocol, - .initialize = new_generic_midi_protocol, - .destroy = delete_generic_midi_protocol + name : "Generic MIDI", + id : "uri://ardour.org/surfaces/generic_midi:0", + ptr : 0, + module : 0, + mandatory : 0, + supports_feedback : true, + probe : probe_generic_midi_protocol, + initialize : new_generic_midi_protocol, + destroy : delete_generic_midi_protocol }; - + extern "C" { ControlProtocolDescriptor* From 81412b95beea58ef8b17781a0756dfbc1d3a39cb Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 16 Jul 2013 21:18:52 +0200 Subject: [PATCH 061/221] revert functionality of f842e8af2 (meter display in DISK mode) --- libs/ardour/track.cc | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc index e8eea740b1..522b9ebe05 100644 --- a/libs/ardour/track.cc +++ b/libs/ardour/track.cc @@ -416,10 +416,7 @@ Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool const tape_machine_mode = Config->get_tape_machine_mode (); bool no_meter = false; - if (_monitoring & MonitorDisk && !track_rec) { - no_meter=true; - } - else if (!software_monitor && tape_machine_mode && !track_rec) { + if (!software_monitor && tape_machine_mode && !track_rec) { no_meter=true; } else if (!software_monitor && !tape_machine_mode && !track_rec && !auto_input) { From 920154702fcf690c762301a96c49848a9a241674 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 16 Jul 2013 22:18:51 +0200 Subject: [PATCH 062/221] fix re-drawing of splitting icon --- gtk2_ardour/processor_box.cc | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/gtk2_ardour/processor_box.cc b/gtk2_ardour/processor_box.cc index 495845d2d4..7d2e39639b 100644 --- a/gtk2_ardour/processor_box.cc +++ b/gtk2_ardour/processor_box.cc @@ -655,10 +655,14 @@ PluginInsertProcessorEntry::SplittingIcon::on_expose_event (GdkEventExpose* ev) { cairo_t* cr = gdk_cairo_create (get_window()->gobj()); + cairo_rectangle (cr, ev->area.x, ev->area.y, ev->area.width, ev->area.height); + cairo_clip (cr); + cairo_set_line_width (cr, 1); - double const width = ev->area.width; - double const height = ev->area.height; + Gtk::Allocation a = get_allocation(); + double const width = a.get_width(); + double const height = a.get_height(); Gdk::Color const bg = get_style()->get_bg (STATE_NORMAL); cairo_set_source_rgb (cr, bg.get_red_p (), bg.get_green_p (), bg.get_blue_p ()); From f78d60a4a38228bb4c772e9a104ebb431bd6b940 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 16 Jul 2013 22:43:23 +0200 Subject: [PATCH 063/221] rework metering states 2, 6, 18 and 22 --- libs/ardour/track.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc index 522b9ebe05..3ad5733320 100644 --- a/libs/ardour/track.cc +++ b/libs/ardour/track.cc @@ -416,7 +416,10 @@ Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool const tape_machine_mode = Config->get_tape_machine_mode (); bool no_meter = false; - if (!software_monitor && tape_machine_mode && !track_rec) { + if (!auto_input && !track_rec) { + no_meter=true; + } + else if (!software_monitor && tape_machine_mode && !track_rec) { no_meter=true; } else if (!software_monitor && !tape_machine_mode && !track_rec && !auto_input) { From 562bd6811e55873fc63645094f10cb2668aacdba Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 16 Jul 2013 22:44:54 +0200 Subject: [PATCH 064/221] possible fix for http://tracker.ardour.org/view.php?id=5586 --- libs/gtkmm2ext/persistent_tooltip.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libs/gtkmm2ext/persistent_tooltip.cc b/libs/gtkmm2ext/persistent_tooltip.cc index ea0ffd63e9..77a8d94c0f 100644 --- a/libs/gtkmm2ext/persistent_tooltip.cc +++ b/libs/gtkmm2ext/persistent_tooltip.cc @@ -48,6 +48,9 @@ PersistentTooltip::~PersistentTooltip () bool PersistentTooltip::enter (GdkEventCrossing *) { + if (_timeout.connected()) { + leave(NULL); + } _timeout = Glib::signal_timeout().connect (sigc::mem_fun (*this, &PersistentTooltip::timeout), 500); return false; } From ec63180ef6c82e25b22a845cc4b99010d81cfc98 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 16 Jul 2013 23:30:21 +0200 Subject: [PATCH 065/221] meter-state 17 and 49 + code-comment --- libs/ardour/track.cc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc index 3ad5733320..c6a348ddfb 100644 --- a/libs/ardour/track.cc +++ b/libs/ardour/track.cc @@ -416,9 +416,18 @@ Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool const tape_machine_mode = Config->get_tape_machine_mode (); bool no_meter = false; + /* this needs a proper K-map + * and should be separated into a function similar to monitoring_state() + * that also handles roll() states in audio_track.cc, midi_track.cc and route.cc + * + * see http://www.oofus.co.uk/ardour/Ardour3MonitorModesV3.pdf + */ if (!auto_input && !track_rec) { no_meter=true; } + else if (tape_machine_mode && !track_rec && auto_input) { + no_meter=true; + } else if (!software_monitor && tape_machine_mode && !track_rec) { no_meter=true; } From fc0053a7218476065355fbdef933324e3d53885f Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 16 Jul 2013 18:54:45 -0400 Subject: [PATCH 066/221] bump actual publically visible version (oops) --- wscript | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wscript b/wscript index 48e30ef7ea..66d7c655e5 100644 --- a/wscript +++ b/wscript @@ -8,7 +8,7 @@ import subprocess import sys MAJOR = '3' -MINOR = '2' +MINOR = '3' VERSION = MAJOR + '.' + MINOR APPNAME = 'Ardour' + MAJOR From bf0f4fe07769718b70e65fb78830fb3b951148ac Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 17 Jul 2013 02:35:02 +0200 Subject: [PATCH 067/221] work around sparse motion notification events when tooltips are disabled fixes http://tracker.ardour.org/view.php?id=5174 --- gtk2_ardour/group_tabs.cc | 4 +++- gtk2_ardour/time_axis_view.cc | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/gtk2_ardour/group_tabs.cc b/gtk2_ardour/group_tabs.cc index 1332d4ba10..b8d30dc989 100644 --- a/gtk2_ardour/group_tabs.cc +++ b/gtk2_ardour/group_tabs.cc @@ -42,7 +42,7 @@ GroupTabs::GroupTabs () , _dragging (0) , _dragging_new_tab (0) { - + add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::POINTER_MOTION_MASK); } GroupTabs::~GroupTabs () @@ -175,6 +175,8 @@ GroupTabs::on_motion_notify_event (GdkEventMotion* ev) set_dirty (); queue_draw (); + gdk_event_request_motions(ev); + return true; } diff --git a/gtk2_ardour/time_axis_view.cc b/gtk2_ardour/time_axis_view.cc index fdb9782236..2cc2adf761 100644 --- a/gtk2_ardour/time_axis_view.cc +++ b/gtk2_ardour/time_axis_view.cc @@ -410,6 +410,7 @@ TimeAxisView::controls_ebox_motion (GdkEventMotion* ev) maybe_set_cursor (ev->y); } + gdk_event_request_motions(ev); return true; } From 780397d0ccf8df54eeb78c88eebbaab0c2745029 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 17 Jul 2013 13:35:45 +0200 Subject: [PATCH 068/221] possible fix for 5591 (show elements after re-adding them) --- gtk2_ardour/startup.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gtk2_ardour/startup.cc b/gtk2_ardour/startup.cc index e7edf5e995..0ec79667ab 100644 --- a/gtk2_ardour/startup.cc +++ b/gtk2_ardour/startup.cc @@ -917,6 +917,7 @@ ArdourStartup::setup_new_session_page () if (more_new_session_options_button.get_active()) { set_page_type (session_vbox, ASSISTANT_PAGE_CONTENT); } + session_hbox.show_all(); } void @@ -1092,6 +1093,7 @@ ArdourStartup::setup_existing_session_page () set_page_title (session_vbox, _("Select a session")); set_page_type (session_vbox, ASSISTANT_PAGE_CONFIRM); + session_hbox.show_all(); } void From 406070584df05cbc8877fcb005313c2e1ad25f02 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 17 Jul 2013 15:12:13 +0200 Subject: [PATCH 069/221] fix typo --- gtk2_ardour/rc_option_editor.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtk2_ardour/rc_option_editor.cc b/gtk2_ardour/rc_option_editor.cc index f78f5fc182..3f984eab29 100644 --- a/gtk2_ardour/rc_option_editor.cc +++ b/gtk2_ardour/rc_option_editor.cc @@ -831,7 +831,7 @@ public: t->attach (*l, 0, 1, 1, 2, FILL); t->attach (_video_server_url_entry, 1, 2, 1, 2, FILL); Gtkmm2ext::UI::instance()->set_tip (_video_server_url_entry, - _("Base URL of the video-server including http prefix. This is usually 'http://hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when the video-server is runing locally")); + _("Base URL of the video-server including http prefix. This is usually 'http://hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when the video-server is running locally")); l = manage (new Label (_("Video Folder:"))); l->set_alignment (0, 0.5); From 67369333851511364cb9048de39aaad3282ce697 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 17 Jul 2013 22:26:51 +0200 Subject: [PATCH 070/221] move mixer-metric pattern to the left --- gtk2_ardour/gain_meter.cc | 2 +- gtk2_ardour/meter_patterns.cc | 22 ++++++++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc index 1148c6b889..d67bf77dc7 100644 --- a/gtk2_ardour/gain_meter.cc +++ b/gtk2_ardour/gain_meter.cc @@ -944,10 +944,10 @@ GainMeter::GainMeter (Session* s, int fader_length) meter_ticks2_area.signal_expose_event().connect ( sigc::mem_fun(*this, &GainMeter::meter_ticks2_expose)); + meter_hbox.pack_start (meter_metric_area, false, false); meter_hbox.pack_start (meter_ticks1_area, false, false); meter_hbox.pack_start (meter_alignment, false, false); meter_hbox.pack_start (meter_ticks2_area, false, false); - meter_hbox.pack_start (meter_metric_area, false, false); } void diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index 7818711922..2704e4555d 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -224,13 +224,14 @@ meter_render_metrics (Gtk::Widget& w, vector types) { Glib::RefPtr win (w.get_window()); - bool tickleft; + bool tickleft, tickright; bool background; gint width, height; win->get_size (width, height); tickleft = w.get_name().substr(w.get_name().length() - 4) == "Left"; - background = types.size() == 0 || tickleft || w.get_name().substr(w.get_name().length() - 5) == "Right"; + tickright = w.get_name().substr(w.get_name().length() - 5) == "Right"; + background = types.size() == 0 || tickleft || tickright; cairo_surface_t* surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height); cairo_t* cr = cairo_create (surface); @@ -296,6 +297,11 @@ meter_render_metrics (Gtk::Widget& w, vector types) } else { c = w.get_style()->get_fg (Gtk::STATE_NORMAL); cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); + + if (!tickleft && !tickright && (*i) == DataType::AUDIO) { + tickleft = true; + } + } std::map points; @@ -366,11 +372,12 @@ meter_render_metrics (Gtk::Widget& w, vector types) if (tickleft) { cairo_move_to(cr, width-1.5, pos + .5); cairo_line_to(cr, width, pos + .5); - } else { + cairo_stroke (cr); + } else if (tickright) { cairo_move_to(cr, 0, pos + .5); cairo_line_to(cr, 1.5, pos + .5); + cairo_stroke (cr); } - cairo_stroke (cr); break; case DataType::MIDI: cairo_set_line_width (cr, 1.0); @@ -378,12 +385,15 @@ meter_render_metrics (Gtk::Widget& w, vector types) snprintf (buf, sizeof (buf), "%3d", j->first); pos = 1 + height - (gint) rintf (height * fraction); pos = min (pos, height); +#if 0 if (tickleft) { cairo_arc(cr, width - 2.0, pos + .5, 1.0, 0, 2 * M_PI); - } else { + cairo_fill(cr); + } else if (tickright) { cairo_arc(cr, 3, pos + .5, 1.0, 0, 2 * M_PI); + cairo_fill(cr); } - cairo_fill(cr); +#endif break; } From a8a4c1858c36286890c20fec18029b3bc94bbb66 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 17 Jul 2013 22:39:55 +0200 Subject: [PATCH 071/221] use ArdourMono font for metric patterns --- gtk2_ardour/meter_patterns.cc | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index 2704e4555d..9a2cab00b5 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -244,9 +244,7 @@ meter_render_metrics (Gtk::Widget& w, vector types) Pango::AttrFontDesc* font_attr; Pango::FontDescription font; - font = Pango::FontDescription (""); // use defaults - //font = get_font_for_style("gain-fader"); - //font = w.get_style()->get_font(); + font = Pango::FontDescription ("ArdourMono"); font.set_weight (Pango::WEIGHT_NORMAL); font.set_size (9.0 * PANGO_SCALE); @@ -256,12 +254,12 @@ meter_render_metrics (Gtk::Widget& w, vector types) font.set_weight (Pango::WEIGHT_ULTRALIGHT); font.set_stretch (Pango::STRETCH_ULTRA_CONDENSED); - font.set_size (7.5 * PANGO_SCALE); + font.set_size (8.0 * PANGO_SCALE); font_attr = new Pango::AttrFontDesc (Pango::Attribute::create_attr_font_desc (font)); midi_font_attributes.change (*font_attr); delete font_attr; - font.set_size (7.0 * PANGO_SCALE); + font.set_size (6.0 * PANGO_SCALE); font_attr = new Pango::AttrFontDesc (Pango::Attribute::create_attr_font_desc (font)); unit_font_attributes.change (*font_attr); delete font_attr; From d51a1ec06b707ad1000bb770afeabfe0987a747b Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 17 Jul 2013 22:45:08 +0200 Subject: [PATCH 072/221] add a stripe-pattern to the meters --- libs/gtkmm2ext/fastmeter.cc | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/libs/gtkmm2ext/fastmeter.cc b/libs/gtkmm2ext/fastmeter.cc index 6ea1a6dd4b..817b11ff6c 100644 --- a/libs/gtkmm2ext/fastmeter.cc +++ b/libs/gtkmm2ext/fastmeter.cc @@ -189,6 +189,18 @@ FastMeter::generate_meter_pattern ( cairo_set_source (tc, pat); cairo_rectangle (tc, 0, 0, width, height); cairo_fill (tc); + + cairo_save (tc); + cairo_set_line_width(tc, 1.0); + cairo_set_source_rgba(tc, .1, .1, .1, .5); + //cairo_set_operator (tc, CAIRO_OPERATOR_SOURCE); + for (float y=.5; y < height; y+= 2.0) { + cairo_move_to(tc, 0, y); + cairo_line_to(tc, width, y); + cairo_stroke (tc); + } + cairo_restore (tc); + cairo_set_source (tc, shade_pattern); cairo_rectangle (tc, 0, 0, width, height); cairo_fill (tc); From 1128c4eeda8cd03a7b4c2ca97b29c615ddb37af5 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 17 Jul 2013 23:04:52 +0200 Subject: [PATCH 073/221] meter metrics: ignore global font-scaling --- gtk2_ardour/meter_patterns.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index 9a2cab00b5..13b32e29e4 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -245,21 +245,22 @@ meter_render_metrics (Gtk::Widget& w, vector types) Pango::FontDescription font; font = Pango::FontDescription ("ArdourMono"); + double fixfontsize = 81920.0 / (double) ARDOUR::Config->get_font_scale(); font.set_weight (Pango::WEIGHT_NORMAL); - font.set_size (9.0 * PANGO_SCALE); + font.set_size (9.0 * PANGO_SCALE * fixfontsize); font_attr = new Pango::AttrFontDesc (Pango::Attribute::create_attr_font_desc (font)); audio_font_attributes.change (*font_attr); delete font_attr; font.set_weight (Pango::WEIGHT_ULTRALIGHT); font.set_stretch (Pango::STRETCH_ULTRA_CONDENSED); - font.set_size (8.0 * PANGO_SCALE); + font.set_size (8.0 * PANGO_SCALE * fixfontsize); font_attr = new Pango::AttrFontDesc (Pango::Attribute::create_attr_font_desc (font)); midi_font_attributes.change (*font_attr); delete font_attr; - font.set_size (6.0 * PANGO_SCALE); + font.set_size (6.0 * PANGO_SCALE * fixfontsize); font_attr = new Pango::AttrFontDesc (Pango::Attribute::create_attr_font_desc (font)); unit_font_attributes.change (*font_attr); delete font_attr; From 3475ea4b2271bc526877b33bb8ae1365948d795a Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 17 Jul 2013 23:11:48 +0200 Subject: [PATCH 074/221] don't hide ticks in narrow mode --- gtk2_ardour/gain_meter.cc | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc index d67bf77dc7..d9829c7af3 100644 --- a/gtk2_ardour/gain_meter.cc +++ b/gtk2_ardour/gain_meter.cc @@ -278,16 +278,12 @@ GainMeterBase::setup_meters (int len) switch (_width) { case Wide: - meter_ticks1_area.show(); - meter_ticks2_area.show(); if (_route && _route->shared_peak_meter()->input_streams().n_total() == 1) { meter_width = 10; } break; case Narrow: meter_width = 2; - meter_ticks1_area.hide(); - meter_ticks2_area.hide(); break; } level_meter->setup_meters(len, meter_width); @@ -1006,7 +1002,7 @@ GainMeter::get_gm_width () if (_width == Wide) return max(sz.width * 2, min_w * 2) + 6; else - return sz.width + min_w + 6; + return sz.width + min_w + 12; } From 55c5a76e8bec0c9f485f89f63558c1baf00e74b2 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 17 Jul 2013 23:33:23 +0200 Subject: [PATCH 075/221] revert to right-side mixer metric-labels --- gtk2_ardour/gain_meter.cc | 8 ++++++-- gtk2_ardour/meter_patterns.cc | 13 +++++-------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc index d9829c7af3..1148c6b889 100644 --- a/gtk2_ardour/gain_meter.cc +++ b/gtk2_ardour/gain_meter.cc @@ -278,12 +278,16 @@ GainMeterBase::setup_meters (int len) switch (_width) { case Wide: + meter_ticks1_area.show(); + meter_ticks2_area.show(); if (_route && _route->shared_peak_meter()->input_streams().n_total() == 1) { meter_width = 10; } break; case Narrow: meter_width = 2; + meter_ticks1_area.hide(); + meter_ticks2_area.hide(); break; } level_meter->setup_meters(len, meter_width); @@ -940,10 +944,10 @@ GainMeter::GainMeter (Session* s, int fader_length) meter_ticks2_area.signal_expose_event().connect ( sigc::mem_fun(*this, &GainMeter::meter_ticks2_expose)); - meter_hbox.pack_start (meter_metric_area, false, false); meter_hbox.pack_start (meter_ticks1_area, false, false); meter_hbox.pack_start (meter_alignment, false, false); meter_hbox.pack_start (meter_ticks2_area, false, false); + meter_hbox.pack_start (meter_metric_area, false, false); } void @@ -1002,7 +1006,7 @@ GainMeter::get_gm_width () if (_width == Wide) return max(sz.width * 2, min_w * 2) + 6; else - return sz.width + min_w + 12; + return sz.width + min_w + 6; } diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index 13b32e29e4..35ba8491be 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -233,6 +233,10 @@ meter_render_metrics (Gtk::Widget& w, vector types) tickright = w.get_name().substr(w.get_name().length() - 5) == "Right"; background = types.size() == 0 || tickleft || tickright; + if (!tickleft && !tickright) { + tickright = true; + } + cairo_surface_t* surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height); cairo_t* cr = cairo_create (surface); Glib::RefPtr layout = Pango::Layout::create(w.get_pango_context()); @@ -296,11 +300,6 @@ meter_render_metrics (Gtk::Widget& w, vector types) } else { c = w.get_style()->get_fg (Gtk::STATE_NORMAL); cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); - - if (!tickleft && !tickright && (*i) == DataType::AUDIO) { - tickleft = true; - } - } std::map points; @@ -384,7 +383,6 @@ meter_render_metrics (Gtk::Widget& w, vector types) snprintf (buf, sizeof (buf), "%3d", j->first); pos = 1 + height - (gint) rintf (height * fraction); pos = min (pos, height); -#if 0 if (tickleft) { cairo_arc(cr, width - 2.0, pos + .5, 1.0, 0, 2 * M_PI); cairo_fill(cr); @@ -392,7 +390,6 @@ meter_render_metrics (Gtk::Widget& w, vector types) cairo_arc(cr, 3, pos + .5, 1.0, 0, 2 * M_PI); cairo_fill(cr); } -#endif break; } @@ -403,7 +400,7 @@ meter_render_metrics (Gtk::Widget& w, vector types) int tw, th; layout->get_pixel_size(tw, th); - int p = pos - (th / 2); + int p = pos - (th / 2) - 1; p = min (p, height - th); p = max (p, 0); From d2c39db64db72eb364246327aafda871a71e0d8e Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Thu, 18 Jul 2013 09:00:24 +0200 Subject: [PATCH 076/221] mixer metric background color fix (MIDI & inactive) fixes http://tracker.ardour.org/view.php?id=5594 --- gtk2_ardour/gain_meter.cc | 31 ++++++++++++++++++++++++------- gtk2_ardour/gain_meter.h | 3 ++- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc index 1148c6b889..f5d4f1afa2 100644 --- a/gtk2_ardour/gain_meter.cc +++ b/gtk2_ardour/gain_meter.cc @@ -950,6 +950,8 @@ GainMeter::GainMeter (Session* s, int fader_length) meter_hbox.pack_start (meter_metric_area, false, false); } +GainMeter::~GainMeter () { } + void GainMeter::set_controls (boost::shared_ptr r, boost::shared_ptr meter, @@ -977,6 +979,10 @@ GainMeter::set_controls (boost::shared_ptr r, } + if (_route) { + _route->active_changed.connect (model_connections, invalidator (*this), boost::bind (&GainMeter::route_active_changed, this), gui_context ()); + } + /* if we have a non-hidden route (ie. we're not the click or the auditioner), pack some route-dependent stuff. @@ -1067,19 +1073,22 @@ GainMeter::meter_configuration_changed (ChanCount c) set_meter_strip_name ("AudioBusMetricsInactive"); } } + else if ( + (type == (1 << DataType::MIDI)) + || (_route && boost::dynamic_pointer_cast(_route)) + ) { + if (!_route || _route->active()) { + set_meter_strip_name ("MidiTrackMetrics"); + } else { + set_meter_strip_name ("MidiTrackMetricsInactive"); + } + } else if (type == (1 << DataType::AUDIO)) { if (!_route || _route->active()) { set_meter_strip_name ("AudioTrackMetrics"); } else { set_meter_strip_name ("AudioTrackMetricsInactive"); } - } - else if (type == (1 << DataType::MIDI)) { - if (!_route || _route->active()) { - set_meter_strip_name ("MidiTrackMetrics"); - } else { - set_meter_strip_name ("MidiTrackMetricsInactive"); - } } else { if (!_route || _route->active()) { set_meter_strip_name ("AudioMidiTrackMetrics"); @@ -1090,6 +1099,14 @@ GainMeter::meter_configuration_changed (ChanCount c) meter_clear_pattern_cache(4); } +void +GainMeter::route_active_changed () +{ + if (_meter) { + meter_configuration_changed (_meter->input_streams ()); + } +} + void GainMeter::meter_type_changed (MeterType t) { diff --git a/gtk2_ardour/gain_meter.h b/gtk2_ardour/gain_meter.h index 9353cfeaad..0c698d54ee 100644 --- a/gtk2_ardour/gain_meter.h +++ b/gtk2_ardour/gain_meter.h @@ -201,7 +201,7 @@ class GainMeter : public GainMeterBase, public Gtk::VBox { public: GainMeter (ARDOUR::Session*, int); - ~GainMeter () {} + virtual ~GainMeter (); virtual void set_controls (boost::shared_ptr route, boost::shared_ptr meter, @@ -210,6 +210,7 @@ class GainMeter : public GainMeterBase, public Gtk::VBox int get_gm_width (); void setup_meters (int len=0); void set_type (ARDOUR::MeterType); + void route_active_changed (); protected: void hide_all_meters (); From f0a3f1ea52ab1a2c142e904a3fce110092ac1106 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Thu, 18 Jul 2013 09:01:47 +0200 Subject: [PATCH 077/221] reset meter when meter-point changes --- libs/ardour/meter.cc | 19 ++++++++++++++----- libs/ardour/route.cc | 3 +++ 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/libs/ardour/meter.cc b/libs/ardour/meter.cc index 90f0977e4d..961a489a63 100644 --- a/libs/ardour/meter.cc +++ b/libs/ardour/meter.cc @@ -129,6 +129,16 @@ PeakMeter::reset_max () _max_peak_power[i] = -INFINITY; _max_peak_signal[i] = 0; } + + const size_t n_midi = min (_peak_signal.size(), (size_t) current_meters.n_midi()); + + for (size_t n = 0; n < _peak_signal.size(); ++n) { + if (n < n_midi) { + _visible_peak_power[n] = 0; + } else { + _visible_peak_power[n] = -INFINITY; + } + } } bool @@ -159,7 +169,6 @@ PeakMeter::reflect_inputs (const ChanCount& in) const size_t limit = min (_peak_signal.size(), (size_t) current_meters.n_total ()); const size_t n_midi = min (_peak_signal.size(), (size_t) current_meters.n_midi()); - const size_t n_audio = current_meters.n_audio(); for (size_t n = 0; n < limit; ++n) { if (n < n_midi) { @@ -169,10 +178,7 @@ PeakMeter::reflect_inputs (const ChanCount& in) } } - for (size_t n = 0; n < n_audio; ++n) { - _kmeter[n]->reset(); - } - + reset(); reset_max(); ConfigurationChanged (in, in); /* EMIT SIGNAL */ @@ -212,6 +218,9 @@ PeakMeter::reset_max_channels (const ChanCount& chn) _kmeter.push_back(new Kmeterdsp()); } assert(_kmeter.size() == n_audio); + + reset(); + reset_max(); } /** To be driven by the Meter signal from IO. diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index dad1922488..5c794fb379 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -3152,6 +3152,9 @@ Route::set_meter_point (MeterPoint p, bool force) */ } + _meter->reset(); + _meter->reset_max(); + meter_change (); /* EMIT SIGNAL */ bool const meter_visibly_changed = (_meter->display_to_user() != meter_was_visible_to_user); From b91caf557ce70468146bcb87e09b734f3d5f06f6 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Fri, 19 Jul 2013 10:37:00 +0200 Subject: [PATCH 078/221] adjust meter-width when configuration changes fixes http://tracker.ardour.org/view.php?id=5592 --- gtk2_ardour/gain_meter.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc index f5d4f1afa2..caa1fe954a 100644 --- a/gtk2_ardour/gain_meter.cc +++ b/gtk2_ardour/gain_meter.cc @@ -1096,6 +1096,8 @@ GainMeter::meter_configuration_changed (ChanCount c) set_meter_strip_name ("AudioMidiTrackMetricsInactive"); } } + + setup_meters(); meter_clear_pattern_cache(4); } From 649cf189e87a9472581cd339eda6718cfd067e32 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Fri, 19 Jul 2013 10:37:49 +0200 Subject: [PATCH 079/221] update processor-name (short|long) when mixer-strip width changes --- gtk2_ardour/processor_box.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/gtk2_ardour/processor_box.cc b/gtk2_ardour/processor_box.cc index 7d2e39639b..476bb73612 100644 --- a/gtk2_ardour/processor_box.cc +++ b/gtk2_ardour/processor_box.cc @@ -213,6 +213,7 @@ void ProcessorEntry::set_enum_width (Width w) { _width = w; + _button.set_text (name (_width)); } void From bf408d60c896d1a072a353f79269ac3bc1600464 Mon Sep 17 00:00:00 2001 From: Colin Fletcher Date: Fri, 19 Jul 2013 12:04:58 +0100 Subject: [PATCH 080/221] Wrap calls to add_shortcut_folder() in try { ... } block. Gtk::FileChooserButton::add_shortcut_folder() throws a Glib::Error exception if the folder being added already has a shortcut, causing the 'New session' dialogue to appear empty when choosing 'New...' from the Session menu. This happens if Ardour's default session folder is set to a location that has a standard shortcut in the Gtk file chooser, e.g. the user's home directory, desktop, &c. Catch the exception in ArdourStartup::setup_new_session_page(), so that the 'New session' dialogue appears as expected, and likewise in ARDOUR_UI::open_session() to avoid a similar problem there. Fixes #5591. --- gtk2_ardour/ardour_ui.cc | 9 ++++++++- gtk2_ardour/startup.cc | 10 +++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 3bd2768a4c..556dee99fe 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -1488,7 +1488,14 @@ ARDOUR_UI::open_session () open_session_selector->set_current_folder(Config->get_default_session_parent_dir()); } - open_session_selector->add_shortcut_folder (Config->get_default_session_parent_dir()); + string default_session_folder = Config->get_default_session_parent_dir(); + try { + /* add_shortcut_folder throws an exception if the folder being added already has a shortcut */ + open_session_selector->add_shortcut_folder (default_session_folder); + } + catch (Glib::Error & e) { + std::cerr << "open_session_selector->add_shortcut_folder (" << default_session_folder << ") threw Glib::Error " << e.what() << std::endl; + } FileFilter session_filter; session_filter.add_pattern ("*.ardour"); diff --git a/gtk2_ardour/startup.cc b/gtk2_ardour/startup.cc index 0ec79667ab..e24e7d6989 100644 --- a/gtk2_ardour/startup.cc +++ b/gtk2_ardour/startup.cc @@ -805,7 +805,15 @@ ArdourStartup::setup_new_session_page () string::size_type last_dir_sep = session_parent_dir.rfind(G_DIR_SEPARATOR); session_parent_dir = session_parent_dir.substr(0, last_dir_sep); new_folder_chooser.set_current_folder (session_parent_dir); - new_folder_chooser.add_shortcut_folder (poor_mans_glob (Config->get_default_session_parent_dir())); + string default_session_folder = poor_mans_glob (Config->get_default_session_parent_dir()); + + try { + /* add_shortcut_folder throws an exception if the folder being added already has a shortcut */ + new_folder_chooser.add_shortcut_folder (default_session_folder); + } + catch (Glib::Error & e) { + std::cerr << "new_folder_chooser.add_shortcut_folder (" << default_session_folder << ") threw Glib::Error " << e.what() << std::endl; + } } else { new_folder_chooser.set_current_folder (poor_mans_glob (Config->get_default_session_parent_dir())); } From e294e78fefe77897a9a014d7b84d436a9aff6f9b Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Thu, 18 Jul 2013 11:27:21 +0200 Subject: [PATCH 081/221] re-nice rendering of channel-splitting icon --- gtk2_ardour/processor_box.cc | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/gtk2_ardour/processor_box.cc b/gtk2_ardour/processor_box.cc index 476bb73612..1c5c47c41e 100644 --- a/gtk2_ardour/processor_box.cc +++ b/gtk2_ardour/processor_box.cc @@ -659,7 +659,8 @@ PluginInsertProcessorEntry::SplittingIcon::on_expose_event (GdkEventExpose* ev) cairo_rectangle (cr, ev->area.x, ev->area.y, ev->area.width, ev->area.height); cairo_clip (cr); - cairo_set_line_width (cr, 1); + cairo_set_line_width (cr, 1.5); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); Gtk::Allocation a = get_allocation(); double const width = a.get_width(); @@ -674,12 +675,19 @@ PluginInsertProcessorEntry::SplittingIcon::on_expose_event (GdkEventExpose* ev) Gdk::Color const fg = get_style()->get_fg (STATE_NORMAL); cairo_set_source_rgb (cr, fg.get_red_p (), fg.get_green_p (), fg.get_blue_p ()); - cairo_move_to (cr, width * 0.3, height); - cairo_line_to (cr, width * 0.3, height * 0.5); - cairo_line_to (cr, width * 0.7, height * 0.5); - cairo_line_to (cr, width * 0.7, height); - cairo_move_to (cr, width * 0.5, height * 0.5); - cairo_line_to (cr, width * 0.5, 0); + const float si_l = rint(width * 0.3) + .5; + const float si_c = rint(width * 0.5) + .5; + const float si_r = rint(width * 0.7) + .5; + const float si_m = rint(height * 0.5) + .5; + + cairo_move_to (cr, si_l, height); + cairo_line_to (cr, si_l, si_m); + cairo_line_to (cr, si_r, si_m); + cairo_line_to (cr, si_r, height); + + cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT); + cairo_move_to (cr, si_c, si_m); + cairo_line_to (cr, si_c, 0); cairo_stroke (cr); return true; From 72aa1cd86cf04964f08e7ca0557f73afd1c96e83 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Mon, 22 Jul 2013 18:42:01 +0200 Subject: [PATCH 082/221] Revert "Revert new meter types (postponed until after 3.3 release)" This reverts commit d80f672e8487f459d76ab291958bffcded08f0fd. --- gtk2_ardour/meter_patterns.cc | 9 +++ gtk2_ardour/meter_strip.cc | 3 + gtk2_ardour/mixer_strip.cc | 3 + libs/ardour/ardour/iec1ppmdsp.h | 51 ++++++++++++++ libs/ardour/ardour/iec2ppmdsp.h | 51 ++++++++++++++ libs/ardour/{ => ardour}/kmeterdsp.h | 5 +- libs/ardour/ardour/meter.h | 10 ++- libs/ardour/ardour/types.h | 5 +- libs/ardour/ardour/vumeterdsp.h | 49 +++++++++++++ libs/ardour/enums.cc | 3 + libs/ardour/iec1ppmdsp.cc | 100 +++++++++++++++++++++++++++ libs/ardour/iec2ppmdsp.cc | 100 +++++++++++++++++++++++++++ libs/ardour/kmeterdsp.cc | 23 +++--- libs/ardour/meter.cc | 93 ++++++++++++++++++++++--- libs/ardour/vumeterdsp.cc | 89 ++++++++++++++++++++++++ libs/ardour/wscript | 3 + 16 files changed, 570 insertions(+), 27 deletions(-) create mode 100644 libs/ardour/ardour/iec1ppmdsp.h create mode 100644 libs/ardour/ardour/iec2ppmdsp.h rename libs/ardour/{ => ardour}/kmeterdsp.h (95%) create mode 100644 libs/ardour/ardour/vumeterdsp.h create mode 100644 libs/ardour/iec1ppmdsp.cc create mode 100644 libs/ardour/iec2ppmdsp.cc create mode 100644 libs/ardour/vumeterdsp.cc diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index 35ba8491be..d658a0b3ef 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -64,6 +64,15 @@ ArdourMeter::meter_type_string (ARDOUR::MeterType mt) case MeterKrms: return _("RMS + Peak"); break; + case MeterIEC1: + return _("DIN"); + break; + case MeterIEC2: + return _("EBU/BBC"); + break; + case MeterVU: + return _("VU"); + break; default: return _("???"); break; diff --git a/gtk2_ardour/meter_strip.cc b/gtk2_ardour/meter_strip.cc index 44144114a4..3a8410867a 100644 --- a/gtk2_ardour/meter_strip.cc +++ b/gtk2_ardour/meter_strip.cc @@ -573,6 +573,9 @@ MeterStrip::popup_level_meter_menu (GdkEventButton* ev) _suspend_menu_callbacks = true; add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterPeak), MeterPeak); add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterKrms), MeterKrms); + add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterIEC1), MeterIEC1); + add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterIEC2), MeterIEC2); + add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterVU), MeterVU); MeterType cmt = _route->meter_type(); const std::string cmn = ArdourMeter::meter_type_string(cmt); diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index 6128780cf0..dec072b067 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -2135,6 +2135,9 @@ MixerStrip::popup_level_meter_menu (GdkEventButton* ev) add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterPeak), MeterPeak); add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterKrms), MeterKrms); + add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC1), MeterIEC1); + add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC2), MeterIEC2); + add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterVU), MeterVU); int _strip_type; if (_route->is_master()) { diff --git a/libs/ardour/ardour/iec1ppmdsp.h b/libs/ardour/ardour/iec1ppmdsp.h new file mode 100644 index 0000000000..58dea97555 --- /dev/null +++ b/libs/ardour/ardour/iec1ppmdsp.h @@ -0,0 +1,51 @@ +/* + Copyright (C) 2012 Fons Adriaensen + Adopted for Ardour 2013 by Robin Gareus + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef __IEC1PPMDSP_H +#define __IEC1PPMDSP_H + + +class Iec1ppmdsp +{ +public: + + Iec1ppmdsp (void); + ~Iec1ppmdsp (void); + + void process (float *p, int n); + float read (void); + void reset (); + + static void init (float fsamp); + +private: + + float _z1; // filter state + float _z2; // filter state + float _m; // max value since last read() + bool _res; // flag to reset m + + static float _w1; // attack filter coefficient + static float _w2; // attack filter coefficient + static float _w3; // release filter coefficient + static float _g; // gain factor +}; + + +#endif diff --git a/libs/ardour/ardour/iec2ppmdsp.h b/libs/ardour/ardour/iec2ppmdsp.h new file mode 100644 index 0000000000..3574a8bd3f --- /dev/null +++ b/libs/ardour/ardour/iec2ppmdsp.h @@ -0,0 +1,51 @@ +/* + Copyright (C) 2012 Fons Adriaensen + Adopted for Ardour 2013 by Robin Gareus + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef __IEC2PPMDSP_H +#define __IEC2PPMDSP_H + + +class Iec2ppmdsp +{ +public: + + Iec2ppmdsp (void); + ~Iec2ppmdsp (void); + + void process (float *p, int n); + float read (void); + void reset (); + + static void init (float fsamp); + +private: + + float _z1; // filter state + float _z2; // filter state + float _m; // max value since last read() + bool _res; // flag to reset m + + static float _w1; // attack filter coefficient + static float _w2; // attack filter coefficient + static float _w3; // release filter coefficient + static float _g; // gain factor +}; + + +#endif diff --git a/libs/ardour/kmeterdsp.h b/libs/ardour/ardour/kmeterdsp.h similarity index 95% rename from libs/ardour/kmeterdsp.h rename to libs/ardour/ardour/kmeterdsp.h index 9c2309e09c..eca3c76695 100644 --- a/libs/ardour/kmeterdsp.h +++ b/libs/ardour/ardour/kmeterdsp.h @@ -1,6 +1,6 @@ /* Copyright (C) 2008-2011 Fons Adriaensen - Adopted for Ardour 2013 by Robin Gareus + Adopted for Ardour 2013 by Robin Gareus This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -29,9 +29,10 @@ public: void process (float *p, int n); float read (); - static void init (int fsamp); void reset (); + static void init (int fsamp); + private: float _z1; // filter state diff --git a/libs/ardour/ardour/meter.h b/libs/ardour/ardour/meter.h index 31ebc76179..4ac140fd04 100644 --- a/libs/ardour/ardour/meter.h +++ b/libs/ardour/ardour/meter.h @@ -23,7 +23,11 @@ #include "ardour/types.h" #include "ardour/processor.h" #include "pbd/fastlog.h" -#include "kmeterdsp.h" + +#include "ardour/kmeterdsp.h" +#include "ardour/iec1ppmdsp.h" +#include "ardour/iec2ppmdsp.h" +#include "ardour/vumeterdsp.h" namespace ARDOUR { @@ -104,7 +108,11 @@ private: std::vector _visible_peak_power; std::vector _max_peak_signal; std::vector _max_peak_power; + std::vector _kmeter; + std::vector _iec1meter; + std::vector _iec2meter; + std::vector _vumeter; MeterType _meter_type; }; diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h index 05d6d0b27d..df7209b581 100644 --- a/libs/ardour/ardour/types.h +++ b/libs/ardour/ardour/types.h @@ -181,7 +181,10 @@ namespace ARDOUR { MeterMaxSignal = 0x01, MeterMaxPeak = 0x02, MeterPeak = 0x04, - MeterKrms = 0x08 + MeterKrms = 0x08, + MeterIEC1 = 0x10, + MeterIEC2 = 0x20, + MeterVU = 0x40 }; enum TrackMode { diff --git a/libs/ardour/ardour/vumeterdsp.h b/libs/ardour/ardour/vumeterdsp.h new file mode 100644 index 0000000000..86487e8e8e --- /dev/null +++ b/libs/ardour/ardour/vumeterdsp.h @@ -0,0 +1,49 @@ +/* + Copyright (C) 2012 Fons Adriaensen + Adopted for Ardour 2013 by Robin Gareus + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef __VUMETERDSP_H +#define __VUMETERDSP_H + + +class Vumeterdsp +{ +public: + + Vumeterdsp (void); + ~Vumeterdsp (void); + + void process (float *p, int n); + float read (void); + void reset (); + + static void init (float fsamp); + +private: + + float _z1; // filter state + float _z2; // filter state + float _m; // max value since last read() + bool _res; // flag to reset m + + static float _w; // lowpass filter coefficient + static float _g; // gain factor +}; + + +#endif diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc index 495ff0b4c3..12eb59ce65 100644 --- a/libs/ardour/enums.cc +++ b/libs/ardour/enums.cc @@ -177,6 +177,9 @@ setup_enum_writer () REGISTER_ENUM (MeterMaxPeak); REGISTER_ENUM (MeterPeak); REGISTER_ENUM (MeterKrms); + REGISTER_ENUM (MeterIEC1); + REGISTER_ENUM (MeterIEC2); + REGISTER_ENUM (MeterVU); REGISTER (_MeterType); REGISTER_ENUM (Normal); diff --git a/libs/ardour/iec1ppmdsp.cc b/libs/ardour/iec1ppmdsp.cc new file mode 100644 index 0000000000..bed825048f --- /dev/null +++ b/libs/ardour/iec1ppmdsp.cc @@ -0,0 +1,100 @@ +/* + Copyright (C) 2012 Fons Adriaensen + Adopted for Ardour 2013 by Robin Gareus + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include +#include "ardour/iec1ppmdsp.h" + + +float Iec1ppmdsp::_w1; +float Iec1ppmdsp::_w2; +float Iec1ppmdsp::_w3; +float Iec1ppmdsp::_g; + + +Iec1ppmdsp::Iec1ppmdsp (void) : + _z1 (0), + _z2 (0), + _m (0), + _res (true) +{ +} + + +Iec1ppmdsp::~Iec1ppmdsp (void) +{ +} + + +void Iec1ppmdsp::process (float *p, int n) +{ + float z1, z2, m, t; + + z1 = _z1; + z2 = _z2; + m = _res ? 0: _m; + _res = false; + + n /= 4; + while (n--) + { + z1 *= _w3; + z2 *= _w3; + t = fabsf (*p++); + if (t > z1) z1 += _w1 * (t - z1); + if (t > z2) z2 += _w2 * (t - z2); + t = fabsf (*p++); + if (t > z1) z1 += _w1 * (t - z1); + if (t > z2) z2 += _w2 * (t - z2); + t = fabsf (*p++); + if (t > z1) z1 += _w1 * (t - z1); + if (t > z2) z2 += _w2 * (t - z2); + t = fabsf (*p++); + if (t > z1) z1 += _w1 * (t - z1); + if (t > z2) z2 += _w2 * (t - z2); + t = z1 + z2; + if (t > m) m = t; + } + + _z1 = z1 + 1e-10f; + _z2 = z2 + 1e-10f; + _m = m; +} + + +float Iec1ppmdsp::read (void) +{ + _res = true; + return _g * _m; +} + +void Iec1ppmdsp::reset () +{ + _z1 = _z2 = _m = .0f; + _res = true; +} + +void Iec1ppmdsp::init (float fsamp) +{ + _w1 = 450.0f / fsamp; + _w2 = 1300.0f / fsamp; + _w3 = 1.0f - 5.4f / fsamp; + _g = 0.5108f; +} + +/* vi:set ts=8 sts=8 sw=4: */ diff --git a/libs/ardour/iec2ppmdsp.cc b/libs/ardour/iec2ppmdsp.cc new file mode 100644 index 0000000000..76862cccd2 --- /dev/null +++ b/libs/ardour/iec2ppmdsp.cc @@ -0,0 +1,100 @@ +/* + Copyright (C) 2012 Fons Adriaensen + Adopted for Ardour 2013 by Robin Gareus + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include +#include "ardour/iec2ppmdsp.h" + + +float Iec2ppmdsp::_w1; +float Iec2ppmdsp::_w2; +float Iec2ppmdsp::_w3; +float Iec2ppmdsp::_g; + + +Iec2ppmdsp::Iec2ppmdsp (void) : + _z1 (0), + _z2 (0), + _m (0), + _res (true) +{ +} + + +Iec2ppmdsp::~Iec2ppmdsp (void) +{ +} + + +void Iec2ppmdsp::process (float *p, int n) +{ + float z1, z2, m, t; + + z1 = _z1; + z2 = _z2; + m = _res ? 0: _m; + _res = false; + + n /= 4; + while (n--) + { + z1 *= _w3; + z2 *= _w3; + t = fabsf (*p++); + if (t > z1) z1 += _w1 * (t - z1); + if (t > z2) z2 += _w2 * (t - z2); + t = fabsf (*p++); + if (t > z1) z1 += _w1 * (t - z1); + if (t > z2) z2 += _w2 * (t - z2); + t = fabsf (*p++); + if (t > z1) z1 += _w1 * (t - z1); + if (t > z2) z2 += _w2 * (t - z2); + t = fabsf (*p++); + if (t > z1) z1 += _w1 * (t - z1); + if (t > z2) z2 += _w2 * (t - z2); + t = z1 + z2; + if (t > m) m = t; + } + + _z1 = z1 + 1e-10f; + _z2 = z2 + 1e-10f; + _m = m; +} + + +float Iec2ppmdsp::read (void) +{ + _res = true; + return _g * _m; +} + +void Iec2ppmdsp::reset () +{ + _z1 = _z2 = _m = .0f; + _res = true; +} + +void Iec2ppmdsp::init (float fsamp) +{ + _w1 = 200.0f / fsamp; + _w2 = 860.0f / fsamp; + _w3 = 1.0f - 4.0f / fsamp; + _g = 0.5141f; +} + +/* vi:set ts=8 sts=8 sw=4: */ diff --git a/libs/ardour/kmeterdsp.cc b/libs/ardour/kmeterdsp.cc index afd0f71719..d4460f94cb 100644 --- a/libs/ardour/kmeterdsp.cc +++ b/libs/ardour/kmeterdsp.cc @@ -1,6 +1,6 @@ /* Copyright (C) 2008-2011 Fons Adriaensen - Adopted for Ardour 2013 by Robin Gareus + Adopted for Ardour 2013 by Robin Gareus This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,12 +17,13 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - #include -#include "kmeterdsp.h" +#include "ardour/kmeterdsp.h" + float Kmeterdsp::_omega; + Kmeterdsp::Kmeterdsp (void) : _z1 (0), _z2 (0), @@ -36,6 +37,10 @@ Kmeterdsp::~Kmeterdsp (void) { } +void Kmeterdsp::init (int fsamp) +{ + _omega = 9.72f / fsamp; // ballistic filter coefficient +} void Kmeterdsp::process (float *p, int n) { @@ -96,7 +101,6 @@ void Kmeterdsp::process (float *p, int n) } } - /* Returns highest _rms value since last call */ float Kmeterdsp::read () { @@ -105,15 +109,10 @@ float Kmeterdsp::read () return rv; } -void Kmeterdsp::init (int fsamp) -{ - _omega = 9.72f / fsamp; // ballistic filter coefficient -} - void Kmeterdsp::reset () { - _z1 = _z2 = _rms = 0.0; - _flag=false; + _z1 = _z2 = _rms = .0f; + _flag = false; } -/* vi:set ts=8 sts=8 sw=8: */ +/* vi:set ts=8 sts=8 sw=4: */ diff --git a/libs/ardour/meter.cc b/libs/ardour/meter.cc index 961a489a63..3ca19afe76 100644 --- a/libs/ardour/meter.cc +++ b/libs/ardour/meter.cc @@ -40,13 +40,22 @@ PeakMeter::PeakMeter (Session& s, const std::string& name) : Processor (s, string_compose ("meter-%1", name)) { Kmeterdsp::init(s.nominal_frame_rate()); + Iec1ppmdsp::init(s.nominal_frame_rate()); + Iec2ppmdsp::init(s.nominal_frame_rate()); + Vumeterdsp::init(s.nominal_frame_rate()); } PeakMeter::~PeakMeter () { while (_kmeter.size() > 0) { delete (_kmeter.back()); + delete (_iec1meter.back()); + delete (_iec2meter.back()); + delete (_vumeter.back()); _kmeter.pop_back(); + _iec1meter.pop_back(); + _iec2meter.pop_back(); + _vumeter.pop_back(); } } @@ -100,6 +109,15 @@ PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_fr if (_meter_type & MeterKrms) { _kmeter[i]->process(bufs.get_audio(i).data(), nframes); } + if (_meter_type & MeterIEC1) { + _iec1meter[i]->process(bufs.get_audio(i).data(), nframes); + } + if (_meter_type & MeterIEC2) { + _iec2meter[i]->process(bufs.get_audio(i).data(), nframes); + } + if (_meter_type & MeterVU) { + _vumeter[i]->process(bufs.get_audio(i).data(), nframes); + } } // Zero any excess peaks @@ -119,6 +137,9 @@ PeakMeter::reset () for (size_t n = 0; n < _kmeter.size(); ++n) { _kmeter[n]->reset(); + _iec1meter[n]->reset(); + _iec2meter[n]->reset(); + _vumeter[n]->reset(); } } @@ -212,12 +233,24 @@ PeakMeter::reset_max_channels (const ChanCount& chn) /* alloc/free other audio-only meter types. */ while (_kmeter.size() > n_audio) { delete (_kmeter.back()); + delete (_iec1meter.back()); + delete (_iec2meter.back()); + delete (_vumeter.back()); _kmeter.pop_back(); + _iec1meter.pop_back(); + _iec2meter.pop_back(); + _vumeter.pop_back(); } while (_kmeter.size() < n_audio) { _kmeter.push_back(new Kmeterdsp()); + _iec1meter.push_back(new Iec1ppmdsp()); + _iec2meter.push_back(new Iec2ppmdsp()); + _vumeter.push_back(new Vumeterdsp()); } assert(_kmeter.size() == n_audio); + assert(_iec1meter.size() == n_audio); + assert(_iec2meter.size() == n_audio); + assert(_vumeter.size() == n_audio); reset(); reset_max(); @@ -292,32 +325,51 @@ PeakMeter::meter_level(uint32_t n, MeterType type) { switch (type) { case MeterKrms: { - const uint32_t n_midi = current_meters.n_midi(); + const uint32_t n_midi = current_meters.n_midi(); if ((n - n_midi) < _kmeter.size() && (n - n_midi) >= 0) { -#if 0 - return fast_coefficient_to_dB (_kmeter[n-n_midi]->read()); -#else - return accurate_coefficient_to_dB (_kmeter[n-n_midi]->read()); -#endif + return accurate_coefficient_to_dB (_kmeter[n - n_midi]->read()); } - return minus_infinity(); } + break; + case MeterIEC1: + { + const uint32_t n_midi = current_meters.n_midi(); + if ((n - n_midi) < _iec1meter.size() && (n - n_midi) >= 0) { + return accurate_coefficient_to_dB (_iec1meter[n - n_midi]->read()); + } + } + break; + case MeterIEC2: + { + const uint32_t n_midi = current_meters.n_midi(); + if ((n - n_midi) < _iec2meter.size() && (n - n_midi) >= 0) { + return accurate_coefficient_to_dB (_iec2meter[n - n_midi]->read()); + } + } + break; + case MeterVU: + { + const uint32_t n_midi = current_meters.n_midi(); + if ((n - n_midi) < _vumeter.size() && (n - n_midi) >= 0) { + return accurate_coefficient_to_dB (_vumeter[n - n_midi]->read()); + } + } + break; case MeterPeak: return peak_power(n); case MeterMaxSignal: if (n < _max_peak_signal.size()) { return _max_peak_signal[n]; - } else { - return minus_infinity(); } + break; default: case MeterMaxPeak: if (n < _max_peak_power.size()) { return _max_peak_power[n]; - } else { - return minus_infinity(); } + break; } + return minus_infinity(); } void @@ -335,6 +387,25 @@ PeakMeter::set_type(MeterType t) _kmeter[n]->reset(); } } + if (t & MeterIEC1) { + const size_t n_audio = current_meters.n_audio(); + for (size_t n = 0; n < n_audio; ++n) { + _iec1meter[n]->reset(); + } + } + if (t & MeterIEC2) { + const size_t n_audio = current_meters.n_audio(); + for (size_t n = 0; n < n_audio; ++n) { + _iec2meter[n]->reset(); + } + } + if (t & MeterVU) { + const size_t n_audio = current_meters.n_audio(); + for (size_t n = 0; n < n_audio; ++n) { + _vumeter[n]->reset(); + } + } + TypeChanged(t); } diff --git a/libs/ardour/vumeterdsp.cc b/libs/ardour/vumeterdsp.cc new file mode 100644 index 0000000000..67d48f6c54 --- /dev/null +++ b/libs/ardour/vumeterdsp.cc @@ -0,0 +1,89 @@ +/* + Copyright (C) 2012 Fons Adriaensen + Adopted for Ardour 2013 by Robin Gareus + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include +#include "ardour/vumeterdsp.h" + + +float Vumeterdsp::_w; +float Vumeterdsp::_g; + + +Vumeterdsp::Vumeterdsp (void) : + _z1 (0), + _z2 (0), + _m (0), + _res (true) +{ +} + + +Vumeterdsp::~Vumeterdsp (void) +{ +} + + +void Vumeterdsp::process (float *p, int n) +{ + float z1, z2, m, t1, t2; + + z1 = _z1; + z2 = _z2; + m = _res ? 0: _m; + _res = false; + + n /= 4; + while (n--) + { + t2 = z2 / 2; + t1 = fabsf (*p++) - t2; + z1 += _w * (t1 - z1); + t1 = fabsf (*p++) - t2; + z1 += _w * (t1 - z1); + t1 = fabsf (*p++) - t2; + z1 += _w * (t1 - z1); + t1 = fabsf (*p++) - t2; + z1 += _w * (t1 - z1); + z2 += 4 * _w * (z1 - z2); + if (z2 > m) m = z2; + } + + _z1 = z1; + _z2 = z2 + 1e-10f; + _m = m; +} + + +float Vumeterdsp::read (void) +{ + _res = true; + return _g * _m; +} + +void Vumeterdsp::reset () +{ + _z1 = _z2 = _m = .0f; + _res = true; +} + +void Vumeterdsp::init (float fsamp) +{ + _w = 11.1f / fsamp; + _g = 1.5f * 1.571f; +} diff --git a/libs/ardour/wscript b/libs/ardour/wscript index 4e7e23aa1a..ea08636ea8 100644 --- a/libs/ardour/wscript +++ b/libs/ardour/wscript @@ -91,6 +91,8 @@ libardour_sources = [ 'globals.cc', 'graph.cc', 'graphnode.cc', + 'iec1ppmdsp.cc', + 'iec2ppmdsp.cc', 'import.cc', 'instrument_info.cc', 'internal_return.cc', @@ -206,6 +208,7 @@ libardour_sources = [ 'user_bundle.cc', 'utils.cc', 'version.cc', + 'vumeterdsp.cc', 'worker.cc' ] From 708edd586611c6b1132e4f25be4c2c0865ba4738 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Mon, 22 Jul 2013 18:45:08 +0200 Subject: [PATCH 083/221] implement new meter types --- gtk2_ardour/gain_meter.cc | 10 +- gtk2_ardour/level_meter.cc | 110 ++++-- gtk2_ardour/logmeter.h | 77 ++++ gtk2_ardour/meter_patterns.cc | 641 ++++++++++++++++++++++++++-------- gtk2_ardour/meter_patterns.h | 4 +- gtk2_ardour/meter_strip.cc | 23 +- gtk2_ardour/mixer_strip.cc | 12 +- libs/ardour/ardour/types.h | 18 +- libs/ardour/enums.cc | 10 +- libs/ardour/meter.cc | 22 +- 10 files changed, 715 insertions(+), 212 deletions(-) diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc index caa1fe954a..f142f21641 100644 --- a/gtk2_ardour/gain_meter.cc +++ b/gtk2_ardour/gain_meter.cc @@ -1019,19 +1019,22 @@ GainMeter::get_gm_width () gint GainMeter::meter_metrics_expose (GdkEventExpose *ev) { - return meter_expose_metrics(ev, _types, &meter_metric_area); + assert(_route); + return meter_expose_metrics(ev, _route->meter_type(), _types, &meter_metric_area); } gint GainMeter::meter_ticks1_expose (GdkEventExpose *ev) { - return meter_expose_ticks(ev, _types, &meter_ticks1_area); + assert(_route); + return meter_expose_ticks(ev, _route->meter_type(), _types, &meter_ticks1_area); } gint GainMeter::meter_ticks2_expose (GdkEventExpose *ev) { - return meter_expose_ticks(ev, _types, &meter_ticks2_area); + assert(_route); + return meter_expose_ticks(ev, _route->meter_type(), _types, &meter_ticks2_area); } boost::shared_ptr @@ -1113,4 +1116,5 @@ void GainMeter::meter_type_changed (MeterType t) { _route->set_meter_type(t); + RedrawMetrics(); } diff --git a/gtk2_ardour/level_meter.cc b/gtk2_ardour/level_meter.cc index 6a120fdb80..fd32add587 100644 --- a/gtk2_ardour/level_meter.cc +++ b/gtk2_ardour/level_meter.cc @@ -114,6 +114,18 @@ LevelMeter::update_meters () const float peak = _meter->meter_level (n, meter_type); if (meter_type == MeterPeak) { (*i).meter->set (log_meter (peak)); + } else if (meter_type == MeterIEC1NOR) { + (*i).meter->set (meter_deflect_nordic (peak)); + } else if (meter_type == MeterIEC1DIN) { + (*i).meter->set (meter_deflect_din (peak)); + } else if (meter_type == MeterIEC2BBC || meter_type == MeterIEC2EBU) { + (*i).meter->set (meter_deflect_ppm (peak)); + } else if (meter_type == MeterVU) { + (*i).meter->set (meter_deflect_vu (peak)); + } else if (meter_type == MeterK14) { + (*i).meter->set (meter_deflect_k (peak, 14), meter_deflect_k(_meter->meter_level(n, MeterPeak), 14)); + } else if (meter_type == MeterK20) { + (*i).meter->set (meter_deflect_k (peak, 20), meter_deflect_k(_meter->meter_level(n, MeterPeak), 20)); } else { (*i).meter->set (log_meter (peak), log_meter(_meter->meter_level(n, MeterPeak))); } @@ -161,6 +173,8 @@ void LevelMeter::meter_type_changed (MeterType t) { meter_type = t; + color_changed = true; + setup_meters (meter_length, regular_meter_width, thin_meter_width); MeterTypeChanged(t); } @@ -227,33 +241,6 @@ LevelMeter::setup_meters (int len, int initial_width, int thin_width) stp[2] = 115.0 * 100.0 / 128.0; stp[3] = 115.0 * 112.0 / 128.0; } else { - switch (Config->get_meter_line_up_level()) { - case MeteringLineUp24: - stp[0] = 42.0; - stp[1] = 77.5; - stp[2] = 92.5; - stp[3] = 100.0; - break; - case MeteringLineUp20: - stp[0] = 50.0; - stp[1] = 77.5; - stp[2] = 92.5; - stp[3] = 100.0; - break; - default: - case MeteringLineUp18: - stp[0] = 55.0; - stp[1] = 77.5; - stp[2] = 92.5; - stp[3] = 100.0; - break; - case MeteringLineUp15: - stp[0] = 62.5; - stp[1] = 77.5; - stp[2] = 92.5; - stp[3] = 100.0; - break; - } c[0] = ARDOUR_UI::config()->canvasvar_MeterColor0.get(); c[1] = ARDOUR_UI::config()->canvasvar_MeterColor1.get(); c[2] = ARDOUR_UI::config()->canvasvar_MeterColor2.get(); @@ -264,6 +251,75 @@ LevelMeter::setup_meters (int len, int initial_width, int thin_width) c[7] = ARDOUR_UI::config()->canvasvar_MeterColor7.get(); c[8] = ARDOUR_UI::config()->canvasvar_MeterColor8.get(); c[9] = ARDOUR_UI::config()->canvasvar_MeterColor9.get(); + + switch (meter_type) { + case MeterK20: + stp[0] = 115.0 * meter_deflect_k(-40, 20); //-20 + stp[1] = 115.0 * meter_deflect_k(-20, 20); // 0 + stp[2] = 115.0 * meter_deflect_k(-18, 20); // +2 + stp[3] = 115.0 * meter_deflect_k(-16, 20); // +4 + c[0] = c[1] = 0x008800ff; + c[2] = c[3] = 0x00ff00ff; + c[4] = c[5] = 0xffff00ff; + c[6] = c[7] = 0xffff00ff; + c[8] = c[9] = 0xff0000ff; + break; + case MeterK14: + stp[0] = 115.0 * meter_deflect_k(-34, 14); //-20 + stp[1] = 115.0 * meter_deflect_k(-14, 14); // 0 + stp[2] = 115.0 * meter_deflect_k(-12, 14); // +2 + stp[3] = 115.0 * meter_deflect_k(-10, 14); // +4 + c[0] = c[1] = 0x008800ff; + c[2] = c[3] = 0x00ff00ff; + c[4] = c[5] = 0xffff00ff; + c[6] = c[7] = 0xffff00ff; + c[8] = c[9] = 0xff0000ff; + break; + case MeterIEC2EBU: + case MeterIEC2BBC: + stp[0] = 115.0 * meter_deflect_ppm(-18); + stp[1] = 115.0 * meter_deflect_ppm(-14); + stp[2] = 115.0 * meter_deflect_ppm(-10); + stp[3] = 115.0 * meter_deflect_ppm( -8); + break; + case MeterIEC1NOR: + stp[0] = 115.0 * meter_deflect_nordic(-18); + stp[1] = 115.0 * meter_deflect_nordic(-15); + stp[2] = 115.0 * meter_deflect_nordic(-12); + stp[3] = 115.0 * meter_deflect_nordic( -9); + break; + case MeterIEC1DIN: + stp[0] = 115.0 * meter_deflect_din(-29); + stp[1] = 115.0 * meter_deflect_din(-18); + stp[2] = 115.0 * meter_deflect_din(-15); + stp[3] = 115.0 * meter_deflect_din( -9); + break; + case MeterVU: + stp[0] = 115.0 * meter_deflect_vu(-26); // -6 + stp[1] = 115.0 * meter_deflect_vu(-23); // -3 + stp[2] = 115.0 * meter_deflect_vu(-20); // 0 + stp[3] = 115.0 * meter_deflect_vu(-18); // +2 + break; + default: // PEAK, RMS + stp[1] = 77.5; // 115 * log_meter(-10) + stp[2] = 92.5; // 115 * log_meter(-3) + stp[3] = 100.0; // 115 * log_meter(0) + switch (Config->get_meter_line_up_level()) { + case MeteringLineUp24: + stp[0] = 42.0; + break; + case MeteringLineUp20: + stp[0] = 50.0; + break; + default: + case MeteringLineUp18: + stp[0] = 55.0; + break; + case MeteringLineUp15: + stp[0] = 62.5; + break; + } + } } if (meters[n].width != width || meters[n].length != len || color_changed) { delete meters[n].meter; diff --git a/gtk2_ardour/logmeter.h b/gtk2_ardour/logmeter.h index d861509080..c7b18ea6b9 100644 --- a/gtk2_ardour/logmeter.h +++ b/gtk2_ardour/logmeter.h @@ -34,6 +34,16 @@ alt_log_meter (float power) } #endif +/* prototypes - avoid compiler warning */ +inline float log_meter (float db); +inline float meter_deflect_ppm (float); +inline float meter_deflect_din (float); +inline float meter_deflect_nordic (float); +inline float meter_deflect_vu (float); +inline float meter_deflect_k (float, float); + + + inline float log_meter (float db) { @@ -65,4 +75,71 @@ log_meter (float db) return def/115.0f; } +inline float +meter_deflect_ppm (float db) +{ + if (db < -30) { + // 2.258 == ((-30 + 32.0)/ 28.0) / 10^(-30 / 20); + return (dB_to_coefficient(db) * 2.258769757f); + } else { + const float rv = (db + 32.0f) / 28.0f; + if (rv < 1.0) { + return rv; + } else { + return 1.0; + } + } +} + +inline float +meter_deflect_din (float db) +{ + float rv = dB_to_coefficient(db); + rv = sqrtf (sqrtf (2.3676f * rv)) - 0.1803f; + if (rv >= 1.0) { + return 1.0; + } else { + return (rv > 0 ? rv : 0.0); + } +} + +inline float +meter_deflect_nordic (float db) +{ + if (db < -60) { + return 0.0; + } else { + const float rv = (db + 60.0f) / 54.0f; + if (rv < 1.0) { + return rv; + } else { + return 1.0; + } + } +} + +inline float +meter_deflect_vu (float db) +{ + const float rv = 6.77165f * dB_to_coefficient(db); + if (rv > 1.0) return 1.0; + return rv; +} + +inline float +meter_deflect_k (float db, float krange) +{ + db+=krange; + if (db < -40.0f) { + return (dB_to_coefficient(db) * 500.0f / (krange + 45.0f)); + } else { + const float rv = (db + 45.0f) / (krange + 45.0f); + if (rv < 1.0) { + return rv; + } else { + return 1.0; + } + } +} + #endif /* __ardour_gtk_log_meter_h__ */ diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index d658a0b3ef..60bd33ca26 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -39,6 +39,8 @@ using namespace ArdourMeter; static const int max_pattern_metric_size = 1026; +/* signals used by meters */ + sigc::signal ArdourMeter::ResetAllPeakDisplays; sigc::signal ArdourMeter::ResetRoutePeakDisplays; sigc::signal ArdourMeter::ResetGroupPeakDisplays; @@ -46,13 +48,28 @@ sigc::signal ArdourMeter::RedrawMetrics; sigc::signal ArdourMeter::SetMeterTypeMulti; + +/* pattern cache */ + +struct MeterMatricsMapKey { + MeterMatricsMapKey (std::string n, MeterType t) + : _n(n) + , _t(t) + {} + inline bool operator<(const MeterMatricsMapKey& rhs) const { + return (_n < rhs._n) || (_n == rhs._n && _t < rhs._t); + } + std::string _n; + MeterType _t; +}; + namespace ArdourMeter { - typedef std::map TickPatterns; - typedef std::map MetricPatterns; + typedef std::map MetricPatternMap; } -static ArdourMeter::TickPatterns ticks_patterns; -static ArdourMeter::MetricPatterns metric_patterns; +static ArdourMeter::MetricPatternMap ticks_patterns; +static ArdourMeter::MetricPatternMap metric_patterns; + const std::string ArdourMeter::meter_type_string (ARDOUR::MeterType mt) @@ -61,14 +78,26 @@ ArdourMeter::meter_type_string (ARDOUR::MeterType mt) case MeterPeak: return _("Peak"); break; - case MeterKrms: + case MeterRMS: return _("RMS + Peak"); break; - case MeterIEC1: - return _("DIN"); + case MeterIEC1DIN: + return _("IEC1/DIN"); break; - case MeterIEC2: - return _("EBU/BBC"); + case MeterIEC1NOR: + return _("IEC1/NOR"); + break; + case MeterIEC2BBC: + return _("IEC2/BBC"); + break; + case MeterIEC2EBU: + return _("IEC2/EBU"); + break; + case MeterK20: + return _("K20"); + break; + case MeterK14: + return _("K14"); break; case MeterVU: return _("VU"); @@ -79,8 +108,99 @@ ArdourMeter::meter_type_string (ARDOUR::MeterType mt) } } + +static inline float mtr_col_and_fract( + cairo_t* cr, Gdk::Color const * const c, const uint32_t peakcolor, const MeterType mt, const float val) +{ + float fraction = 0; + + switch (mt) { + default: + case MeterRMS: + case MeterPeak: + fraction = log_meter (val); + if (val >= 0 || val == -9) { + cairo_set_source_rgb (cr, + UINT_RGBA_R_FLT(peakcolor), + UINT_RGBA_G_FLT(peakcolor), + UINT_RGBA_B_FLT(peakcolor)); + } else { + cairo_set_source_rgb (cr, c->get_red_p(), c->get_green_p(), c->get_blue_p()); + } + break; + case MeterIEC2BBC: + case MeterIEC2EBU: + fraction = meter_deflect_ppm(val); + if (val >= -10.0) { + cairo_set_source_rgb (cr, + UINT_RGBA_R_FLT(peakcolor), + UINT_RGBA_G_FLT(peakcolor), + UINT_RGBA_B_FLT(peakcolor)); + } else { + cairo_set_source_rgb (cr, c->get_red_p(), c->get_green_p(), c->get_blue_p()); + } + break; + case MeterIEC1NOR: + fraction = meter_deflect_nordic(val); + if (val >= -12.0) { + cairo_set_source_rgb (cr, + UINT_RGBA_R_FLT(peakcolor), + UINT_RGBA_G_FLT(peakcolor), + UINT_RGBA_B_FLT(peakcolor)); + } else { + cairo_set_source_rgb (cr, c->get_red_p(), c->get_green_p(), c->get_blue_p()); + } + break; + case MeterIEC1DIN: + fraction = meter_deflect_din(val); + if (val >= -9.0) { + cairo_set_source_rgb (cr, + UINT_RGBA_R_FLT(peakcolor), + UINT_RGBA_G_FLT(peakcolor), + UINT_RGBA_B_FLT(peakcolor)); + } else { + cairo_set_source_rgb (cr, c->get_red_p(), c->get_green_p(), c->get_blue_p()); + } + break; + case MeterVU: + fraction = meter_deflect_vu(val); + if (val >= -20.0) { + cairo_set_source_rgb (cr, + UINT_RGBA_R_FLT(peakcolor), + UINT_RGBA_G_FLT(peakcolor), + UINT_RGBA_B_FLT(peakcolor)); + } else { + cairo_set_source_rgb (cr, c->get_red_p(), c->get_green_p(), c->get_blue_p()); + } + break; + case MeterK20: + fraction = meter_deflect_k (val, 20); + if (val >= -16.0) { + cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); // red + } else if (val >= -20.0) { + cairo_set_source_rgb (cr, 0.8, 0.8, 0.0); // yellow + } else { + cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); // green + } + break; + case MeterK14: + if (val >= -10.0) { + cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); // red + } else if (val >= -14.0) { + cairo_set_source_rgb (cr, 0.8, 0.8, 0.0); // yellow + } else { + cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); // green + } + fraction = meter_deflect_k (val, 14); + break; + } + return fraction; +} + + + static cairo_pattern_t* -meter_render_ticks (Gtk::Widget& w, vector types) +meter_render_ticks (Gtk::Widget& w, MeterType type, vector types) { Glib::RefPtr win (w.get_window()); @@ -131,45 +251,153 @@ meter_render_ticks (Gtk::Widget& w, vector types) switch (*i) { case DataType::AUDIO: - points.insert (std::pair(-60, 0.5)); - points.insert (std::pair(-50, 0.5)); - points.insert (std::pair(-40, 0.5)); - points.insert (std::pair(-30, 0.5)); - if (Config->get_meter_line_up_level() == MeteringLineUp24) { - points.insert (std::pair(-24, 0.5)); - } else { - points.insert (std::pair(-25, 0.5)); + + switch (type) { + case MeterK14: + points.insert (std::pair(-54.0f, 1.0)); + points.insert (std::pair(-44.0f, 1.0)); + points.insert (std::pair(-34.0f, 1.0)); + points.insert (std::pair(-24.0f, 1.0)); + points.insert (std::pair(-20.0f, 1.0)); + points.insert (std::pair(-17.0f, 1.0)); + points.insert (std::pair(-14.0f, 1.0)); + points.insert (std::pair(-11.0f, 1.0)); + points.insert (std::pair( -8.0f, 1.0)); + points.insert (std::pair( -4.0f, 1.0)); + points.insert (std::pair( 0.0f, 1.0)); + break; + case MeterK20: + points.insert (std::pair(-60.0f, 1.0)); + points.insert (std::pair(-50.0f, 1.0)); + points.insert (std::pair(-40.0f, 1.0)); + points.insert (std::pair(-30.0f, 1.0)); + points.insert (std::pair(-26.0f, 1.0)); + points.insert (std::pair(-23.0f, 1.0)); + points.insert (std::pair(-20.0f, 1.0)); + points.insert (std::pair(-17.0f, 1.0)); + points.insert (std::pair(-14.0f, 1.0)); + points.insert (std::pair(-10.0f, 1.0)); + points.insert (std::pair( -5.0f, 1.0)); + points.insert (std::pair( 0.0f, 1.0)); + break; + case MeterIEC2EBU: + points.insert (std::pair(-30.0f, 1.0)); + points.insert (std::pair(-28.0f, 0.5)); + points.insert (std::pair(-26.0f, 1.0)); + points.insert (std::pair(-24.0f, 0.5)); + points.insert (std::pair(-22.0f, 1.0)); + points.insert (std::pair(-20.0f, 0.5)); + points.insert (std::pair(-18.0f, 1.0)); + points.insert (std::pair(-16.0f, 0.5)); + points.insert (std::pair(-14.0f, 1.0)); + points.insert (std::pair(-12.0f, 0.5)); + points.insert (std::pair(-10.0f, 1.0)); + points.insert (std::pair( -9.0f, 0.5)); + points.insert (std::pair( -8.0f, 0.5)); + points.insert (std::pair( -6.0f, 1.0)); + break; + case MeterIEC2BBC: + points.insert (std::pair(-30.0f, 1.0)); + points.insert (std::pair(-26.0f, 1.0)); + points.insert (std::pair(-22.0f, 1.0)); + points.insert (std::pair(-18.0f, 1.0)); + points.insert (std::pair(-14.0f, 1.0)); + points.insert (std::pair(-10.0f, 1.0)); + points.insert (std::pair( -6.0f, 1.0)); + break; + case MeterIEC1NOR: + points.insert (std::pair(-60.0f, 1.0)); // -42 + points.insert (std::pair(-57.0f, 0.5)); + points.insert (std::pair(-54.0f, 1.0)); + points.insert (std::pair(-51.0f, 0.5)); + points.insert (std::pair(-48.0f, 1.0)); + points.insert (std::pair(-45.0f, 0.5)); + points.insert (std::pair(-42.0f, 1.0)); + points.insert (std::pair(-39.0f, 0.5)); + points.insert (std::pair(-36.0f, 1.0)); + + points.insert (std::pair(-33.0f, 1.0)); + points.insert (std::pair(-30.0f, 1.0)); + points.insert (std::pair(-27.0f, 1.0)); + points.insert (std::pair(-24.0f, 1.0)); + points.insert (std::pair(-21.0f, 1.0)); + + points.insert (std::pair(-18.0f, 1.0)); + points.insert (std::pair(-15.0f, 1.0)); + points.insert (std::pair(-12.0f, 1.0)); + points.insert (std::pair( -9.0f, 1.0)); + points.insert (std::pair( -6.0f, 1.0)); + break; + case MeterIEC1DIN: + points.insert (std::pair( -3.0f, 0.5)); // "200%" + points.insert (std::pair( -4.0f, 1.0)); // "100%" + points.insert (std::pair( -9.0f, 1.0)); + points.insert (std::pair(-14.0f, 1.0)); + points.insert (std::pair(-15.0f, 0.5)); // "50%" + points.insert (std::pair(-18.0f, 0.5)); // "-9" + points.insert (std::pair(-19.0f, 1.0)); // "30%" + points.insert (std::pair(-29.0f, 1.0)); // "10%" + points.insert (std::pair(-35.0f, 0.5)); // "5%" " -20" + points.insert (std::pair(-39.0f, 1.0)); // "3%" + points.insert (std::pair(-49.0f, 0.5)); // "1%" + points.insert (std::pair(-59.0f, 1.0)); + break; + case MeterVU: + points.insert (std::pair(-17.0f, 1.0)); + points.insert (std::pair(-18.0f, 1.0)); + points.insert (std::pair(-19.0f, 1.0)); + points.insert (std::pair(-20.0f, 1.0)); + points.insert (std::pair(-21.0f, 1.0)); + points.insert (std::pair(-22.0f, 1.0)); + points.insert (std::pair(-23.0f, 1.0)); + points.insert (std::pair(-25.0f, 1.0)); + points.insert (std::pair(-27.0f, 1.0)); + points.insert (std::pair(-30.0f, 1.0)); + points.insert (std::pair(-40.0f, 1.0)); + break; + + default: + points.insert (std::pair(-60, 0.5)); + points.insert (std::pair(-50, 1.0)); + points.insert (std::pair(-40, 1.0)); + points.insert (std::pair(-30, 1.0)); + if (Config->get_meter_line_up_level() == MeteringLineUp24) { + points.insert (std::pair(-24, 1.0)); + } else { + points.insert (std::pair(-25, 1.0)); + } + points.insert (std::pair(-20, 1.0)); + + points.insert (std::pair(-19, 0.5)); + points.insert (std::pair(-18, 1.0)); + points.insert (std::pair(-17, 0.5)); + points.insert (std::pair(-16, 0.5)); + points.insert (std::pair(-15, 1.0)); + + points.insert (std::pair(-14, 0.5)); + points.insert (std::pair(-13, 0.5)); + points.insert (std::pair(-12, 0.5)); + points.insert (std::pair(-11, 0.5)); + points.insert (std::pair(-10, 1.0)); + + points.insert (std::pair( -9, 1.0)); + points.insert (std::pair( -8, 0.5)); + points.insert (std::pair( -7, 0.5)); + points.insert (std::pair( -6, 0.5)); + points.insert (std::pair( -5, 1.0)); + points.insert (std::pair( -4, 0.5)); + points.insert (std::pair( -3, 1.0)); + points.insert (std::pair( -2, 0.5)); + points.insert (std::pair( -1, 0.5)); + + points.insert (std::pair( 0, 1.0)); + points.insert (std::pair( 1, 0.5)); + points.insert (std::pair( 2, 0.5)); + points.insert (std::pair( 3, 1.0)); + points.insert (std::pair( 4, 0.5)); + points.insert (std::pair( 5, 0.5)); + break; } - points.insert (std::pair(-20, 1.0)); - - points.insert (std::pair(-19, 0.5)); - points.insert (std::pair(-18, 1.0)); - points.insert (std::pair(-17, 0.5)); - points.insert (std::pair(-16, 0.5)); - points.insert (std::pair(-15, 1.0)); - - points.insert (std::pair(-14, 0.5)); - points.insert (std::pair(-13, 0.5)); - points.insert (std::pair(-12, 0.5)); - points.insert (std::pair(-11, 0.5)); - points.insert (std::pair(-10, 1.0)); - - points.insert (std::pair( -9, 0.5)); - points.insert (std::pair( -8, 0.5)); - points.insert (std::pair( -7, 0.5)); - points.insert (std::pair( -6, 0.5)); - points.insert (std::pair( -5, 1.0)); - points.insert (std::pair( -4, 0.5)); - points.insert (std::pair( -3, 0.5)); - points.insert (std::pair( -2, 0.5)); - points.insert (std::pair( -1, 0.5)); - - points.insert (std::pair( 0, 1.0)); - points.insert (std::pair( 1, 0.5)); - points.insert (std::pair( 2, 0.5)); - points.insert (std::pair( 3, 0.5)); - points.insert (std::pair( 4, 0.5)); - points.insert (std::pair( 5, 0.5)); break; case DataType::MIDI: @@ -194,16 +422,10 @@ meter_render_ticks (Gtk::Widget& w, vector types) switch (*i) { case DataType::AUDIO: - if (j->first >= 0 || j->first == -9) { - cairo_set_source_rgb (cr, - UINT_RGBA_R_FLT(peakcolor), - UINT_RGBA_G_FLT(peakcolor), - UINT_RGBA_B_FLT(peakcolor)); - } else { - cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); - } - fraction = log_meter (j->first); + fraction = mtr_col_and_fract(cr, &c, peakcolor, type, j->first); + pos = height - (gint) floor (height * fraction); + pos = max (pos, 1); cairo_move_to(cr, 0, pos + .5); cairo_line_to(cr, 3, pos + .5); cairo_stroke (cr); @@ -227,9 +449,8 @@ meter_render_ticks (Gtk::Widget& w, vector types) return pattern; } - static cairo_pattern_t* -meter_render_metrics (Gtk::Widget& w, vector types) +meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) { Glib::RefPtr win (w.get_window()); @@ -286,16 +507,16 @@ meter_render_metrics (Gtk::Widget& w, vector types) } cairo_fill (cr); + cairo_set_line_width (cr, 1.0); + height = min(max_pattern_metric_size, height); uint32_t peakcolor = ARDOUR_UI::config()->color_by_name ("meterbridge peaklabel"); for (vector::const_iterator i = types.begin(); i != types.end(); ++i) { Gdk::Color c; - if (types.size() > 1) { /* we're overlaying more than 1 set of marks, so use different colours */ - Gdk::Color c; switch (*i) { case DataType::AUDIO: c = w.get_style()->get_fg (Gtk::STATE_NORMAL); @@ -311,100 +532,191 @@ meter_render_metrics (Gtk::Widget& w, vector types) cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); } - std::map points; + + std::map points; switch (*i) { case DataType::AUDIO: layout->set_attributes (audio_font_attributes); - points.insert (std::pair(-50, 0.5)); - points.insert (std::pair(-40, 0.5)); - points.insert (std::pair(-30, 0.5)); - points.insert (std::pair(-20, 1.0)); - if (types.size() == 1) { - if (Config->get_meter_line_up_level() == MeteringLineUp24) { - points.insert (std::pair(-24, 0.5)); - } else { - points.insert (std::pair(-25, 0.5)); - } - points.insert (std::pair(-15, 1.0)); - } - points.insert (std::pair(-18, 1.0)); - points.insert (std::pair(-10, 1.0)); - points.insert (std::pair( -5, 1.0)); - points.insert (std::pair( -3, 0.5)); - points.insert (std::pair( 0, 1.0)); - points.insert (std::pair( 3, 0.5)); - break; + switch (type) { + case MeterK14: + points.insert (std::pair(-54.0f, "-40")); + points.insert (std::pair(-44.0f, "-30")); + points.insert (std::pair(-34.0f, "-20")); + points.insert (std::pair(-24.0f, "-10")); + points.insert (std::pair(-20.0f, "-6")); + points.insert (std::pair(-17.0f, "-3")); + points.insert (std::pair(-14.0f, "0")); + points.insert (std::pair(-11.0f, "+3")); + points.insert (std::pair( -8.0f, "+6")); + points.insert (std::pair( -4.0f, "+10")); + points.insert (std::pair( 0.0f, "+14")); + break; + case MeterK20: + points.insert (std::pair(-60.0f, "-40")); + points.insert (std::pair(-50.0f, "-30")); + points.insert (std::pair(-40.0f, "-20")); + points.insert (std::pair(-30.0f, "-10")); + points.insert (std::pair(-26.0f, "-6")); + points.insert (std::pair(-23.0f, "-3")); + points.insert (std::pair(-20.0f, "0")); + points.insert (std::pair(-17.0f, "+3")); + points.insert (std::pair(-14.0f, "+6")); + points.insert (std::pair(-10.0f, "+10")); + points.insert (std::pair( -5.0f, "+15")); + points.insert (std::pair( 0.0f, "+20")); + break; + default: + case MeterPeak: + case MeterRMS: + points.insert (std::pair(-50.0f, "-50")); + points.insert (std::pair(-40.0f, "-40")); + points.insert (std::pair(-30.0f, "-30")); + points.insert (std::pair(-20.0f, "-20")); + if (types.size() == 1) { + if (Config->get_meter_line_up_level() == MeteringLineUp24) { + points.insert (std::pair(-24.0f, "-24")); + } else { + points.insert (std::pair(-25.0f, "-25")); + } + points.insert (std::pair(-15.0f, "-15")); + } + points.insert (std::pair(-18.0f, "-18")); + points.insert (std::pair(-10.0f, "-10")); + points.insert (std::pair( -5.0f, "-5")); + points.insert (std::pair( -3.0f, "-3")); + points.insert (std::pair( 0.0f, "+0")); + points.insert (std::pair( 3.0f, "+3")); + break; + case MeterIEC2EBU: + points.insert (std::pair(-30.0f, "-12")); + points.insert (std::pair(-26.0f, "-8")); + points.insert (std::pair(-22.0f, "-4")); + points.insert (std::pair(-18.0f, "TST")); + points.insert (std::pair(-14.0f, "+4")); + points.insert (std::pair(-10.0f, "+8")); + points.insert (std::pair( -6.0f, "+12")); + break; + + case MeterIEC2BBC: + points.insert (std::pair(-30.0f, "1")); + points.insert (std::pair(-26.0f, "2")); + points.insert (std::pair(-22.0f, "3")); + points.insert (std::pair(-18.0f, "4")); + points.insert (std::pair(-14.0f, "5")); + points.insert (std::pair(-10.0f, "6")); + points.insert (std::pair( -6.0f, "7")); + break; + + case MeterIEC1NOR: + //points.insert (std::pair(-60.0f, "-42")); + points.insert (std::pair(-54.0f, "-36")); + points.insert (std::pair(-48.0f, "-30")); + points.insert (std::pair(-42.0f, "-24")); + points.insert (std::pair(-36.0f, "-18")); + + points.insert (std::pair(-33.0f, "-15")); + points.insert (std::pair(-30.0f, "-12")); + points.insert (std::pair(-27.0f, "-9")); + points.insert (std::pair(-24.0f, "-6")); + points.insert (std::pair(-21.0f, "-3")); + + points.insert (std::pair(-18.0f, "TST")); + points.insert (std::pair(-15.0f, "+3")); + points.insert (std::pair(-12.0f, "+6")); + points.insert (std::pair( -9.0f, "+9")); + points.insert (std::pair( -6.0f, "+12")); + break; + + case MeterIEC1DIN: + //points.insert (std::pair( -3.0f, "200%")); + points.insert (std::pair( -4.0f, "+5")); // "100%" + points.insert (std::pair( -9.0f, "0")); + points.insert (std::pair(-14.0f, "-5")); + //points.insert (std::pair(-15.0f, "50%")); + //points.insert (std::pair(-18.0f, "-9")); + points.insert (std::pair(-19.0f, "-10")); // "30%" + points.insert (std::pair(-29.0f, "-20")); // "10%" + //points.insert (std::pair(-35.0f, "-20")); // "5%" + points.insert (std::pair(-39.0f, "-30")); // "3%" + //points.insert (std::pair(-49.0f, "1%")); + points.insert (std::pair(-59.0f, "-50")); + break; + + case MeterVU: + points.insert (std::pair(-17.0f, "+3")); + points.insert (std::pair(-18.0f, "+2")); + points.insert (std::pair(-19.0f, "+1")); + points.insert (std::pair(-20.0f, "0")); + points.insert (std::pair(-21.0f, "-1")); + points.insert (std::pair(-22.0f, "-2")); + points.insert (std::pair(-23.0f, "-3")); + points.insert (std::pair(-25.0f, "-5")); + points.insert (std::pair(-27.0f, "-7")); + points.insert (std::pair(-30.0f, "-10")); + points.insert (std::pair(-40.0f, "-20")); + break; + } + break; case DataType::MIDI: layout->set_attributes (midi_font_attributes); - points.insert (std::pair( 0, 1.0)); + points.insert (std::pair( 0, "0")); if (types.size() == 1) { - points.insert (std::pair( 16, 0.5)); - points.insert (std::pair( 32, 0.5)); - points.insert (std::pair( 48, 0.5)); - points.insert (std::pair( 64, 1.0)); - points.insert (std::pair( 80, 0.5)); - points.insert (std::pair( 96, 0.5)); - points.insert (std::pair(100, 0.5)); - points.insert (std::pair(112, 0.5)); + points.insert (std::pair( 16, "16")); + points.insert (std::pair( 32, "32")); + points.insert (std::pair( 48, "48")); + points.insert (std::pair( 64, "64")); + points.insert (std::pair( 80, "80")); + points.insert (std::pair( 96, "96")); + points.insert (std::pair(100, "100")); + points.insert (std::pair(112, "112")); } else { /* labels that don't overlay with dB */ - points.insert (std::pair( 24, 0.5)); - points.insert (std::pair( 48, 0.5)); - points.insert (std::pair( 72, 0.5)); + points.insert (std::pair( 24, "24")); + points.insert (std::pair( 48, "48")); + points.insert (std::pair( 72, "74")); } - points.insert (std::pair(127, 1.0)); + points.insert (std::pair(127, "127")); break; } - char buf[32]; gint pos; - for (std::map::const_iterator j = points.begin(); j != points.end(); ++j) { - + for (std::map::const_iterator j = points.begin(); j != points.end(); ++j) { float fraction = 0; switch (*i) { - case DataType::AUDIO: - cairo_set_line_width (cr, (j->second)); - if (j->first >= 0) { - cairo_set_source_rgb (cr, - UINT_RGBA_R_FLT(peakcolor), - UINT_RGBA_G_FLT(peakcolor), - UINT_RGBA_B_FLT(peakcolor)); - } - fraction = log_meter (j->first); - snprintf (buf, sizeof (buf), "%+2d", j->first); - pos = height - (gint) floor (height * fraction); - if (tickleft) { - cairo_move_to(cr, width-1.5, pos + .5); - cairo_line_to(cr, width, pos + .5); - cairo_stroke (cr); - } else if (tickright) { - cairo_move_to(cr, 0, pos + .5); - cairo_line_to(cr, 1.5, pos + .5); - cairo_stroke (cr); - } - break; - case DataType::MIDI: - cairo_set_line_width (cr, 1.0); - fraction = (j->first) / 127.0; - snprintf (buf, sizeof (buf), "%3d", j->first); - pos = 1 + height - (gint) rintf (height * fraction); - pos = min (pos, height); - if (tickleft) { - cairo_arc(cr, width - 2.0, pos + .5, 1.0, 0, 2 * M_PI); - cairo_fill(cr); - } else if (tickright) { - cairo_arc(cr, 3, pos + .5, 1.0, 0, 2 * M_PI); - cairo_fill(cr); - } - break; + case DataType::AUDIO: + fraction = mtr_col_and_fract(cr, &c, peakcolor, type, j->first); + + pos = height - (gint) floor (height * fraction); + pos = max (pos, 1); + if (tickleft) { + cairo_move_to(cr, width-1.5, pos + .5); + cairo_line_to(cr, width, pos + .5); + cairo_stroke (cr); + } else if (tickright) { + cairo_move_to(cr, 0, pos + .5); + cairo_line_to(cr, 1.5, pos + .5); + cairo_stroke (cr); + } + break; + + case DataType::MIDI: + fraction = (j->first) / 127.0; + pos = 1 + height - (gint) rintf (height * fraction); + pos = min (pos, height); + if (tickleft) { + cairo_arc(cr, width - 2.0, pos + .5, 1.0, 0, 2 * M_PI); + cairo_fill(cr); + } else if (tickright) { + cairo_arc(cr, 3, pos + .5, 1.0, 0, 2 * M_PI); + cairo_fill(cr); + } + break; } - layout->set_text(buf); - - /* we want logical extents, not ink extents here */ + layout->set_text(j->second.c_str()); int tw, th; layout->get_pixel_size(tw, th); @@ -418,12 +730,40 @@ meter_render_metrics (Gtk::Widget& w, vector types) } } + // add legend if (types.size() == 1) { int tw, th; layout->set_attributes (unit_font_attributes); switch (types.at(0)) { case DataType::AUDIO: - layout->set_text("dBFS"); + switch (type) { + case MeterK20: + layout->set_text("K20"); + break; + case MeterK14: + layout->set_text("K14"); + break; + default: + case MeterPeak: + case MeterRMS: + layout->set_text("dBFS"); + break; + case MeterIEC2EBU: + layout->set_text("EBU"); + break; + case MeterIEC2BBC: + layout->set_text("BBC"); + break; + case MeterIEC1DIN: + layout->set_text("DIN"); + break; + case MeterIEC1NOR: + layout->set_text("NOR"); + break; + case MeterVU: + layout->set_text("VU"); + break; + } layout->get_pixel_size(tw, th); break; case DataType::MIDI: @@ -445,9 +785,8 @@ meter_render_metrics (Gtk::Widget& w, vector types) return pattern; } - gint -ArdourMeter::meter_expose_ticks (GdkEventExpose *ev, std::vector types, Gtk::DrawingArea *mta) +ArdourMeter::meter_expose_ticks (GdkEventExpose *ev, MeterType type, std::vector types, Gtk::DrawingArea *mta) { Glib::RefPtr win (mta->get_window()); cairo_t* cr; @@ -460,11 +799,12 @@ ArdourMeter::meter_expose_ticks (GdkEventExpose *ev, std::vectorget_name()); + const MeterMatricsMapKey key (mta->get_name(), type); + MetricPatternMap::iterator i = ticks_patterns.find (key); if (i == ticks_patterns.end()) { - pattern = meter_render_ticks (*mta, types); - ticks_patterns[mta->get_name()] = pattern; + pattern = meter_render_ticks (*mta, type, types); + ticks_patterns[key] = pattern; } else { pattern = i->second; } @@ -484,7 +824,7 @@ ArdourMeter::meter_expose_ticks (GdkEventExpose *ev, std::vector types, Gtk::DrawingArea *mma) +ArdourMeter::meter_expose_metrics (GdkEventExpose *ev, MeterType type, std::vector types, Gtk::DrawingArea *mma) { Glib::RefPtr win (mma->get_window()); cairo_t* cr; @@ -497,11 +837,12 @@ ArdourMeter::meter_expose_metrics (GdkEventExpose *ev, std::vectorget_name()); + const MeterMatricsMapKey key (mma->get_name(), type); + MetricPatternMap::iterator i = metric_patterns.find (key); if (i == metric_patterns.end()) { - pattern = meter_render_metrics (*mma, types); - metric_patterns[mma->get_name()] = pattern; + pattern = meter_render_metrics (*mma, type, types); + metric_patterns[key] = pattern; } else { pattern = i->second; } @@ -522,12 +863,13 @@ ArdourMeter::meter_expose_metrics (GdkEventExpose *ev, std::vectorfirst; + MeterMatricsMapKey const * const key = &(i->first); + std::string n = key->_n; if (n.substr(n.length() - 4) == "Left") { m = 1; } if (n.substr(n.length() - 5) == "Right") { m = 2; } if (which & m) { @@ -540,7 +882,8 @@ ArdourMeter::meter_clear_pattern_cache(int which) { while (j != ticks_patterns.end()) { int m = 4; - std::string n = j->first; + MeterMatricsMapKey const * const key = &(j->first); + std::string n = key->_n; if (n.substr(n.length() - 4) == "Left") { m = 1; } if (n.substr(n.length() - 5) == "Right") { m = 2; } if (which & m) { diff --git a/gtk2_ardour/meter_patterns.h b/gtk2_ardour/meter_patterns.h index 90ef4ec980..f505ba37c7 100644 --- a/gtk2_ardour/meter_patterns.h +++ b/gtk2_ardour/meter_patterns.h @@ -37,8 +37,8 @@ extern sigc::signal RedrawMetrics; extern sigc::signal SetMeterTypeMulti; -gint meter_expose_ticks (GdkEventExpose *ev, std::vector types, Gtk::DrawingArea *mta); -gint meter_expose_metrics (GdkEventExpose *ev, std::vector types, Gtk::DrawingArea *mma); +gint meter_expose_ticks (GdkEventExpose *ev, ARDOUR::MeterType type, std::vector types, Gtk::DrawingArea *mta); +gint meter_expose_metrics (GdkEventExpose *ev, ARDOUR::MeterType type, std::vector types, Gtk::DrawingArea *mma); void meter_clear_pattern_cache(int which=7); diff --git a/gtk2_ardour/meter_strip.cc b/gtk2_ardour/meter_strip.cc index 3a8410867a..263241bbd1 100644 --- a/gtk2_ardour/meter_strip.cc +++ b/gtk2_ardour/meter_strip.cc @@ -112,8 +112,8 @@ MeterStrip::MeterStrip (Session* sess, boost::shared_ptr rt) level_meter = new LevelMeter(sess); level_meter->set_meter (_route->shared_peak_meter().get()); level_meter->clear_meters(); - level_meter->setup_meters (220, meter_width, 6); level_meter->set_type (_route->meter_type()); + level_meter->setup_meters (220, meter_width, 6); level_meter->ButtonPress.connect_same_thread (level_meter_connection, boost::bind (&MeterStrip::level_meter_button_press, this, _1)); level_meter->MeterTypeChanged.connect_same_thread (level_meter_connection, boost::bind (&MeterStrip::meter_type_changed, this, _1)); @@ -394,7 +394,8 @@ MeterStrip::on_size_allocate (Gtk::Allocation& a) gint MeterStrip::meter_metrics_expose (GdkEventExpose *ev) { - return meter_expose_metrics(ev, _types, &meter_metric_area); + // TODO meter-type - set with set_metric_mode() + return meter_expose_metrics(ev, /*XXX*/ MeterPeak, _types, &meter_metric_area); } void @@ -432,13 +433,15 @@ MeterStrip::set_pos (int pos) gint MeterStrip::meter_ticks1_expose (GdkEventExpose *ev) { - return meter_expose_ticks(ev, _types, &meter_ticks1_area); + assert(_route); + return meter_expose_ticks(ev, _route->meter_type(), _types, &meter_ticks1_area); } gint MeterStrip::meter_ticks2_expose (GdkEventExpose *ev) { - return meter_expose_ticks(ev, _types, &meter_ticks2_area); + assert(_route); + return meter_expose_ticks(ev, _route->meter_type(), _types, &meter_ticks2_area); } void @@ -572,10 +575,14 @@ MeterStrip::popup_level_meter_menu (GdkEventButton* ev) _suspend_menu_callbacks = true; add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterPeak), MeterPeak); - add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterKrms), MeterKrms); - add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterIEC1), MeterIEC1); - add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterIEC2), MeterIEC2); - add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterVU), MeterVU); + add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterRMS), MeterRMS); + add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterIEC1DIN), MeterIEC1DIN); + add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterIEC1NOR), MeterIEC1NOR); + add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterIEC2BBC), MeterIEC2BBC); + add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterIEC2EBU), MeterIEC2EBU); + add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterK20), MeterK20); + add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterK14), MeterK14); + add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterVU), MeterVU); MeterType cmt = _route->meter_type(); const std::string cmn = ArdourMeter::meter_type_string(cmt); diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index dec072b067..e4afad2fea 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -2134,10 +2134,14 @@ MixerStrip::popup_level_meter_menu (GdkEventButton* ev) items.push_back (SeparatorElem()); add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterPeak), MeterPeak); - add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterKrms), MeterKrms); - add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC1), MeterIEC1); - add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC2), MeterIEC2); - add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterVU), MeterVU); + add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterRMS), MeterRMS); + add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC1DIN), MeterIEC1DIN); + add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC1NOR), MeterIEC1NOR); + add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC2BBC), MeterIEC2BBC); + add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC2EBU), MeterIEC2EBU); + add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterK20), MeterK20); + add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterK14), MeterK14); + add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterVU), MeterVU); int _strip_type; if (_route->is_master()) { diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h index df7209b581..7b396796ad 100644 --- a/libs/ardour/ardour/types.h +++ b/libs/ardour/ardour/types.h @@ -178,13 +178,17 @@ namespace ARDOUR { }; enum MeterType { - MeterMaxSignal = 0x01, - MeterMaxPeak = 0x02, - MeterPeak = 0x04, - MeterKrms = 0x08, - MeterIEC1 = 0x10, - MeterIEC2 = 0x20, - MeterVU = 0x40 + MeterMaxSignal = 0x001, + MeterMaxPeak = 0x002, + MeterPeak = 0x004, + MeterRMS = 0x008, + MeterK20 = 0x010, + MeterK14 = 0x020, + MeterIEC1DIN = 0x040, + MeterIEC1NOR = 0x080, + MeterIEC2BBC = 0x100, + MeterIEC2EBU = 0x200, + MeterVU = 0x400 }; enum TrackMode { diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc index 12eb59ce65..eab3176f57 100644 --- a/libs/ardour/enums.cc +++ b/libs/ardour/enums.cc @@ -176,9 +176,13 @@ setup_enum_writer () REGISTER_ENUM (MeterMaxSignal); REGISTER_ENUM (MeterMaxPeak); REGISTER_ENUM (MeterPeak); - REGISTER_ENUM (MeterKrms); - REGISTER_ENUM (MeterIEC1); - REGISTER_ENUM (MeterIEC2); + REGISTER_ENUM (MeterRMS); + REGISTER_ENUM (MeterK20); + REGISTER_ENUM (MeterK14); + REGISTER_ENUM (MeterIEC1DIN); + REGISTER_ENUM (MeterIEC1NOR); + REGISTER_ENUM (MeterIEC2BBC); + REGISTER_ENUM (MeterIEC2EBU); REGISTER_ENUM (MeterVU); REGISTER (_MeterType); diff --git a/libs/ardour/meter.cc b/libs/ardour/meter.cc index 3ca19afe76..8b9ed436a4 100644 --- a/libs/ardour/meter.cc +++ b/libs/ardour/meter.cc @@ -106,13 +106,13 @@ PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_fr // Meter audio in to the rest of the peaks for (uint32_t i = 0; i < n_audio; ++i, ++n) { _peak_signal[n] = compute_peak (bufs.get_audio(i).data(), nframes, _peak_signal[n]); - if (_meter_type & MeterKrms) { + if (_meter_type & (MeterRMS | MeterK20 | MeterK14)) { _kmeter[i]->process(bufs.get_audio(i).data(), nframes); } - if (_meter_type & MeterIEC1) { + if (_meter_type & (MeterIEC1DIN | MeterIEC1NOR)) { _iec1meter[i]->process(bufs.get_audio(i).data(), nframes); } - if (_meter_type & MeterIEC2) { + if (_meter_type & (MeterIEC2BBC | MeterIEC2EBU)) { _iec2meter[i]->process(bufs.get_audio(i).data(), nframes); } if (_meter_type & MeterVU) { @@ -323,7 +323,9 @@ PeakMeter::meter () float PeakMeter::meter_level(uint32_t n, MeterType type) { switch (type) { - case MeterKrms: + case MeterRMS: + case MeterK20: + case MeterK14: { const uint32_t n_midi = current_meters.n_midi(); if ((n - n_midi) < _kmeter.size() && (n - n_midi) >= 0) { @@ -331,7 +333,8 @@ PeakMeter::meter_level(uint32_t n, MeterType type) { } } break; - case MeterIEC1: + case MeterIEC1DIN: + case MeterIEC1NOR: { const uint32_t n_midi = current_meters.n_midi(); if ((n - n_midi) < _iec1meter.size() && (n - n_midi) >= 0) { @@ -339,7 +342,8 @@ PeakMeter::meter_level(uint32_t n, MeterType type) { } } break; - case MeterIEC2: + case MeterIEC2BBC: + case MeterIEC2EBU: { const uint32_t n_midi = current_meters.n_midi(); if ((n - n_midi) < _iec2meter.size() && (n - n_midi) >= 0) { @@ -381,19 +385,19 @@ PeakMeter::set_type(MeterType t) _meter_type = t; - if (t & MeterKrms) { + if (t & (MeterRMS | MeterK20 | MeterK14)) { const size_t n_audio = current_meters.n_audio(); for (size_t n = 0; n < n_audio; ++n) { _kmeter[n]->reset(); } } - if (t & MeterIEC1) { + if (t & (MeterIEC1DIN | MeterIEC1NOR)) { const size_t n_audio = current_meters.n_audio(); for (size_t n = 0; n < n_audio; ++n) { _iec1meter[n]->reset(); } } - if (t & MeterIEC2) { + if (t & (MeterIEC2BBC | MeterIEC2EBU)) { const size_t n_audio = current_meters.n_audio(); for (size_t n = 0; n < n_audio; ++n) { _iec2meter[n]->reset(); From df17094b478100f41ebaf4cd30432cef933b7523 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Mon, 22 Jul 2013 19:56:30 +0200 Subject: [PATCH 084/221] minor tweaks to meter-names and legend --- gtk2_ardour/meter_patterns.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index 60bd33ca26..5f4476e15d 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -85,7 +85,7 @@ ArdourMeter::meter_type_string (ARDOUR::MeterType mt) return _("IEC1/DIN"); break; case MeterIEC1NOR: - return _("IEC1/NOR"); + return _("IEC1/Nordic"); break; case MeterIEC2BBC: return _("IEC2/BBC"); @@ -773,7 +773,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) } Gdk::Color c = w.get_style()->get_fg (Gtk::STATE_ACTIVE); cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); - cairo_move_to (cr, 2, height - th - 1.5); + cairo_move_to (cr, 2, height - th - 0.5); pango_cairo_show_layout (cr, layout->gobj()); } From 06e7ad67ae9fb84828011d7522d7c1b4cbeb7c37 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Mon, 22 Jul 2013 19:59:24 +0200 Subject: [PATCH 085/221] restore session backwards compatibility to 3.3 --- gtk2_ardour/meter_patterns.cc | 8 ++++---- gtk2_ardour/meter_strip.cc | 2 +- gtk2_ardour/mixer_strip.cc | 2 +- libs/ardour/ardour/types.h | 2 +- libs/ardour/enums.cc | 2 +- libs/ardour/meter.cc | 6 +++--- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index 5f4476e15d..ff977c84c3 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -78,7 +78,7 @@ ArdourMeter::meter_type_string (ARDOUR::MeterType mt) case MeterPeak: return _("Peak"); break; - case MeterRMS: + case MeterKrms: return _("RMS + Peak"); break; case MeterIEC1DIN: @@ -116,7 +116,7 @@ static inline float mtr_col_and_fract( switch (mt) { default: - case MeterRMS: + case MeterKrms: case MeterPeak: fraction = log_meter (val); if (val >= 0 || val == -9) { @@ -568,7 +568,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) break; default: case MeterPeak: - case MeterRMS: + case MeterKrms: points.insert (std::pair(-50.0f, "-50")); points.insert (std::pair(-40.0f, "-40")); points.insert (std::pair(-30.0f, "-30")); @@ -745,7 +745,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) break; default: case MeterPeak: - case MeterRMS: + case MeterKrms: layout->set_text("dBFS"); break; case MeterIEC2EBU: diff --git a/gtk2_ardour/meter_strip.cc b/gtk2_ardour/meter_strip.cc index 263241bbd1..20419de7c7 100644 --- a/gtk2_ardour/meter_strip.cc +++ b/gtk2_ardour/meter_strip.cc @@ -575,7 +575,7 @@ MeterStrip::popup_level_meter_menu (GdkEventButton* ev) _suspend_menu_callbacks = true; add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterPeak), MeterPeak); - add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterRMS), MeterRMS); + add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterKrms), MeterKrms); add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterIEC1DIN), MeterIEC1DIN); add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterIEC1NOR), MeterIEC1NOR); add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterIEC2BBC), MeterIEC2BBC); diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index e4afad2fea..d77023d201 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -2134,7 +2134,7 @@ MixerStrip::popup_level_meter_menu (GdkEventButton* ev) items.push_back (SeparatorElem()); add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterPeak), MeterPeak); - add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterRMS), MeterRMS); + add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterKrms), MeterKrms); add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC1DIN), MeterIEC1DIN); add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC1NOR), MeterIEC1NOR); add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC2BBC), MeterIEC2BBC); diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h index 7b396796ad..553ee1ea28 100644 --- a/libs/ardour/ardour/types.h +++ b/libs/ardour/ardour/types.h @@ -181,7 +181,7 @@ namespace ARDOUR { MeterMaxSignal = 0x001, MeterMaxPeak = 0x002, MeterPeak = 0x004, - MeterRMS = 0x008, + MeterKrms = 0x008, MeterK20 = 0x010, MeterK14 = 0x020, MeterIEC1DIN = 0x040, diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc index eab3176f57..0d225fada3 100644 --- a/libs/ardour/enums.cc +++ b/libs/ardour/enums.cc @@ -176,7 +176,7 @@ setup_enum_writer () REGISTER_ENUM (MeterMaxSignal); REGISTER_ENUM (MeterMaxPeak); REGISTER_ENUM (MeterPeak); - REGISTER_ENUM (MeterRMS); + REGISTER_ENUM (MeterKrms); REGISTER_ENUM (MeterK20); REGISTER_ENUM (MeterK14); REGISTER_ENUM (MeterIEC1DIN); diff --git a/libs/ardour/meter.cc b/libs/ardour/meter.cc index 8b9ed436a4..32c7439fd5 100644 --- a/libs/ardour/meter.cc +++ b/libs/ardour/meter.cc @@ -106,7 +106,7 @@ PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_fr // Meter audio in to the rest of the peaks for (uint32_t i = 0; i < n_audio; ++i, ++n) { _peak_signal[n] = compute_peak (bufs.get_audio(i).data(), nframes, _peak_signal[n]); - if (_meter_type & (MeterRMS | MeterK20 | MeterK14)) { + if (_meter_type & (MeterKrms | MeterK20 | MeterK14)) { _kmeter[i]->process(bufs.get_audio(i).data(), nframes); } if (_meter_type & (MeterIEC1DIN | MeterIEC1NOR)) { @@ -323,7 +323,7 @@ PeakMeter::meter () float PeakMeter::meter_level(uint32_t n, MeterType type) { switch (type) { - case MeterRMS: + case MeterKrms: case MeterK20: case MeterK14: { @@ -385,7 +385,7 @@ PeakMeter::set_type(MeterType t) _meter_type = t; - if (t & (MeterRMS | MeterK20 | MeterK14)) { + if (t & (MeterKrms | MeterK20 | MeterK14)) { const size_t n_audio = current_meters.n_audio(); for (size_t n = 0; n < n_audio; ++n) { _kmeter[n]->reset(); From 8013160eb369ae8a97392284602e41cc77617b79 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 23 Jul 2013 13:30:23 +0200 Subject: [PATCH 086/221] meterbridge metrics update: * display metrics for every used meter-type * show metrics between meters with differnet types * update text and label alignment for meterbridge * fix crash when deleting metrics-strip (zero route) * clean up metric pattern code (use float for dBFS) --- gtk2_ardour/meter_patterns.cc | 266 ++++++++++++++++++---------------- gtk2_ardour/meter_strip.cc | 26 +++- gtk2_ardour/meter_strip.h | 8 +- gtk2_ardour/meterbridge.cc | 86 +++++++---- gtk2_ardour/meterbridge.h | 2 +- gtk2_ardour/route_ui.cc | 5 + 6 files changed, 226 insertions(+), 167 deletions(-) diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index ff977c84c3..193039b3eb 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -108,7 +108,6 @@ ArdourMeter::meter_type_string (ARDOUR::MeterType mt) } } - static inline float mtr_col_and_fract( cairo_t* cr, Gdk::Color const * const c, const uint32_t peakcolor, const MeterType mt, const float val) { @@ -198,7 +197,6 @@ static inline float mtr_col_and_fract( } - static cairo_pattern_t* meter_render_ticks (Gtk::Widget& w, MeterType type, vector types) { @@ -247,38 +245,39 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector typ cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); } - std::map points; + // tick-maker position in dBFS, line-thickness + std::map points; switch (*i) { case DataType::AUDIO: switch (type) { case MeterK14: - points.insert (std::pair(-54.0f, 1.0)); - points.insert (std::pair(-44.0f, 1.0)); - points.insert (std::pair(-34.0f, 1.0)); - points.insert (std::pair(-24.0f, 1.0)); - points.insert (std::pair(-20.0f, 1.0)); - points.insert (std::pair(-17.0f, 1.0)); - points.insert (std::pair(-14.0f, 1.0)); - points.insert (std::pair(-11.0f, 1.0)); - points.insert (std::pair( -8.0f, 1.0)); - points.insert (std::pair( -4.0f, 1.0)); - points.insert (std::pair( 0.0f, 1.0)); + points.insert (std::pair(-54.0f, 1.0)); + points.insert (std::pair(-44.0f, 1.0)); + points.insert (std::pair(-34.0f, 1.0)); + points.insert (std::pair(-24.0f, 1.0)); + points.insert (std::pair(-20.0f, 1.0)); + points.insert (std::pair(-17.0f, 1.0)); + points.insert (std::pair(-14.0f, 1.0)); + points.insert (std::pair(-11.0f, 1.0)); + points.insert (std::pair( -8.0f, 1.0)); + points.insert (std::pair( -4.0f, 1.0)); + points.insert (std::pair( 0.0f, 1.0)); break; case MeterK20: - points.insert (std::pair(-60.0f, 1.0)); - points.insert (std::pair(-50.0f, 1.0)); - points.insert (std::pair(-40.0f, 1.0)); - points.insert (std::pair(-30.0f, 1.0)); - points.insert (std::pair(-26.0f, 1.0)); - points.insert (std::pair(-23.0f, 1.0)); - points.insert (std::pair(-20.0f, 1.0)); - points.insert (std::pair(-17.0f, 1.0)); - points.insert (std::pair(-14.0f, 1.0)); - points.insert (std::pair(-10.0f, 1.0)); - points.insert (std::pair( -5.0f, 1.0)); - points.insert (std::pair( 0.0f, 1.0)); + points.insert (std::pair(-60.0f, 1.0)); + points.insert (std::pair(-50.0f, 1.0)); + points.insert (std::pair(-40.0f, 1.0)); + points.insert (std::pair(-30.0f, 1.0)); + points.insert (std::pair(-26.0f, 1.0)); + points.insert (std::pair(-23.0f, 1.0)); + points.insert (std::pair(-20.0f, 1.0)); + points.insert (std::pair(-17.0f, 1.0)); + points.insert (std::pair(-14.0f, 1.0)); + points.insert (std::pair(-10.0f, 1.0)); + points.insert (std::pair( -5.0f, 1.0)); + points.insert (std::pair( 0.0f, 1.0)); break; case MeterIEC2EBU: points.insert (std::pair(-30.0f, 1.0)); @@ -357,64 +356,64 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector typ break; default: - points.insert (std::pair(-60, 0.5)); - points.insert (std::pair(-50, 1.0)); - points.insert (std::pair(-40, 1.0)); - points.insert (std::pair(-30, 1.0)); + points.insert (std::pair(-60, 0.5)); + points.insert (std::pair(-50, 1.0)); + points.insert (std::pair(-40, 1.0)); + points.insert (std::pair(-30, 1.0)); if (Config->get_meter_line_up_level() == MeteringLineUp24) { - points.insert (std::pair(-24, 1.0)); + points.insert (std::pair(-24, 1.0)); } else { - points.insert (std::pair(-25, 1.0)); + points.insert (std::pair(-25, 1.0)); } - points.insert (std::pair(-20, 1.0)); + points.insert (std::pair(-20, 1.0)); - points.insert (std::pair(-19, 0.5)); - points.insert (std::pair(-18, 1.0)); - points.insert (std::pair(-17, 0.5)); - points.insert (std::pair(-16, 0.5)); - points.insert (std::pair(-15, 1.0)); + points.insert (std::pair(-19, 0.5)); + points.insert (std::pair(-18, 1.0)); + points.insert (std::pair(-17, 0.5)); + points.insert (std::pair(-16, 0.5)); + points.insert (std::pair(-15, 1.0)); - points.insert (std::pair(-14, 0.5)); - points.insert (std::pair(-13, 0.5)); - points.insert (std::pair(-12, 0.5)); - points.insert (std::pair(-11, 0.5)); - points.insert (std::pair(-10, 1.0)); + points.insert (std::pair(-14, 0.5)); + points.insert (std::pair(-13, 0.5)); + points.insert (std::pair(-12, 0.5)); + points.insert (std::pair(-11, 0.5)); + points.insert (std::pair(-10, 1.0)); - points.insert (std::pair( -9, 1.0)); - points.insert (std::pair( -8, 0.5)); - points.insert (std::pair( -7, 0.5)); - points.insert (std::pair( -6, 0.5)); - points.insert (std::pair( -5, 1.0)); - points.insert (std::pair( -4, 0.5)); - points.insert (std::pair( -3, 1.0)); - points.insert (std::pair( -2, 0.5)); - points.insert (std::pair( -1, 0.5)); + points.insert (std::pair( -9, 1.0)); + points.insert (std::pair( -8, 0.5)); + points.insert (std::pair( -7, 0.5)); + points.insert (std::pair( -6, 0.5)); + points.insert (std::pair( -5, 1.0)); + points.insert (std::pair( -4, 0.5)); + points.insert (std::pair( -3, 1.0)); + points.insert (std::pair( -2, 0.5)); + points.insert (std::pair( -1, 0.5)); - points.insert (std::pair( 0, 1.0)); - points.insert (std::pair( 1, 0.5)); - points.insert (std::pair( 2, 0.5)); - points.insert (std::pair( 3, 1.0)); - points.insert (std::pair( 4, 0.5)); - points.insert (std::pair( 5, 0.5)); + points.insert (std::pair( 0, 1.0)); + points.insert (std::pair( 1, 0.5)); + points.insert (std::pair( 2, 0.5)); + points.insert (std::pair( 3, 1.0)); + points.insert (std::pair( 4, 0.5)); + points.insert (std::pair( 5, 0.5)); break; } break; case DataType::MIDI: - points.insert (std::pair( 0, 1.0)); - points.insert (std::pair( 16, 0.5)); - points.insert (std::pair( 32, 0.5)); - points.insert (std::pair( 48, 0.5)); - points.insert (std::pair( 64, 1.0)); - points.insert (std::pair( 80, 0.5)); - points.insert (std::pair( 96, 0.5)); - points.insert (std::pair(100, 1.0)); - points.insert (std::pair(112, 0.5)); - points.insert (std::pair(127, 1.0)); + points.insert (std::pair( 0, 1.0)); + points.insert (std::pair( 16, 0.5)); + points.insert (std::pair( 32, 0.5)); + points.insert (std::pair( 48, 0.5)); + points.insert (std::pair( 64, 1.0)); + points.insert (std::pair( 80, 0.5)); + points.insert (std::pair( 96, 0.5)); + points.insert (std::pair(100, 1.0)); + points.insert (std::pair(112, 0.5)); + points.insert (std::pair(127, 1.0)); break; } - for (std::map::const_iterator j = points.begin(); j != points.end(); ++j) { + for (std::map::const_iterator j = points.begin(); j != points.end(); ++j) { cairo_set_line_width (cr, (j->second)); float fraction = 0; @@ -533,6 +532,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) } + // label-pos in dBFS, label-text std::map points; switch (*i) { @@ -540,53 +540,53 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) layout->set_attributes (audio_font_attributes); switch (type) { case MeterK14: - points.insert (std::pair(-54.0f, "-40")); - points.insert (std::pair(-44.0f, "-30")); - points.insert (std::pair(-34.0f, "-20")); - points.insert (std::pair(-24.0f, "-10")); - points.insert (std::pair(-20.0f, "-6")); - points.insert (std::pair(-17.0f, "-3")); - points.insert (std::pair(-14.0f, "0")); - points.insert (std::pair(-11.0f, "+3")); - points.insert (std::pair( -8.0f, "+6")); - points.insert (std::pair( -4.0f, "+10")); - points.insert (std::pair( 0.0f, "+14")); + points.insert (std::pair(-54.0f, "-40")); + points.insert (std::pair(-44.0f, "-30")); + points.insert (std::pair(-34.0f, "-20")); + points.insert (std::pair(-24.0f, "-10")); + points.insert (std::pair(-20.0f, "-6")); + points.insert (std::pair(-17.0f, "-3")); + points.insert (std::pair(-14.0f, "0")); + points.insert (std::pair(-11.0f, "+3")); + points.insert (std::pair( -8.0f, "+6")); + points.insert (std::pair( -4.0f, "+10")); + points.insert (std::pair( 0.0f, "+14")); break; case MeterK20: - points.insert (std::pair(-60.0f, "-40")); - points.insert (std::pair(-50.0f, "-30")); - points.insert (std::pair(-40.0f, "-20")); - points.insert (std::pair(-30.0f, "-10")); - points.insert (std::pair(-26.0f, "-6")); - points.insert (std::pair(-23.0f, "-3")); - points.insert (std::pair(-20.0f, "0")); - points.insert (std::pair(-17.0f, "+3")); - points.insert (std::pair(-14.0f, "+6")); - points.insert (std::pair(-10.0f, "+10")); - points.insert (std::pair( -5.0f, "+15")); - points.insert (std::pair( 0.0f, "+20")); + points.insert (std::pair(-60.0f, "-40")); + points.insert (std::pair(-50.0f, "-30")); + points.insert (std::pair(-40.0f, "-20")); + points.insert (std::pair(-30.0f, "-10")); + points.insert (std::pair(-26.0f, "-6")); + points.insert (std::pair(-23.0f, "-3")); + points.insert (std::pair(-20.0f, "0")); + points.insert (std::pair(-17.0f, "+3")); + points.insert (std::pair(-14.0f, "+6")); + points.insert (std::pair(-10.0f, "+10")); + points.insert (std::pair( -5.0f, "+15")); + points.insert (std::pair( 0.0f, "+20")); break; default: case MeterPeak: case MeterKrms: - points.insert (std::pair(-50.0f, "-50")); - points.insert (std::pair(-40.0f, "-40")); - points.insert (std::pair(-30.0f, "-30")); - points.insert (std::pair(-20.0f, "-20")); + points.insert (std::pair(-50.0f, "-50")); + points.insert (std::pair(-40.0f, "-40")); + points.insert (std::pair(-30.0f, "-30")); + points.insert (std::pair(-20.0f, "-20")); if (types.size() == 1) { if (Config->get_meter_line_up_level() == MeteringLineUp24) { - points.insert (std::pair(-24.0f, "-24")); + points.insert (std::pair(-24.0f, "-24")); } else { - points.insert (std::pair(-25.0f, "-25")); + points.insert (std::pair(-25.0f, "-25")); } - points.insert (std::pair(-15.0f, "-15")); + points.insert (std::pair(-15.0f, "-15")); } - points.insert (std::pair(-18.0f, "-18")); - points.insert (std::pair(-10.0f, "-10")); - points.insert (std::pair( -5.0f, "-5")); - points.insert (std::pair( -3.0f, "-3")); - points.insert (std::pair( 0.0f, "+0")); - points.insert (std::pair( 3.0f, "+3")); + points.insert (std::pair(-18.0f, "-18")); + points.insert (std::pair(-10.0f, "-10")); + points.insert (std::pair( -5.0f, "-5")); + points.insert (std::pair( -3.0f, "-3")); + points.insert (std::pair( 0.0f, "+0")); + points.insert (std::pair( 3.0f, "+3")); break; case MeterIEC2EBU: @@ -600,13 +600,13 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) break; case MeterIEC2BBC: - points.insert (std::pair(-30.0f, "1")); - points.insert (std::pair(-26.0f, "2")); - points.insert (std::pair(-22.0f, "3")); - points.insert (std::pair(-18.0f, "4")); - points.insert (std::pair(-14.0f, "5")); - points.insert (std::pair(-10.0f, "6")); - points.insert (std::pair( -6.0f, "7")); + points.insert (std::pair(-30.0f, " 1 ")); + points.insert (std::pair(-26.0f, " 2 ")); + points.insert (std::pair(-22.0f, " 3 ")); + points.insert (std::pair(-18.0f, " 4 ")); + points.insert (std::pair(-14.0f, " 5 ")); + points.insert (std::pair(-10.0f, " 6 ")); + points.insert (std::pair( -6.0f, " 7 ")); break; case MeterIEC1NOR: @@ -661,23 +661,23 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) break; case DataType::MIDI: layout->set_attributes (midi_font_attributes); - points.insert (std::pair( 0, "0")); + points.insert (std::pair( 0, "0")); if (types.size() == 1) { - points.insert (std::pair( 16, "16")); - points.insert (std::pair( 32, "32")); - points.insert (std::pair( 48, "48")); - points.insert (std::pair( 64, "64")); - points.insert (std::pair( 80, "80")); - points.insert (std::pair( 96, "96")); - points.insert (std::pair(100, "100")); - points.insert (std::pair(112, "112")); + points.insert (std::pair( 16, "16")); + points.insert (std::pair( 32, "32")); + points.insert (std::pair( 48, "48")); + points.insert (std::pair( 64, "64")); + points.insert (std::pair( 80, "80")); + points.insert (std::pair( 96, "96")); + points.insert (std::pair(100, "100")); + points.insert (std::pair(112, "112")); } else { /* labels that don't overlay with dB */ - points.insert (std::pair( 24, "24")); - points.insert (std::pair( 48, "48")); - points.insert (std::pair( 72, "74")); + points.insert (std::pair( 24, "24")); + points.insert (std::pair( 48, "48")); + points.insert (std::pair( 72, "74")); } - points.insert (std::pair(127, "127")); + points.insert (std::pair(127, "127")); break; } @@ -685,6 +685,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) for (std::map::const_iterator j = points.begin(); j != points.end(); ++j) { float fraction = 0; + bool align_center = background; // this is true for meterbridge meters w/ fixed background switch (*i) { case DataType::AUDIO: fraction = mtr_col_and_fract(cr, &c, peakcolor, type, j->first); @@ -703,6 +704,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) break; case DataType::MIDI: + align_center = false; // don't bleed into legend fraction = (j->first) / 127.0; pos = 1 + height - (gint) rintf (height * fraction); pos = min (pos, height); @@ -725,7 +727,11 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) p = min (p, height - th); p = max (p, 0); - cairo_move_to (cr, width-3-tw, p); + if (align_center) { + cairo_move_to (cr, (width-tw)/2.0, p); + } else { + cairo_move_to (cr, width-3-tw, p); + } pango_cairo_show_layout (cr, layout->gobj()); } } @@ -767,13 +773,17 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) layout->get_pixel_size(tw, th); break; case DataType::MIDI: - layout->set_text("vel"); + layout->set_text("mid"); layout->get_pixel_size(tw, th); break; } Gdk::Color c = w.get_style()->get_fg (Gtk::STATE_ACTIVE); cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); - cairo_move_to (cr, 2, height - th - 0.5); + if (tickleft) { + cairo_move_to (cr, width - 2 - tw, height - th - 0.5); + } else { + cairo_move_to (cr, 2, height - th - 0.5); + } pango_cairo_show_layout (cr, layout->gobj()); } diff --git a/gtk2_ardour/meter_strip.cc b/gtk2_ardour/meter_strip.cc index 20419de7c7..4e4ffe11cf 100644 --- a/gtk2_ardour/meter_strip.cc +++ b/gtk2_ardour/meter_strip.cc @@ -57,7 +57,7 @@ using namespace ArdourMeter; PBD::Signal1 MeterStrip::CatchDeletion; PBD::Signal0 MeterStrip::MetricChanged; -MeterStrip::MeterStrip (int metricmode) +MeterStrip::MeterStrip (int metricmode, MeterType mt) : AxisView(0) , RouteUI(0) { @@ -67,7 +67,7 @@ MeterStrip::MeterStrip (int metricmode) peakbx.set_size_request(-1, 14); namebx.set_size_request(18, 52); - set_metric_mode(metricmode); + set_metric_mode(metricmode, mt); meter_metric_area.set_size_request(25, 10); meter_metric_area.signal_expose_event().connect ( @@ -394,13 +394,17 @@ MeterStrip::on_size_allocate (Gtk::Allocation& a) gint MeterStrip::meter_metrics_expose (GdkEventExpose *ev) { - // TODO meter-type - set with set_metric_mode() - return meter_expose_metrics(ev, /*XXX*/ MeterPeak, _types, &meter_metric_area); + if (_route) { + return meter_expose_metrics(ev, _route->meter_type(), _types, &meter_metric_area); + } else { + return meter_expose_metrics(ev, metric_type, _types, &meter_metric_area); + } } void -MeterStrip::set_metric_mode (int metricmode) +MeterStrip::set_metric_mode (int metricmode, ARDOUR::MeterType mt) { + metric_type = mt; _types.clear (); switch(metricmode) { case 0: @@ -425,9 +429,12 @@ MeterStrip::set_metric_mode (int metricmode) meter_metric_area.queue_draw (); } -void -MeterStrip::set_pos (int pos) +MeterType +MeterStrip::meter_type() { + assert((!_route && _strip_type == 0) || (_route && _strip_type != 0)); + if (!_route) return metric_type; + return _route->meter_type(); } gint @@ -619,7 +626,10 @@ MeterStrip::set_meter_type (MeterType type) void MeterStrip::meter_type_changed (MeterType type) { - _route->set_meter_type(type); + if (_route->meter_type() != type) { + _route->set_meter_type(type); + } + MetricChanged(); } void diff --git a/gtk2_ardour/meter_strip.h b/gtk2_ardour/meter_strip.h index 60e77eb2ef..4c532df5c7 100644 --- a/gtk2_ardour/meter_strip.h +++ b/gtk2_ardour/meter_strip.h @@ -47,7 +47,7 @@ class MeterStrip : public Gtk::VBox, public RouteUI { public: MeterStrip (ARDOUR::Session*, boost::shared_ptr); - MeterStrip (int); + MeterStrip (int, ARDOUR::MeterType); ~MeterStrip (); void set_session (ARDOUR::Session* s); @@ -63,9 +63,10 @@ class MeterStrip : public Gtk::VBox, public RouteUI void set_meter_type_multi (int, ARDOUR::RouteGroup*, ARDOUR::MeterType); - void set_metric_mode (int); - void set_pos(int); + void set_metric_mode (int, ARDOUR::MeterType); bool has_midi() { return _has_midi; } + bool is_metric_display() { return _strip_type == 0; } + ARDOUR::MeterType meter_type(); protected: boost::shared_ptr _route; @@ -106,6 +107,7 @@ class MeterStrip : public Gtk::VBox, public RouteUI ArdourButton peak_display; std::vector _types; + ARDOUR::MeterType metric_type; float max_peak; bool _has_midi; diff --git a/gtk2_ardour/meterbridge.cc b/gtk2_ardour/meterbridge.cc index cdecb36c7c..2b51e9a85f 100644 --- a/gtk2_ardour/meterbridge.cc +++ b/gtk2_ardour/meterbridge.cc @@ -101,8 +101,8 @@ Meterbridge::Meterbridge () , VisibilityTracker (*((Gtk::Window*) this)) , _visible (false) , _show_busses (false) - , metrics_left (1) - , metrics_right (2) + , metrics_left (1, MeterPeak) + , metrics_right (2, MeterPeak) , cur_max_width (-1) { set_name ("Meter Bridge"); @@ -140,7 +140,7 @@ Meterbridge::Meterbridge () signal_configure_event().connect (sigc::mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::configure_handler)); Route::SyncOrderKeys.connect (*this, invalidator (*this), boost::bind (&Meterbridge::sync_order_keys, this, _1), gui_context()); MeterStrip::CatchDeletion.connect (*this, invalidator (*this), boost::bind (&Meterbridge::remove_strip, this, _1), gui_context()); - MeterStrip::MetricChanged.connect_same_thread (*this, boost::bind(&Meterbridge::update_metrics, this)); + MeterStrip::MetricChanged.connect (*this, invalidator (*this), boost::bind(&Meterbridge::resync_order, this), gui_context()); /* work around ScrolledWindowViewport alignment mess Part one */ Gtk::HBox * yspc = manage (new Gtk::HBox()); @@ -192,6 +192,10 @@ Meterbridge::Meterbridge () Meterbridge::~Meterbridge () { + while (_metrics.size() > 0) { + delete (_metrics.back()); + _metrics.pop_back(); + } } void @@ -550,7 +554,6 @@ Meterbridge::add_strips (RouteList& routes) } resync_order(); - update_metrics(); } void @@ -567,24 +570,6 @@ Meterbridge::remove_strip (MeterStrip* strip) break; } } - update_metrics(); -} - -void -Meterbridge::update_metrics () -{ - bool have_midi = false; - for (list::iterator i = strips.begin(); i != strips.end(); ++i) { - if ( (*i).s->has_midi() && (*i).visible) { - have_midi = true; - break; - } - } - if (have_midi) { - metrics_right.set_metric_mode(2); - } else { - metrics_right.set_metric_mode(3); - } } void @@ -598,6 +583,11 @@ Meterbridge::sync_order_keys (RouteSortOrderKey src) int pos = 0; int vis = 0; + unsigned int metrics = 0; + MeterType lmt = MeterPeak; + bool have_midi = false; + metrics_left.set_metric_mode(1, lmt); + for (list::iterator i = strips.begin(); i != strips.end(); ++i) { if (! (*i).s->route()->active()) { @@ -642,9 +632,55 @@ Meterbridge::sync_order_keys (RouteSortOrderKey src) (*i).visible = true; vis++; } - (*i).s->set_pos(vis); + + MeterType nmt = (*i).s->meter_type(); + if (nmt == MeterKrms) nmt = MeterPeak; // identical metrics + + if ((*i).visible && nmt != lmt && pos == 0) { + lmt = nmt; + metrics_left.set_metric_mode(1, lmt); + } else if ((*i).visible && nmt != lmt) { + + if (_metrics.size() <= metrics) { + _metrics.push_back(new MeterStrip(have_midi ? 2 : 3, lmt)); + meterarea.pack_start (*_metrics[metrics], false, false); + _metrics[metrics]->set_session(_session); + _metrics[metrics]->show(); + } else { + _metrics[metrics]->set_metric_mode(have_midi ? 2 : 3, lmt); + } + meterarea.reorder_child(*_metrics[metrics], pos++); + metrics++; + + lmt = nmt; + + if (_metrics.size() <= metrics) { + _metrics.push_back(new MeterStrip(1, lmt)); + meterarea.pack_start (*_metrics[metrics], false, false); + _metrics[metrics]->set_session(_session); + _metrics[metrics]->show(); + } else { + _metrics[metrics]->set_metric_mode(1, lmt); + } + meterarea.reorder_child(*_metrics[metrics], pos++); + metrics++; + have_midi = false; + } + + if ((*i).visible && (*i).s->has_midi()) { + have_midi = true; + } + meterarea.reorder_child(*((*i).s), pos++); } + + metrics_right.set_metric_mode(have_midi ? 2 : 3, lmt); + + while (_metrics.size() > metrics) { + meterarea.remove(*_metrics.back()); + delete (_metrics.back()); + _metrics.pop_back(); + } } void @@ -659,21 +695,17 @@ Meterbridge::parameter_changed (std::string const & p) if (p == "show-busses-on-meterbridge") { _show_busses = _session->config.get_show_busses_on_meterbridge(); resync_order(); - update_metrics(); } else if (p == "show-master-on-meterbridge") { _show_master = _session->config.get_show_master_on_meterbridge(); resync_order(); - update_metrics(); } else if (p == "show-midi-on-meterbridge") { _show_midi = _session->config.get_show_midi_on_meterbridge(); resync_order(); - update_metrics(); } else if (p == "meter-line-up-level") { meter_clear_pattern_cache(); - update_metrics(); } else if (p == "show-rec-on-meterbridge") { scroller.queue_resize(); diff --git a/gtk2_ardour/meterbridge.h b/gtk2_ardour/meterbridge.h index 32ab2c929d..cca31d370c 100644 --- a/gtk2_ardour/meterbridge.h +++ b/gtk2_ardour/meterbridge.h @@ -78,7 +78,6 @@ class Meterbridge : void add_strips (ARDOUR::RouteList&); void remove_strip (MeterStrip *); - void update_metrics (); void session_going_away (); void sync_order_keys (ARDOUR::RouteSortOrderKey src); @@ -116,6 +115,7 @@ class Meterbridge : MeterStrip metrics_left; MeterStrip metrics_right; + std::vector _metrics; Gtk::VBox metrics_vpacker_left; Gtk::VBox metrics_vpacker_right; diff --git a/gtk2_ardour/route_ui.cc b/gtk2_ardour/route_ui.cc index bf14719d70..bbc60ef425 100644 --- a/gtk2_ardour/route_ui.cc +++ b/gtk2_ardour/route_ui.cc @@ -66,6 +66,11 @@ boost::weak_ptr RouteUI::_showing_sends_to; RouteUI::RouteUI (ARDOUR::Session* sess) : AxisView(sess) + , mute_menu(0) + , solo_menu(0) + , sends_menu(0) + , record_menu(0) + , _invert_menu(0) { if (sess) init (); } From d5209cb4bfb1a3ee41ffb45ec0ead71a540f19d1 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 23 Jul 2013 11:28:45 -0400 Subject: [PATCH 087/221] fix #5609 (import with 1 track per channel mis-associates tracks + channels) when using ImportDistinctChannels, correctly name regions so that playlists for each channel/track are also named differently, and thus reloaded properly when the session is reloaded. --- gtk2_ardour/editor.h | 10 ++-- gtk2_ardour/editor_audio_import.cc | 83 +++++++++++++++++++++-------- gtk2_ardour/editor_videotimeline.cc | 2 +- gtk2_ardour/sfdb_ui.cc | 3 +- 4 files changed, 70 insertions(+), 28 deletions(-) diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 919d6e0781..c12d1354d1 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -1249,13 +1249,17 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD bool idle_drop_paths (std::vector paths, framepos_t frame, double ypos, bool copy); void drop_paths_part_two (const std::vector& paths, framepos_t frame, double ypos, bool copy); - int import_sndfiles (std::vector paths, Editing::ImportMode mode, ARDOUR::SrcQuality, framepos_t& pos, + int import_sndfiles (std::vector paths, Editing::ImportDisposition, Editing::ImportMode mode, + ARDOUR::SrcQuality, framepos_t& pos, int target_regions, int target_tracks, boost::shared_ptr&, bool); - int embed_sndfiles (std::vector paths, bool multiple_files, bool& check_sample_rate, Editing::ImportMode mode, + int embed_sndfiles (std::vector paths, bool multiple_files, bool& check_sample_rate, + Editing::ImportDisposition disposition, Editing::ImportMode mode, framepos_t& pos, int target_regions, int target_tracks, boost::shared_ptr&); - int add_sources (std::vector paths, ARDOUR::SourceList& sources, framepos_t& pos, Editing::ImportMode, + int add_sources (std::vector paths, ARDOUR::SourceList& sources, framepos_t& pos, + Editing::ImportDisposition, Editing::ImportMode, int target_regions, int target_tracks, boost::shared_ptr&, bool add_channel_suffix); + int finish_bringing_in_material (boost::shared_ptr region, uint32_t, uint32_t, framepos_t& pos, Editing::ImportMode mode, boost::shared_ptr& existing_track); diff --git a/gtk2_ardour/editor_audio_import.cc b/gtk2_ardour/editor_audio_import.cc index 31ccdb7a53..3cb2d378c2 100644 --- a/gtk2_ardour/editor_audio_import.cc +++ b/gtk2_ardour/editor_audio_import.cc @@ -264,7 +264,7 @@ Editor::get_nth_selected_midi_track (int nth) const } void -Editor::do_import (vector paths, ImportDisposition chns, ImportMode mode, SrcQuality quality, framepos_t& pos) +Editor::do_import (vector paths, ImportDisposition disposition, ImportMode mode, SrcQuality quality, framepos_t& pos) { boost::shared_ptr track; vector to_import; @@ -280,7 +280,7 @@ Editor::do_import (vector paths, ImportDisposition chns, ImportMode mode bool ok = true; - if (chns == Editing::ImportMergeFiles) { + if (disposition == Editing::ImportMergeFiles) { /* create 1 region from all paths, add to 1 track, ignore "track" @@ -299,7 +299,7 @@ Editor::do_import (vector paths, ImportDisposition chns, ImportMode mode ok = false; } else { ipw.show (); - ok = (import_sndfiles (paths, mode, quality, pos, 1, 1, track, false) == 0); + ok = (import_sndfiles (paths, disposition, mode, quality, pos, 1, 1, track, false) == 0); } } else { @@ -334,7 +334,7 @@ Editor::do_import (vector paths, ImportDisposition chns, ImportMode mode ipw.show (); - switch (chns) { + switch (disposition) { case Editing::ImportDistinctFiles: to_import.clear (); @@ -344,7 +344,7 @@ Editor::do_import (vector paths, ImportDisposition chns, ImportMode mode track = get_nth_selected_audio_track (nth++); } - ok = (import_sndfiles (to_import, mode, quality, pos, 1, -1, track, replace) == 0); + ok = (import_sndfiles (to_import, disposition, mode, quality, pos, 1, -1, track, replace) == 0); break; case Editing::ImportDistinctChannels: @@ -352,7 +352,7 @@ Editor::do_import (vector paths, ImportDisposition chns, ImportMode mode to_import.clear (); to_import.push_back (*a); - ok = (import_sndfiles (to_import, mode, quality, pos, -1, -1, track, replace) == 0); + ok = (import_sndfiles (to_import, disposition, mode, quality, pos, -1, -1, track, replace) == 0); break; case Editing::ImportSerializeFiles: @@ -360,7 +360,7 @@ Editor::do_import (vector paths, ImportDisposition chns, ImportMode mode to_import.clear (); to_import.push_back (*a); - ok = (import_sndfiles (to_import, mode, quality, pos, 1, 1, track, replace) == 0); + ok = (import_sndfiles (to_import, disposition, mode, quality, pos, 1, 1, track, replace) == 0); break; case Editing::ImportMergeFiles: @@ -378,7 +378,7 @@ Editor::do_import (vector paths, ImportDisposition chns, ImportMode mode } void -Editor::do_embed (vector paths, ImportDisposition chns, ImportMode mode, framepos_t& pos) +Editor::do_embed (vector paths, ImportDisposition import_as, ImportMode mode, framepos_t& pos) { boost::shared_ptr track; bool check_sample_rate = true; @@ -388,7 +388,7 @@ Editor::do_embed (vector paths, ImportDisposition chns, ImportMode mode, int nth = 0; bool use_timestamp = (pos == -1); - switch (chns) { + switch (import_as) { case Editing::ImportDistinctFiles: for (vector::iterator a = paths.begin(); a != paths.end(); ++a) { @@ -404,7 +404,7 @@ Editor::do_embed (vector paths, ImportDisposition chns, ImportMode mode, track = get_nth_selected_audio_track (nth++); } - if (embed_sndfiles (to_embed, multi, check_sample_rate, mode, pos, 1, -1, track) < -1) { + if (embed_sndfiles (to_embed, multi, check_sample_rate, import_as, mode, pos, 1, -1, track) < -1) { goto out; } } @@ -421,14 +421,14 @@ Editor::do_embed (vector paths, ImportDisposition chns, ImportMode mode, to_embed.clear (); to_embed.push_back (*a); - if (embed_sndfiles (to_embed, multi, check_sample_rate, mode, pos, -1, -1, track) < -1) { + if (embed_sndfiles (to_embed, multi, check_sample_rate, import_as, mode, pos, -1, -1, track) < -1) { goto out; } } break; case Editing::ImportMergeFiles: - if (embed_sndfiles (paths, multi, check_sample_rate, mode, pos, 1, 1, track) < -1) { + if (embed_sndfiles (paths, multi, check_sample_rate, import_as, mode, pos, 1, 1, track) < -1) { goto out; } break; @@ -444,7 +444,7 @@ Editor::do_embed (vector paths, ImportDisposition chns, ImportMode mode, to_embed.clear (); to_embed.push_back (*a); - if (embed_sndfiles (to_embed, multi, check_sample_rate, mode, pos, 1, 1, track) < -1) { + if (embed_sndfiles (to_embed, multi, check_sample_rate, import_as, mode, pos, 1, 1, track) < -1) { goto out; } } @@ -460,7 +460,7 @@ Editor::do_embed (vector paths, ImportDisposition chns, ImportMode mode, } int -Editor::import_sndfiles (vector paths, ImportMode mode, SrcQuality quality, framepos_t& pos, +Editor::import_sndfiles (vector paths, ImportDisposition disposition, ImportMode mode, SrcQuality quality, framepos_t& pos, int target_regions, int target_tracks, boost::shared_ptr& track, bool replace) { import_status.paths = paths; @@ -501,6 +501,7 @@ Editor::import_sndfiles (vector paths, ImportMode mode, SrcQuality quali import_status.paths, import_status.sources, import_status.pos, + disposition, import_status.mode, import_status.target_regions, import_status.target_tracks, @@ -518,7 +519,8 @@ Editor::import_sndfiles (vector paths, ImportMode mode, SrcQuality quali int Editor::embed_sndfiles (vector paths, bool multifile, - bool& check_sample_rate, ImportMode mode, framepos_t& pos, int target_regions, int target_tracks, + bool& check_sample_rate, ImportDisposition disposition, ImportMode mode, + framepos_t& pos, int target_regions, int target_tracks, boost::shared_ptr& track) { boost::shared_ptr source; @@ -603,6 +605,7 @@ Editor::embed_sndfiles (vector paths, bool multifile, set_canvas_cursor (_cursors->wait); for (int n = 0; n < finfo.channels; ++n) { + try { /* check if we have this thing embedded already */ @@ -613,7 +616,7 @@ Editor::embed_sndfiles (vector paths, bool multifile, source = boost::dynamic_pointer_cast ( SourceFactory::createExternal (DataType::AUDIO, *_session, - path, n, + path, n, (mode == ImportAsTapeTrack ? Source::Destructive : Source::Flag (0)), @@ -638,7 +641,8 @@ Editor::embed_sndfiles (vector paths, bool multifile, goto out; } - ret = add_sources (paths, sources, pos, mode, target_regions, target_tracks, track, true); + + ret = add_sources (paths, sources, pos, disposition, mode, target_regions, target_tracks, track, true); out: set_canvas_cursor (current_canvas_cursor); @@ -646,7 +650,7 @@ Editor::embed_sndfiles (vector paths, bool multifile, } int -Editor::add_sources (vector paths, SourceList& sources, framepos_t& pos, ImportMode mode, +Editor::add_sources (vector paths, SourceList& sources, framepos_t& pos, ImportDisposition disposition, ImportMode mode, int target_regions, int target_tracks, boost::shared_ptr& track, bool /*add_channel_suffix*/) { vector > regions; @@ -654,7 +658,7 @@ Editor::add_sources (vector paths, SourceList& sources, framepos_t& pos, uint32_t input_chan = 0; uint32_t output_chan = 0; bool use_timestamp; - + use_timestamp = (pos == -1); // kludge (for MIDI we're abusing "channel" for "track" here) @@ -707,10 +711,43 @@ Editor::add_sources (vector paths, SourceList& sources, framepos_t& pos, boost::shared_ptr fs = boost::dynamic_pointer_cast (*x); - if (fs) { - region_name = region_name_from_path (fs->path(), false, false, sources.size(), n); - } else{ - region_name = (*x)->name(); + if (sources.size() > 1 && disposition == ImportDistinctChannels) { + + /* generate a per-channel region name so that things work as + * intended + */ + + string path; + + if (fs) { + region_name = basename_nosuffix (fs->path()); + } else { + region_name = (*x)->name(); + } + + switch (sources.size()) { + /* zero and one channel handled + by previous if() condition + */ + case 2: + if (n == 0) { + region_name += "-L"; + } else { + region_name += "-R"; + } + break; + default: + region_name += (char) '-'; + region_name += (char) ('1' + n); + break; + } + + } else { + if (fs) { + region_name = region_name_from_path (fs->path(), false, false, sources.size(), n); + } else{ + region_name = (*x)->name(); + } } PropertyList plist; diff --git a/gtk2_ardour/editor_videotimeline.cc b/gtk2_ardour/editor_videotimeline.cc index 7395d767c7..0a516fb748 100644 --- a/gtk2_ardour/editor_videotimeline.cc +++ b/gtk2_ardour/editor_videotimeline.cc @@ -109,7 +109,7 @@ Editor::embed_audio_from_video (std::string path, framepos_t n) ipw.show (); boost::shared_ptr track; - bool ok = (import_sndfiles (paths, Editing::ImportAsTrack, ARDOUR::SrcBest, n, 1, 1, track, false) == 0); + bool ok = (import_sndfiles (paths, Editing::ImportDistinctFiles, Editing::ImportAsTrack, ARDOUR::SrcBest, n, 1, 1, track, false) == 0); if (ok && track) { boost::shared_ptr pl = track->playlist(); pl->find_next_region(n, ARDOUR::End, 0)->set_video_locked(true); diff --git a/gtk2_ardour/sfdb_ui.cc b/gtk2_ardour/sfdb_ui.cc index e8db9d4939..986ed7f985 100644 --- a/gtk2_ardour/sfdb_ui.cc +++ b/gtk2_ardour/sfdb_ui.cc @@ -342,7 +342,8 @@ SoundFileBox::audition () try { afs = boost::dynamic_pointer_cast ( SourceFactory::createExternal (DataType::AUDIO, *_session, - path, n, Source::Flag (0), false)); + path, n, + Source::Flag (0), false)); srclist.push_back(afs); From 8e376f7a2a2cd490860bd1c233b7e688ac9ffba3 Mon Sep 17 00:00:00 2001 From: Colin Fletcher Date: Tue, 23 Jul 2013 16:15:23 +0100 Subject: [PATCH 088/221] Fix special handling of 'zoom vertical' scroll wheel modifier key. gtkmm2ext/keyboard.cc has a special case to emit a signal on the key-up of the modifier key used to adjust track heights in conjunction with the scroll wheel, so that the same track continues to be resized even when it's shrunk to no longer be under the mouse cursor. However, this code assumed that the modifier key for this was . Fix it to use the event->state bit corresponding to ScrollZoomVerticalModifier instead, and rename the relevant functions to clarify that it's the 'zoom vertical' modifier key they're dealing with. Partially fixes #5610. --- gtk2_ardour/editor.cc | 4 ++-- gtk2_ardour/editor.h | 15 ++++++++------- libs/gtkmm2ext/gtkmm2ext/keyboard.h | 2 +- libs/gtkmm2ext/keyboard.cc | 11 +++++++---- 4 files changed, 18 insertions(+), 14 deletions(-) diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index d3e3ae9828..300e317a38 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -697,7 +697,7 @@ Editor::Editor () signal_configure_event().connect (sigc::mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::configure_handler)); signal_delete_event().connect (sigc::mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::exit_on_main_window_close)); - Gtkmm2ext::Keyboard::the_keyboard().ShiftReleased.connect (sigc::mem_fun (*this, &Editor::shift_key_released)); + Gtkmm2ext::Keyboard::the_keyboard().ZoomVerticalModifierReleased.connect (sigc::mem_fun (*this, &Editor::zoom_vertical_modifier_released)); /* allow external control surfaces/protocols to do various things */ @@ -5499,7 +5499,7 @@ Editor::popup_control_point_context_menu (ArdourCanvas::Item* item, GdkEvent* ev } void -Editor::shift_key_released () +Editor::zoom_vertical_modifier_released() { _stepping_axis_view = 0; } diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index c12d1354d1..033888c4b6 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -2082,15 +2082,16 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD bool _control_point_toggled_on_press; /** This is used by TimeAxisView to keep a track of the TimeAxisView that is currently being - stepped in height using Shift-Scrollwheel. When a scroll event occurs, we do the step on - this _stepping_axis_view if it is non-0 (and we set up this _stepping_axis_view with the - TimeAxisView underneath the mouse if it is 0). Then Editor resets _stepping_axis_view when - the shift key is released. In this (hacky) way, pushing shift and moving the scroll wheel - will operate on the same track until shift is released (rather than skipping about to whatever - happens to be underneath the mouse at the time). + stepped in height using ScrollZoomVerticalModifier+Scrollwheel. When a scroll event + occurs, we do the step on this _stepping_axis_view if it is non-0 (and we set up this + _stepping_axis_view with the TimeAxisView underneath the mouse if it is 0). Then Editor + resets _stepping_axis_view when the modifier key is released. In this (hacky) way, + pushing the modifier key and moving the scroll wheel will operate on the same track + until the key is released (rather than skipping about to whatever happens to be + underneath the mouse at the time). */ TimeAxisView* _stepping_axis_view; - void shift_key_released (); + void zoom_vertical_modifier_released(); friend class Drag; friend class RegionDrag; diff --git a/libs/gtkmm2ext/gtkmm2ext/keyboard.h b/libs/gtkmm2ext/gtkmm2ext/keyboard.h index 84988e1525..2c6b026a42 100644 --- a/libs/gtkmm2ext/gtkmm2ext/keyboard.h +++ b/libs/gtkmm2ext/gtkmm2ext/keyboard.h @@ -164,7 +164,7 @@ class Keyboard : public sigc::trackable, PBD::Stateful } }; - sigc::signal0 ShiftReleased; + sigc::signal0 ZoomVerticalModifierReleased; protected: static Keyboard* _the_keyboard; diff --git a/libs/gtkmm2ext/keyboard.cc b/libs/gtkmm2ext/keyboard.cc index f694471d9a..5087f61a23 100644 --- a/libs/gtkmm2ext/keyboard.cc +++ b/libs/gtkmm2ext/keyboard.cc @@ -248,12 +248,15 @@ Keyboard::snooper (GtkWidget *widget, GdkEventKey *event) keyval = event->keyval; } - if (keyval == GDK_Shift_L) { + if (event->state & ScrollZoomVerticalModifier) { /* There is a special and rather hacky situation in Editor which makes - it useful to know when a shift key has been released, so emit a signal - here (see Editor::_stepping_axis_view) + it useful to know when the modifier key for vertical zoom has been + released, so emit a signal here (see Editor::_stepping_axis_view). + Note that the state bit for the modifier key is set for the key-up + event when the modifier is released, but not the key-down when it + is pressed, so we get here on key-up, which is what we want. */ - ShiftReleased (); /* EMIT SIGNAL */ + ZoomVerticalModifierReleased (); /* EMIT SIGNAL */ } if (event->type == GDK_KEY_PRESS) { From c4c70c347d2e264fb33e1965bc1c1ccc16bc2830 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 23 Jul 2013 14:23:20 +0200 Subject: [PATCH 089/221] use fixed fall-off time for k-meter --- libs/ardour/meter.cc | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/libs/ardour/meter.cc b/libs/ardour/meter.cc index 32c7439fd5..cc014caf63 100644 --- a/libs/ardour/meter.cc +++ b/libs/ardour/meter.cc @@ -273,6 +273,11 @@ PeakMeter::meter () const size_t limit = min (_peak_signal.size(), (size_t) current_meters.n_total ()); const size_t n_midi = min (_peak_signal.size(), (size_t) current_meters.n_midi()); + /* 0.01f ^= 100 Hz update rate */ + const float midi_meter_falloff = Config->get_meter_falloff() * 0.01f; + /* kmeters: 24dB / 2 sec */ + const float audio_meter_falloff = (_meter_type & (MeterK20 | MeterK14)) ? 0.12f : midi_meter_falloff; + for (size_t n = 0; n < limit; ++n) { /* grab peak since last read */ @@ -283,11 +288,11 @@ PeakMeter::meter () if (n < n_midi) { _max_peak_power[n] = -INFINITY; // std::max (new_peak, _max_peak_power[n]); // XXX _max_peak_signal[n] = 0; - if (Config->get_meter_falloff() == 0.0f || new_peak > _visible_peak_power[n]) { + if (midi_meter_falloff == 0.0f || new_peak > _visible_peak_power[n]) { ; } else { - /* empirical WRT to falloff times , 0.01f ^= 100 Hz update rate */ - new_peak = _visible_peak_power[n] - sqrt(_visible_peak_power[n] * Config->get_meter_falloff() * 0.01f * 0.0002f); + /* empirical algorithm WRT to audio falloff times */ + new_peak = _visible_peak_power[n] - sqrt(_visible_peak_power[n] * midi_meter_falloff * 0.0002f); if (new_peak < (1.0 / 512.0)) new_peak = 0; } _visible_peak_power[n] = new_peak; @@ -310,11 +315,11 @@ PeakMeter::meter () _max_peak_power[n] = std::max (new_peak, _max_peak_power[n]); - if (Config->get_meter_falloff() == 0.0f || new_peak > _visible_peak_power[n]) { + if (audio_meter_falloff == 0.0f || new_peak > _visible_peak_power[n]) { _visible_peak_power[n] = new_peak; } else { // do falloff - new_peak = _visible_peak_power[n] - (Config->get_meter_falloff() * 0.01f); + new_peak = _visible_peak_power[n] - (audio_meter_falloff); _visible_peak_power[n] = std::max (new_peak, -INFINITY); } } From dd65329363c27d4674d8b3ec80342b59340d58be Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 23 Jul 2013 20:24:23 +0200 Subject: [PATCH 090/221] clean up video related messages --- gtk2_ardour/export_video_dialog.cc | 2 +- gtk2_ardour/transcode_ffmpeg.cc | 9 +++++---- gtk2_ardour/transcode_video_dialog.cc | 2 +- gtk2_ardour/video_server_dialog.cc | 10 +++++++--- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/gtk2_ardour/export_video_dialog.cc b/gtk2_ardour/export_video_dialog.cc index eb4213b237..5ccfa172ea 100644 --- a/gtk2_ardour/export_video_dialog.cc +++ b/gtk2_ardour/export_video_dialog.cc @@ -85,7 +85,7 @@ ExportVideoDialog::ExportVideoDialog (PublicEditor& ed, Session* s) , fps_checkbox (_("Override FPS (Default is to retain FPS from the input video file):")) , meta_checkbox (_("Include Session Metadata")) #if 1 /* tentative debug mode */ - , debug_checkbox (_("Enable Debug Mode: Print ffmpeg Command & Output to stdout.")) + , debug_checkbox (_("Debug Mode: Print ffmpeg command and output to stdout.")) #endif { set_session (s); diff --git a/gtk2_ardour/transcode_ffmpeg.cc b/gtk2_ardour/transcode_ffmpeg.cc index 9499c6c184..9e4aa39fa0 100644 --- a/gtk2_ardour/transcode_ffmpeg.cc +++ b/gtk2_ardour/transcode_ffmpeg.cc @@ -67,18 +67,19 @@ TranscodeFfmpeg::TranscodeFfmpeg (std::string f) } if (ffmpeg_exe.empty() || ffprobe_exe.empty()) { - warning << _( + warning << string_compose( + _( "No ffprobe or ffmpeg executables could be found on this system.\n" "Video import and export is not possible until you install those tools.\n" - "Ardour requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n" + "%1 requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n" "\n" - "The tools are included with the Ardour releases from ardour.org " + "The tools are included with the %1 releases from ardour.org " "and also available with the video-server at http://x42.github.com/harvid/\n" "\n" "Important: the files need to be installed in $PATH and named ffmpeg_harvid and ffprobe_harvid.\n" "If you already have a suitable ffmpeg installation on your system, we recommend creating " "symbolic links from ffmpeg to ffmpeg_harvid and from ffprobe to ffprobe_harvid.\n" - ) << endmsg; + ), PROGRAM_NAME) << endmsg; return; } ffexecok = true; diff --git a/gtk2_ardour/transcode_video_dialog.cc b/gtk2_ardour/transcode_video_dialog.cc index 5c6ae0c7b4..ee0d755b17 100644 --- a/gtk2_ardour/transcode_video_dialog.cc +++ b/gtk2_ardour/transcode_video_dialog.cc @@ -66,7 +66,7 @@ TranscodeVideoDialog::TranscodeVideoDialog (Session* s, std::string infile) , bitrate_adjustment (2000, 500, 10000, 10, 100, 0) , bitrate_spinner (bitrate_adjustment) #if 1 /* tentative debug mode */ - , debug_checkbox (_("Debug Mode: Print ffmpeg Command and Output to stdout.")) + , debug_checkbox (_("Debug Mode: Print ffmpeg command and output to stdout.")) #endif { set_session (s); diff --git a/gtk2_ardour/video_server_dialog.cc b/gtk2_ardour/video_server_dialog.cc index 8838409ccf..d7a018a045 100644 --- a/gtk2_ardour/video_server_dialog.cc +++ b/gtk2_ardour/video_server_dialog.cc @@ -87,8 +87,10 @@ VideoServerDialog::VideoServerDialog (Session* s) } else { PBD::warning << - _("The external video server 'harvid' can not be found. The tool is included with the Ardour releases from ardour.org, " - "alternatively you can download it from http://x42.github.com/harvid/ or acquire it from your distribution.") << endmsg; + string_compose( + _("The external video server 'harvid' can not be found. The tool is included with the %1 releases from ardour.org, " + "alternatively you can download it from http://x42.github.com/harvid/ or acquire it from your distribution."), PROGRAM_NAME) + << endmsg; } @@ -129,7 +131,9 @@ VideoServerDialog::VideoServerDialog (Session* s) t->attach (*l, 0, 1, 2, 3, FILL); t->attach (cachesize_spinner, 1, 2, 2, 3); - l = manage (new Label (_("Ardour relies on an external Video Server for the videotimeline.\nThe server configured in Edit -> Prefereces -> Video is not reachable.\nDo you want ardour to launch 'harvid' on this machine?"), Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER, false)); + l = manage (new Label (string_compose( + _("%1 relies on an external Video Server for the videotimeline.\nThe server configured in Edit -> Prefereces -> Video is not reachable.\nDo you want ardour to launch 'harvid' on this machine?"), PROGRAM_NAME) + , Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER, false)); l->set_max_width_chars(80); l->set_line_wrap(); vbox->pack_start (*l, true, true, 4); From 8da6a70ead63767b701a00aeaf859569b0d31ee4 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 23 Jul 2013 21:20:51 +0200 Subject: [PATCH 091/221] implement meter-lineup and VU standard preferences --- gtk2_ardour/level_meter.cc | 38 +++++++++++++++++++--- gtk2_ardour/rc_option_editor.cc | 26 +++++++++++---- libs/ardour/ardour/rc_configuration_vars.h | 1 + libs/ardour/ardour/types.h | 8 +++++ libs/ardour/enums.cc | 20 ++++++++++++ 5 files changed, 82 insertions(+), 11 deletions(-) diff --git a/gtk2_ardour/level_meter.cc b/gtk2_ardour/level_meter.cc index fd32add587..d3bb4ad5ab 100644 --- a/gtk2_ardour/level_meter.cc +++ b/gtk2_ardour/level_meter.cc @@ -85,6 +85,34 @@ LevelMeter::set_meter (PeakMeter* meter) } } +static float meter_lineup(float offset) { + switch (Config->get_meter_line_up_level()) { + case MeteringLineUp24: + return offset + 6.0; + case MeteringLineUp20: + return offset + 2.0; + case MeteringLineUp18: + return offset; + case MeteringLineUp15: + return offset - 3.0; + default: + break; + } + return offset; +} + +static float vu_standard() { + // note - default meter config is +2dB (france) + switch (Config->get_meter_vu_standard()) { + case MeteringVUfrench: // +2dB + return 0; + case MeteringVUamerican: // 0dB + return -2; + case MeteringVUstandard: // -4dB + return -6; + } +} + float LevelMeter::update_meters () { @@ -115,18 +143,18 @@ LevelMeter::update_meters () if (meter_type == MeterPeak) { (*i).meter->set (log_meter (peak)); } else if (meter_type == MeterIEC1NOR) { - (*i).meter->set (meter_deflect_nordic (peak)); + (*i).meter->set (meter_deflect_nordic (peak + meter_lineup(0))); } else if (meter_type == MeterIEC1DIN) { - (*i).meter->set (meter_deflect_din (peak)); + (*i).meter->set (meter_deflect_din (peak + meter_lineup(3.0))); } else if (meter_type == MeterIEC2BBC || meter_type == MeterIEC2EBU) { - (*i).meter->set (meter_deflect_ppm (peak)); + (*i).meter->set (meter_deflect_ppm (peak + meter_lineup(0))); } else if (meter_type == MeterVU) { - (*i).meter->set (meter_deflect_vu (peak)); + (*i).meter->set (meter_deflect_vu (peak + vu_standard() + meter_lineup(0))); } else if (meter_type == MeterK14) { (*i).meter->set (meter_deflect_k (peak, 14), meter_deflect_k(_meter->meter_level(n, MeterPeak), 14)); } else if (meter_type == MeterK20) { (*i).meter->set (meter_deflect_k (peak, 20), meter_deflect_k(_meter->meter_level(n, MeterPeak), 20)); - } else { + } else { // RMS (*i).meter->set (log_meter (peak), log_meter(_meter->meter_level(n, MeterPeak))); } } diff --git a/gtk2_ardour/rc_option_editor.cc b/gtk2_ardour/rc_option_editor.cc index 3f984eab29..501d76262b 100644 --- a/gtk2_ardour/rc_option_editor.cc +++ b/gtk2_ardour/rc_option_editor.cc @@ -1928,20 +1928,34 @@ RCOptionEditor::RCOptionEditor () ComboOption* mlu = new ComboOption ( "meter-line-up-level", - _("Meter line-up level"), + _("Meter line-up level; 0dBu"), sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_line_up_level), sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_line_up_level) ); - mlu->add (MeteringLineUp24, _("-24dB")); - mlu->add (MeteringLineUp20, _("-20dB (SMPTE)")); - mlu->add (MeteringLineUp18, _("-18dB (EBU)")); - mlu->add (MeteringLineUp15, _("-15dB")); + mlu->add (MeteringLineUp24, _("-24dBFS")); + mlu->add (MeteringLineUp20, _("-20dBFS (SMPTE)")); + mlu->add (MeteringLineUp18, _("-18dBFS (EBU, BBC)")); + mlu->add (MeteringLineUp15, _("-15dBFS (DIN)")); - Gtkmm2ext::UI::instance()->set_tip (mlu->tip_widget(), _("Configure meter-ticks and color-knee point.")); + Gtkmm2ext::UI::instance()->set_tip (mlu->tip_widget(), _("Configure meter-ticks and color-knee point for dBFS scale DPM, set reference/offset level for IEC PPM.")); add_option (S_("Preferences|GUI"), mlu); + + ComboOption* mvu = new ComboOption ( + "meter-vu-standard", + _("VU Meter standard"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_vu_standard), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_vu_standard) + ); + + mvu->add (MeteringVUfrench, _("+2dB (France)")); + mvu->add (MeteringVUamerican, _(" 0dB (North America, Australia)")); + mvu->add (MeteringVUstandard, _("-4dB (standard)")); + + add_option (S_("Preferences|GUI"), mvu); + Gtk::Adjustment *mpk = manage (new Gtk::Adjustment(0, -10, 0, .1, .1)); HSliderOption *mpks = new HSliderOption("meter-peak", _("Peak threshold [dBFS]"), diff --git a/libs/ardour/ardour/rc_configuration_vars.h b/libs/ardour/ardour/rc_configuration_vars.h index f87781c8a9..5716fa5105 100644 --- a/libs/ardour/ardour/rc_configuration_vars.h +++ b/libs/ardour/ardour/rc_configuration_vars.h @@ -149,6 +149,7 @@ CONFIG_VARIABLE (bool, super_rapid_clock_update, "super-rapid-clock-update", fal CONFIG_VARIABLE (float, meter_hold, "meter-hold", 100.0f) CONFIG_VARIABLE (float, meter_falloff, "meter-falloff", 32.0f) +CONFIG_VARIABLE (VUMeterStandard, meter_vu_standard, "meter-vu-standard", MeteringVUfrench) CONFIG_VARIABLE (MeterLineUp, meter_line_up_level, "meter-line-up-level", MeteringLineUp18) CONFIG_VARIABLE (float, meter_peak, "meter-peak", 0.0f) diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h index 553ee1ea28..11cdb79575 100644 --- a/libs/ardour/ardour/types.h +++ b/libs/ardour/ardour/types.h @@ -383,6 +383,12 @@ namespace ARDOUR { MeteringRoute ///< meter what is going through the route }; + enum VUMeterStandard { + MeteringVUfrench, // + 2 + MeteringVUamerican, // +-0 + MeteringVUstandard // -4 + }; + enum MeterLineUp { MeteringLineUp24, MeteringLineUp20, @@ -590,6 +596,7 @@ std::istream& operator>>(std::istream& o, ARDOUR::HeaderFormat& sf); std::istream& operator>>(std::istream& o, ARDOUR::AutoConnectOption& sf); std::istream& operator>>(std::istream& o, ARDOUR::EditMode& sf); std::istream& operator>>(std::istream& o, ARDOUR::MonitorModel& sf); +std::istream& operator>>(std::istream& o, ARDOUR::VUMeterStandard& sf); std::istream& operator>>(std::istream& o, ARDOUR::MeterLineUp& sf); std::istream& operator>>(std::istream& o, ARDOUR::PFLPosition& sf); std::istream& operator>>(std::istream& o, ARDOUR::AFLPosition& sf); @@ -612,6 +619,7 @@ std::ostream& operator<<(std::ostream& o, const ARDOUR::HeaderFormat& sf); std::ostream& operator<<(std::ostream& o, const ARDOUR::AutoConnectOption& sf); std::ostream& operator<<(std::ostream& o, const ARDOUR::EditMode& sf); std::ostream& operator<<(std::ostream& o, const ARDOUR::MonitorModel& sf); +std::ostream& operator<<(std::ostream& o, const ARDOUR::VUMeterStandard& sf); std::ostream& operator<<(std::ostream& o, const ARDOUR::MeterLineUp& sf); std::ostream& operator<<(std::ostream& o, const ARDOUR::PFLPosition& sf); std::ostream& operator<<(std::ostream& o, const ARDOUR::AFLPosition& sf); diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc index 0d225fada3..e60977a3e5 100644 --- a/libs/ardour/enums.cc +++ b/libs/ardour/enums.cc @@ -62,6 +62,7 @@ setup_enum_writer () ColorMode _ColorMode; MeterFalloff _MeterFalloff; MeterHold _MeterHold; + VUMeterStandard _VUMeterStandard; MeterLineUp _MeterLineUp; EditMode _EditMode; RegionPoint _RegionPoint; @@ -222,6 +223,11 @@ setup_enum_writer () REGISTER_ENUM (MeterHoldLong); REGISTER (_MeterHold); + REGISTER_ENUM (MeteringVUfrench); + REGISTER_ENUM (MeteringVUamerican); + REGISTER_ENUM (MeteringVUstandard); + REGISTER (_VUMeterStandard); + REGISTER_ENUM (MeteringLineUp24); REGISTER_ENUM (MeteringLineUp20); REGISTER_ENUM (MeteringLineUp18); @@ -675,6 +681,20 @@ std::ostream& operator<<(std::ostream& o, const MonitorModel& var) return o << s; } +std::istream& operator>>(std::istream& o, VUMeterStandard& var) +{ + std::string s; + o >> s; + var = (VUMeterStandard) string_2_enum (s, var); + return o; +} + +std::ostream& operator<<(std::ostream& o, const VUMeterStandard& var) +{ + std::string s = enum_2_string (var); + return o << s; +} + std::istream& operator>>(std::istream& o, MeterLineUp& var) { std::string s; From 5d9fc75d7b3ec79c9fbad313a5eded7f30525d8c Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 23 Jul 2013 23:07:17 +0200 Subject: [PATCH 092/221] BBC meter labels are always white --- gtk2_ardour/meter_patterns.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index 193039b3eb..ef3513f259 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -128,6 +128,9 @@ static inline float mtr_col_and_fract( } break; case MeterIEC2BBC: + fraction = meter_deflect_ppm(val); + cairo_set_source_rgb (cr, c->get_red_p(), c->get_green_p(), c->get_blue_p()); + break; case MeterIEC2EBU: fraction = meter_deflect_ppm(val); if (val >= -10.0) { From c8f1a545db1762d992768c47c9b112b0a8902630 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 23 Jul 2013 23:07:41 +0200 Subject: [PATCH 093/221] clarify meter preference options --- gtk2_ardour/rc_option_editor.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/gtk2_ardour/rc_option_editor.cc b/gtk2_ardour/rc_option_editor.cc index 501d76262b..2044282862 100644 --- a/gtk2_ardour/rc_option_editor.cc +++ b/gtk2_ardour/rc_option_editor.cc @@ -1933,8 +1933,8 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_line_up_level) ); - mlu->add (MeteringLineUp24, _("-24dBFS")); - mlu->add (MeteringLineUp20, _("-20dBFS (SMPTE)")); + mlu->add (MeteringLineUp24, _("-24dBFS (SMPTE US: 4dBu = -20dBFS)")); + mlu->add (MeteringLineUp20, _("-20dBFS (SMPTE RP.0155)")); mlu->add (MeteringLineUp18, _("-18dBFS (EBU, BBC)")); mlu->add (MeteringLineUp15, _("-15dBFS (DIN)")); @@ -1950,9 +1950,9 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_vu_standard) ); - mvu->add (MeteringVUfrench, _("+2dB (France)")); - mvu->add (MeteringVUamerican, _(" 0dB (North America, Australia)")); - mvu->add (MeteringVUstandard, _("-4dB (standard)")); + mvu->add (MeteringVUfrench, _("0VU = -2dBu (France)")); + mvu->add (MeteringVUamerican, _("0VU = 0dBu (North America, Australia)")); + mvu->add (MeteringVUstandard, _("0VU = +4dBu (standard)")); add_option (S_("Preferences|GUI"), mvu); From f2b547a14d20a6a8602b37fbcbca535044c0ce65 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 23 Jul 2013 23:11:50 +0200 Subject: [PATCH 094/221] change default VU mode to "0VU = +4dBu (standard)" --- libs/ardour/ardour/rc_configuration_vars.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/ardour/ardour/rc_configuration_vars.h b/libs/ardour/ardour/rc_configuration_vars.h index 5716fa5105..6c351faf25 100644 --- a/libs/ardour/ardour/rc_configuration_vars.h +++ b/libs/ardour/ardour/rc_configuration_vars.h @@ -149,7 +149,7 @@ CONFIG_VARIABLE (bool, super_rapid_clock_update, "super-rapid-clock-update", fal CONFIG_VARIABLE (float, meter_hold, "meter-hold", 100.0f) CONFIG_VARIABLE (float, meter_falloff, "meter-falloff", 32.0f) -CONFIG_VARIABLE (VUMeterStandard, meter_vu_standard, "meter-vu-standard", MeteringVUfrench) +CONFIG_VARIABLE (VUMeterStandard, meter_vu_standard, "meter-vu-standard", MeteringVUstandard) CONFIG_VARIABLE (MeterLineUp, meter_line_up_level, "meter-line-up-level", MeteringLineUp18) CONFIG_VARIABLE (float, meter_peak, "meter-peak", 0.0f) From 6706f45b95d39028f643606705aeb3f82686b28c Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 23 Jul 2013 23:53:22 +0200 Subject: [PATCH 095/221] add "0VU = +8dBu" VU meter config --- gtk2_ardour/level_meter.cc | 8 +++++--- gtk2_ardour/rc_option_editor.cc | 1 + libs/ardour/ardour/types.h | 7 ++++--- libs/ardour/enums.cc | 1 + 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/gtk2_ardour/level_meter.cc b/gtk2_ardour/level_meter.cc index d3bb4ad5ab..536b83b3f2 100644 --- a/gtk2_ardour/level_meter.cc +++ b/gtk2_ardour/level_meter.cc @@ -104,12 +104,14 @@ static float meter_lineup(float offset) { static float vu_standard() { // note - default meter config is +2dB (france) switch (Config->get_meter_vu_standard()) { - case MeteringVUfrench: // +2dB + case MeteringVUfrench: // 0VU = -2dBu return 0; - case MeteringVUamerican: // 0dB + case MeteringVUamerican: // 0VU = 0dBu return -2; - case MeteringVUstandard: // -4dB + case MeteringVUstandard: // 0VU = +4dBu return -6; + case MeteringVUeight: // 0VU = +8dBu + return -10; } } diff --git a/gtk2_ardour/rc_option_editor.cc b/gtk2_ardour/rc_option_editor.cc index 2044282862..4297f61e0b 100644 --- a/gtk2_ardour/rc_option_editor.cc +++ b/gtk2_ardour/rc_option_editor.cc @@ -1953,6 +1953,7 @@ RCOptionEditor::RCOptionEditor () mvu->add (MeteringVUfrench, _("0VU = -2dBu (France)")); mvu->add (MeteringVUamerican, _("0VU = 0dBu (North America, Australia)")); mvu->add (MeteringVUstandard, _("0VU = +4dBu (standard)")); + mvu->add (MeteringVUstandard, _("0VU = +8dBu")); add_option (S_("Preferences|GUI"), mvu); diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h index 11cdb79575..2115149872 100644 --- a/libs/ardour/ardour/types.h +++ b/libs/ardour/ardour/types.h @@ -384,9 +384,10 @@ namespace ARDOUR { }; enum VUMeterStandard { - MeteringVUfrench, // + 2 - MeteringVUamerican, // +-0 - MeteringVUstandard // -4 + MeteringVUfrench, // 0VU = -2dBu + MeteringVUamerican, // 0VU = 0dBu + MeteringVUstandard, // 0VU = +4dBu + MeteringVUeight // 0VU = +8dBu }; enum MeterLineUp { diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc index e60977a3e5..ab181d2956 100644 --- a/libs/ardour/enums.cc +++ b/libs/ardour/enums.cc @@ -226,6 +226,7 @@ setup_enum_writer () REGISTER_ENUM (MeteringVUfrench); REGISTER_ENUM (MeteringVUamerican); REGISTER_ENUM (MeteringVUstandard); + REGISTER_ENUM (MeteringVUeight); REGISTER (_VUMeterStandard); REGISTER_ENUM (MeteringLineUp24); From 8deccea615aae9a0be0800d7858ccedcea4133e5 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 24 Jul 2013 01:39:16 +0200 Subject: [PATCH 096/221] limit width and resize meterbride window --- gtk2_ardour/meter_strip.cc | 4 +++- gtk2_ardour/meter_strip.h | 1 + gtk2_ardour/meterbridge.cc | 4 +++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/gtk2_ardour/meter_strip.cc b/gtk2_ardour/meter_strip.cc index 4e4ffe11cf..061c14d468 100644 --- a/gtk2_ardour/meter_strip.cc +++ b/gtk2_ardour/meter_strip.cc @@ -56,6 +56,7 @@ using namespace ArdourMeter; PBD::Signal1 MeterStrip::CatchDeletion; PBD::Signal0 MeterStrip::MetricChanged; +PBD::Signal0 MeterStrip::ConfigurationChanged; MeterStrip::MeterStrip (int metricmode, MeterType mt) : AxisView(0) @@ -366,8 +367,9 @@ MeterStrip::meter_configuration_changed (ChanCount c) _has_midi = true; } - if (old_has_midi != _has_midi) MetricChanged(); on_theme_changed(); + if (old_has_midi != _has_midi) MetricChanged(); + else ConfigurationChanged(); } void diff --git a/gtk2_ardour/meter_strip.h b/gtk2_ardour/meter_strip.h index 4c532df5c7..fd5f65be3c 100644 --- a/gtk2_ardour/meter_strip.h +++ b/gtk2_ardour/meter_strip.h @@ -56,6 +56,7 @@ class MeterStrip : public Gtk::VBox, public RouteUI static PBD::Signal1 CatchDeletion; static PBD::Signal0 MetricChanged; + static PBD::Signal0 ConfigurationChanged; void reset_peak_display (); void reset_route_peak_display (ARDOUR::Route*); diff --git a/gtk2_ardour/meterbridge.cc b/gtk2_ardour/meterbridge.cc index 2b51e9a85f..fe29977b86 100644 --- a/gtk2_ardour/meterbridge.cc +++ b/gtk2_ardour/meterbridge.cc @@ -141,6 +141,7 @@ Meterbridge::Meterbridge () Route::SyncOrderKeys.connect (*this, invalidator (*this), boost::bind (&Meterbridge::sync_order_keys, this, _1), gui_context()); MeterStrip::CatchDeletion.connect (*this, invalidator (*this), boost::bind (&Meterbridge::remove_strip, this, _1), gui_context()); MeterStrip::MetricChanged.connect (*this, invalidator (*this), boost::bind(&Meterbridge::resync_order, this), gui_context()); + MeterStrip::ConfigurationChanged.connect (*this, invalidator (*this), boost::bind(&Meterbridge::queue_resize, this), gui_context()); /* work around ScrolledWindowViewport alignment mess Part one */ Gtk::HBox * yspc = manage (new Gtk::HBox()); @@ -336,7 +337,8 @@ Meterbridge::on_size_request (Gtk::Requisition* r) Gtk::Window::on_size_request(r); Gdk::Geometry geom; - geom.max_width = meterarea.get_width() + metrics_left.get_width() + metrics_right.get_width(); + Gtk::Requisition mr = meterarea.size_request(); + geom.max_width = mr.width + metrics_left.get_width() + metrics_right.get_width(); geom.max_height = max_height; if (cur_max_width != geom.max_width) { From 8b616b075758b5013c65ac89c501b17ca7dc4e49 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 24 Jul 2013 01:43:24 +0200 Subject: [PATCH 097/221] meterbridge: meter-type dependent color-schema --- gtk2_ardour/level_meter.cc | 1 + gtk2_ardour/meter_patterns.cc | 93 +++++++++++++++++++++++------------ 2 files changed, 62 insertions(+), 32 deletions(-) diff --git a/gtk2_ardour/level_meter.cc b/gtk2_ardour/level_meter.cc index 536b83b3f2..558000b5f5 100644 --- a/gtk2_ardour/level_meter.cc +++ b/gtk2_ardour/level_meter.cc @@ -104,6 +104,7 @@ static float meter_lineup(float offset) { static float vu_standard() { // note - default meter config is +2dB (france) switch (Config->get_meter_vu_standard()) { + default: case MeteringVUfrench: // 0VU = -2dBu return 0; case MeteringVUamerican: // 0VU = 0dBu diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index ef3513f259..756cdcccbd 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -199,6 +199,38 @@ static inline float mtr_col_and_fract( return fraction; } +static void set_bg_color(Gtk::Widget& w, cairo_t* cr, MeterType type) { + switch(type) { + case MeterVU: + cairo_set_source_rgb (cr, 1.0, 1.0, 0.85); + break; + case MeterIEC1DIN: + case MeterIEC1NOR: + case MeterIEC2BBC: + case MeterIEC2EBU: + case MeterK14: + case MeterK20: + cairo_set_source_rgb (cr, 0.1, 0.1, 0.1); + break; + default: + { + Gdk::Color c = w.get_style()->get_bg (Gtk::STATE_ACTIVE); + cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); + } + break; + } +} + +static void set_fg_color(MeterType type, Gdk::Color * c) { + switch(type) { + case MeterVU: + c->set_rgb_p(0.0, 0.0, 0.0); + break; + default: + c->set_rgb_p(1.0, 1.0, 1.0); + break; + } +} static cairo_pattern_t* meter_render_ticks (Gtk::Widget& w, MeterType type, vector types) @@ -217,8 +249,13 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector typ cairo_move_to (cr, 0, 0); cairo_rectangle (cr, 0, 0, width, height); - { - Gdk::Color c = w.get_style()->get_bg (background ? Gtk::STATE_ACTIVE : Gtk::STATE_NORMAL); + + if (background) { + /* meterbridge */ + set_bg_color(w, cr, type); + } else { + /* mixer */ + Gdk::Color c = w.get_style()->get_bg (Gtk::STATE_NORMAL); cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); } cairo_fill (cr); @@ -229,24 +266,16 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector typ for (vector::const_iterator i = types.begin(); i != types.end(); ++i) { Gdk::Color c; - c = w.get_style()->get_fg (Gtk::STATE_NORMAL); - - if (types.size() > 1) { + if (types.size() > 1 && (*i) == DataType::MIDI) { /* we're overlaying more than 1 set of marks, so use different colours */ - switch (*i) { - case DataType::AUDIO: - c = w.get_style()->get_fg (Gtk::STATE_NORMAL); - cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); - break; - case DataType::MIDI: - c = w.get_style()->get_fg (Gtk::STATE_ACTIVE); - cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); - break; - } + c = w.get_style()->get_fg (Gtk::STATE_ACTIVE); + } else if (background) { + set_fg_color(type, &c); + cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); } else { c = w.get_style()->get_fg (Gtk::STATE_NORMAL); - cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); } + cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); // tick-maker position in dBFS, line-thickness std::map points; @@ -503,8 +532,12 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) cairo_move_to (cr, 0, 0); cairo_rectangle (cr, 0, 0, width, height); - { - Gdk::Color c = w.get_style()->get_bg (background ? Gtk::STATE_ACTIVE : Gtk::STATE_NORMAL); + if (background) { + /* meterbridge */ + set_bg_color(w, cr, type); + } else { + /* mixer */ + Gdk::Color c = w.get_style()->get_bg (Gtk::STATE_NORMAL); cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); } cairo_fill (cr); @@ -513,26 +546,20 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) height = min(max_pattern_metric_size, height); uint32_t peakcolor = ARDOUR_UI::config()->color_by_name ("meterbridge peaklabel"); + Gdk::Color c; for (vector::const_iterator i = types.begin(); i != types.end(); ++i) { - Gdk::Color c; - if (types.size() > 1) { + if (types.size() > 1 && (*i) == DataType::MIDI) { /* we're overlaying more than 1 set of marks, so use different colours */ - switch (*i) { - case DataType::AUDIO: - c = w.get_style()->get_fg (Gtk::STATE_NORMAL); - cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); - break; - case DataType::MIDI: - c = w.get_style()->get_fg (Gtk::STATE_ACTIVE); - cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); - break; - } + c = w.get_style()->get_fg (Gtk::STATE_ACTIVE); + } else if (background) { + set_fg_color(type, &c); + cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); } else { c = w.get_style()->get_fg (Gtk::STATE_NORMAL); - cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); } + cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); // label-pos in dBFS, label-text @@ -780,7 +807,9 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) layout->get_pixel_size(tw, th); break; } - Gdk::Color c = w.get_style()->get_fg (Gtk::STATE_ACTIVE); + if (!background) { + c = w.get_style()->get_fg (Gtk::STATE_ACTIVE); + } cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); if (tickleft) { cairo_move_to (cr, width - 2 - tw, height - th - 0.5); From efb16a6faab10668cb9bd51c6b889b569bcd9fe7 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 24 Jul 2013 02:46:53 +0200 Subject: [PATCH 098/221] meter background color.. --- gtk2_ardour/level_meter.cc | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/gtk2_ardour/level_meter.cc b/gtk2_ardour/level_meter.cc index 558000b5f5..0046cbc824 100644 --- a/gtk2_ardour/level_meter.cc +++ b/gtk2_ardour/level_meter.cc @@ -255,7 +255,12 @@ LevelMeter::setup_meters (int len, int initial_width, int thin_width) for (int32_t n = nmeters-1; nmeters && n >= 0 ; --n) { uint32_t c[10]; + uint32_t b[4]; float stp[4]; + b[0] = ARDOUR_UI::config()->canvasvar_MeterBackgroundBot.get(); + b[1] = ARDOUR_UI::config()->canvasvar_MeterBackgroundTop.get(); + b[2] = 0x991122ff; // red highlight gradient Bot + b[3] = 0x551111ff; // red highlight gradient Top if (n < nmidi) { c[0] = ARDOUR_UI::config()->canvasvar_MidiMeterColor0.get(); c[1] = ARDOUR_UI::config()->canvasvar_MidiMeterColor1.get(); @@ -330,6 +335,8 @@ LevelMeter::setup_meters (int len, int initial_width, int thin_width) stp[1] = 115.0 * meter_deflect_vu(-23); // -3 stp[2] = 115.0 * meter_deflect_vu(-20); // 0 stp[3] = 115.0 * meter_deflect_vu(-18); // +2 + b[0] = 0x80806dff; + b[1] = 0xc0c0a3ff; break; default: // PEAK, RMS stp[1] = 77.5; // 115 * log_meter(-10) @@ -357,9 +364,7 @@ LevelMeter::setup_meters (int len, int initial_width, int thin_width) meters[n].meter = new FastMeter ((uint32_t) floor (Config->get_meter_hold()), width, FastMeter::Vertical, len, c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7], c[8], c[9], - ARDOUR_UI::config()->canvasvar_MeterBackgroundBot.get(), - ARDOUR_UI::config()->canvasvar_MeterBackgroundTop.get(), - 0x991122ff, 0x551111ff, + b[0], b[1], b[2], b[3], stp[0], stp[1], stp[2], stp[3] ); meters[n].width = width; From fa332f31fa43d8807b197a1cabfd39784cf3ef8a Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 24 Jul 2013 02:47:37 +0200 Subject: [PATCH 099/221] allow to en/disable shade and LED meter style --- gtk2_ardour/level_meter.cc | 5 +++- libs/gtkmm2ext/fastmeter.cc | 39 ++++++++++++++++------------ libs/gtkmm2ext/gtkmm2ext/fastmeter.h | 19 +++++++++----- 3 files changed, 38 insertions(+), 25 deletions(-) diff --git a/gtk2_ardour/level_meter.cc b/gtk2_ardour/level_meter.cc index 0046cbc824..d57481b701 100644 --- a/gtk2_ardour/level_meter.cc +++ b/gtk2_ardour/level_meter.cc @@ -257,6 +257,7 @@ LevelMeter::setup_meters (int len, int initial_width, int thin_width) uint32_t c[10]; uint32_t b[4]; float stp[4]; + int styleflags = 3; b[0] = ARDOUR_UI::config()->canvasvar_MeterBackgroundBot.get(); b[1] = ARDOUR_UI::config()->canvasvar_MeterBackgroundTop.get(); b[2] = 0x991122ff; // red highlight gradient Bot @@ -337,6 +338,7 @@ LevelMeter::setup_meters (int len, int initial_width, int thin_width) stp[3] = 115.0 * meter_deflect_vu(-18); // +2 b[0] = 0x80806dff; b[1] = 0xc0c0a3ff; + styleflags = 1; break; default: // PEAK, RMS stp[1] = 77.5; // 115 * log_meter(-10) @@ -365,7 +367,8 @@ LevelMeter::setup_meters (int len, int initial_width, int thin_width) c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7], c[8], c[9], b[0], b[1], b[2], b[3], - stp[0], stp[1], stp[2], stp[3] + stp[0], stp[1], stp[2], stp[3], + styleflags ); meters[n].width = width; meters[n].length = len; diff --git a/libs/gtkmm2ext/fastmeter.cc b/libs/gtkmm2ext/fastmeter.cc index 817b11ff6c..282b9e10b8 100644 --- a/libs/gtkmm2ext/fastmeter.cc +++ b/libs/gtkmm2ext/fastmeter.cc @@ -51,7 +51,8 @@ FastMeter::FastMeter (long hold, unsigned long dimen, Orientation o, int len, int bgc0, int bgc1, int bgh0, int bgh1, float stp0, float stp1, - float stp2, float stp3 + float stp2, float stp3, + int styleflags ) { orientation = o; @@ -88,6 +89,8 @@ FastMeter::FastMeter (long hold, unsigned long dimen, Orientation o, int len, _stp[2] = stp2; _stp[3] = stp3; + _styleflags = styleflags; + set_events (BUTTON_PRESS_MASK|BUTTON_RELEASE_MASK); pixrect.x = 1; @@ -96,7 +99,7 @@ FastMeter::FastMeter (long hold, unsigned long dimen, Orientation o, int len, if (!len) { len = 250; } - fgpattern = request_vertical_meter(dimen, len, _clr, _stp, true); + fgpattern = request_vertical_meter(dimen, len, _clr, _stp, _styleflags); bgpattern = request_vertical_background (dimen, len, _bgc, false); pixheight = len; pixwidth = dimen; @@ -116,7 +119,7 @@ FastMeter::~FastMeter () Cairo::RefPtr FastMeter::generate_meter_pattern ( - int width, int height, int *clr, float *stp, bool shade) + int width, int height, int *clr, float *stp, int styleflags) { guint8 r,g,b,a; double knee; @@ -177,7 +180,7 @@ FastMeter::generate_meter_pattern ( cairo_pattern_add_color_stop_rgb (pat, 1.0, r/255.0, g/255.0, b/255.0); - if (shade && !no_rgba_overlay) { + if ((styleflags & 1) && !no_rgba_overlay) { cairo_pattern_t* shade_pattern = cairo_pattern_create_linear (0.0, 0.0, width, 0.0); cairo_pattern_add_color_stop_rgba (shade_pattern, 0, 1.0, 1.0, 1.0, 0.2); cairo_pattern_add_color_stop_rgba (shade_pattern, 1, 0.0, 0.0, 0.0, 0.3); @@ -190,16 +193,18 @@ FastMeter::generate_meter_pattern ( cairo_rectangle (tc, 0, 0, width, height); cairo_fill (tc); - cairo_save (tc); - cairo_set_line_width(tc, 1.0); - cairo_set_source_rgba(tc, .1, .1, .1, .5); - //cairo_set_operator (tc, CAIRO_OPERATOR_SOURCE); - for (float y=.5; y < height; y+= 2.0) { - cairo_move_to(tc, 0, y); - cairo_line_to(tc, width, y); - cairo_stroke (tc); + if (styleflags & 2) { // LED stripes + cairo_save (tc); + cairo_set_line_width(tc, 1.0); + cairo_set_source_rgba(tc, .1, .1, .1, .5); + //cairo_set_operator (tc, CAIRO_OPERATOR_SOURCE); + for (float y=.5; y < height; y+= 2.0) { + cairo_move_to(tc, 0, y); + cairo_line_to(tc, width, y); + cairo_stroke (tc); + } + cairo_restore (tc); } - cairo_restore (tc); cairo_set_source (tc, shade_pattern); cairo_rectangle (tc, 0, 0, width, height); @@ -270,7 +275,7 @@ FastMeter::generate_meter_background ( Cairo::RefPtr FastMeter::request_vertical_meter( - int width, int height, int *clr, float *stp, bool shade) + int width, int height, int *clr, float *stp, int styleflags) { if (height < min_pattern_metric_size) height = min_pattern_metric_size; @@ -281,7 +286,7 @@ FastMeter::request_vertical_meter( stp[0], stp[1], stp[2], stp[3], clr[0], clr[1], clr[2], clr[3], clr[4], clr[5], clr[6], clr[7], - clr[8], clr[9]); + clr[8], clr[9], styleflags); Pattern10Map::iterator i; if ((i = vm_pattern_cache.find (key)) != vm_pattern_cache.end()) { @@ -290,7 +295,7 @@ FastMeter::request_vertical_meter( // TODO flush pattern cache if it gets too large Cairo::RefPtr p = generate_meter_pattern ( - width, height, clr, stp, shade); + width, height, clr, stp, styleflags); vm_pattern_cache[key] = p; return p; @@ -361,7 +366,7 @@ FastMeter::on_size_allocate (Gtk::Allocation &alloc) } if (pixheight != h) { - fgpattern = request_vertical_meter (request_width, h, _clr, _stp, true); + fgpattern = request_vertical_meter (request_width, h, _clr, _stp, _styleflags); bgpattern = request_vertical_background (request_width, h, highlight ? _bgh : _bgc, highlight); pixheight = h - 2; pixwidth = request_width - 2; diff --git a/libs/gtkmm2ext/gtkmm2ext/fastmeter.h b/libs/gtkmm2ext/gtkmm2ext/fastmeter.h index 15c962deb4..3a806262f1 100644 --- a/libs/gtkmm2ext/gtkmm2ext/fastmeter.h +++ b/libs/gtkmm2ext/gtkmm2ext/fastmeter.h @@ -47,7 +47,8 @@ class FastMeter : public Gtk::DrawingArea { float stp0 = 55.0, // log_meter(-18); float stp1 = 77.5, // log_meter(-9); float stp2 = 92.5, // log_meter(-3); // 95.0, // log_meter(-2); - float stp3 = 100.0 + float stp3 = 100.0, + int styleflags = 3 ); virtual ~FastMeter (); @@ -79,6 +80,7 @@ private: int _clr[10]; int _bgc[2]; int _bgh[2]; + int _styleflags; Orientation orientation; GdkRectangle pixrect; @@ -99,14 +101,14 @@ private: static bool no_rgba_overlay; static Cairo::RefPtr generate_meter_pattern ( - int w, int h, int *clr, float *stp, bool shade); + int, int, int *, float *, int); static Cairo::RefPtr request_vertical_meter ( - int w, int h, int *clr, float *stp, bool shade); + int, int, int *, float *, int); static Cairo::RefPtr generate_meter_background ( - int w, int h, int *bgc, bool shade); + int, int, int *, bool); static Cairo::RefPtr request_vertical_background ( - int w, int h, int *bgc, bool shade); + int, int, int *, bool); struct Pattern10MapKey { Pattern10MapKey ( @@ -114,20 +116,23 @@ private: float stp0, float stp1, float stp2, float stp3, int c0, int c1, int c2, int c3, int c4, int c5, int c6, int c7, - int c8, int c9 + int c8, int c9, int st ) : dim(w, h) , stp(stp0, stp1, stp2, stp3) , cols(c0, c1, c2, c3, c4, c5, c6, c7, c8, c9) + , style(st) {} inline bool operator<(const Pattern10MapKey& rhs) const { return (dim < rhs.dim) || (dim == rhs.dim && stp < rhs.stp) - || (dim == rhs.dim && stp == rhs.stp && cols < rhs.cols); + || (dim == rhs.dim && stp == rhs.stp && cols < rhs.cols) + || (dim == rhs.dim && stp == rhs.stp && cols == rhs.cols && style < rhs.style); } boost::tuple dim; boost::tuple stp; boost::tuple cols; + int style; }; typedef std::map > Pattern10Map; From 6b96a4baa30e60bcabced774acbb6d0c686a5014 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 24 Jul 2013 11:57:11 +0200 Subject: [PATCH 100/221] amend to 8deccea6 (resize meterbridge window) --- gtk2_ardour/meterbridge.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/gtk2_ardour/meterbridge.cc b/gtk2_ardour/meterbridge.cc index fe29977b86..a2bc047bdb 100644 --- a/gtk2_ardour/meterbridge.cc +++ b/gtk2_ardour/meterbridge.cc @@ -683,6 +683,7 @@ Meterbridge::sync_order_keys (RouteSortOrderKey src) delete (_metrics.back()); _metrics.pop_back(); } + queue_resize(); } void From d8372bdf9b62eec064ec7e94bb6237a5363ee40a Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 24 Jul 2013 11:59:40 +0200 Subject: [PATCH 101/221] color meterbridge strips --- gtk2_ardour/ardour3_styles.rc.in | 17 ++++++++++ gtk2_ardour/ardour3_widget_list.rc | 4 +++ gtk2_ardour/meter_patterns.cc | 8 +++-- gtk2_ardour/meter_strip.cc | 52 ++++++++++++++++++++++-------- gtk2_ardour/meter_strip.h | 4 ++- 5 files changed, 68 insertions(+), 17 deletions(-) diff --git a/gtk2_ardour/ardour3_styles.rc.in b/gtk2_ardour/ardour3_styles.rc.in index 45b8458370..8a88e7cbbe 100644 --- a/gtk2_ardour/ardour3_styles.rc.in +++ b/gtk2_ardour/ardour3_styles.rc.in @@ -989,3 +989,20 @@ style "default_toggle_button" bg[ACTIVE] = @@COLPREFIX@_contrasting_indicator fg[ACTIVE] = @@COLPREFIX@_darkest } + + +style "meter_strip_dpm" = "default" +{ +} + +style "meter_strip_ppm" = "default" +{ + bg[NORMAL] = { 0.1, 0.1, 0.1 } + fg[NORMAL] = { 1.0, 1.0, 1.0 } +} + +style "meter_strip_vu" = "default" +{ + bg[NORMAL] = { 1.0, 1.0, 0.85 } + fg[NORMAL] = { 0.0, 0.0, 0.0 } +} diff --git a/gtk2_ardour/ardour3_widget_list.rc b/gtk2_ardour/ardour3_widget_list.rc index 05ebde9421..26b9a99b7f 100644 --- a/gtk2_ardour/ardour3_widget_list.rc +++ b/gtk2_ardour/ardour3_widget_list.rc @@ -290,6 +290,10 @@ widget "*PluginLoadButton" style:highest "small_button" widget "*PluginLoadButton*" style:highest "small_button" widget "*PluginEditorButton" style:highest "default_toggle_button" +widget "*meterstripPPM" style:highest "meter_strip_ppm" +widget "*meterstripDPM" style:highest "meter_strip_dpm" +widget "*meterstripVU" style:highest "meter_strip_vu" + widget "*MetricDialogFrame" style:highest "base_frame" widget "*MetricEntry" style:highest "medium_bold_entry" widget "*MetricButton" style:highest "default_button" diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index 756cdcccbd..4cd96f2433 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -200,6 +200,7 @@ static inline float mtr_col_and_fract( } static void set_bg_color(Gtk::Widget& w, cairo_t* cr, MeterType type) { + // TODO use "meterstrip*" stype switch(type) { case MeterVU: cairo_set_source_rgb (cr, 1.0, 1.0, 0.85); @@ -221,7 +222,8 @@ static void set_bg_color(Gtk::Widget& w, cairo_t* cr, MeterType type) { } } -static void set_fg_color(MeterType type, Gdk::Color * c) { +static void set_fg_color(Gtk::Widget& w, MeterType type, Gdk::Color * c) { + // TODO use "meterstrip*" stype switch(type) { case MeterVU: c->set_rgb_p(0.0, 0.0, 0.0); @@ -270,7 +272,7 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector typ /* we're overlaying more than 1 set of marks, so use different colours */ c = w.get_style()->get_fg (Gtk::STATE_ACTIVE); } else if (background) { - set_fg_color(type, &c); + set_fg_color(w, type, &c); cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); } else { c = w.get_style()->get_fg (Gtk::STATE_NORMAL); @@ -554,7 +556,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) /* we're overlaying more than 1 set of marks, so use different colours */ c = w.get_style()->get_fg (Gtk::STATE_ACTIVE); } else if (background) { - set_fg_color(type, &c); + set_fg_color(w, type, &c); cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); } else { c = w.get_style()->get_fg (Gtk::STATE_NORMAL); diff --git a/gtk2_ardour/meter_strip.cc b/gtk2_ardour/meter_strip.cc index 061c14d468..f7f18fb273 100644 --- a/gtk2_ardour/meter_strip.cc +++ b/gtk2_ardour/meter_strip.cc @@ -64,7 +64,7 @@ MeterStrip::MeterStrip (int metricmode, MeterType mt) { level_meter = 0; _strip_type = 0; - set_spacing(2); + strip.set_spacing(2); peakbx.set_size_request(-1, 14); namebx.set_size_request(18, 52); @@ -77,15 +77,17 @@ MeterStrip::MeterStrip (int metricmode, MeterType mt) meterbox.pack_start(meter_metric_area, true, false); - pack_start (peakbx, false, false); - pack_start (meterbox, true, true); - pack_start (btnbox, false, false); - pack_start (namebx, false, false); + strip.pack_start (peakbx, false, false); + strip.pack_start (meterbox, true, true); + strip.pack_start (btnbox, false, false); + strip.pack_start (namebx, false, false); + add(strip); peakbx.show(); btnbox.show(); meter_metric_area.show(); meterbox.show(); + strip.show(); UI::instance()->theme_changed.connect (sigc::mem_fun(*this, &MeterStrip::on_theme_changed)); ColorsChanged.connect (sigc::mem_fun (*this, &MeterStrip::on_theme_changed)); @@ -98,7 +100,7 @@ MeterStrip::MeterStrip (Session* sess, boost::shared_ptr rt) , _route(rt) , peak_display() { - set_spacing(2); + strip.set_spacing(2); RouteUI::set_route (rt); SessionHandlePtr::set_session (sess); @@ -174,11 +176,12 @@ MeterStrip::MeterStrip (Session* sess, boost::shared_ptr rt) update_button_box(); update_name_box(); + update_background (_route->meter_type()); - pack_start (peakbx, false, false); - pack_start (meterbox, true, true); - pack_start (btnbox, false, false); - pack_start (namebx, false, false); + strip.pack_start (peakbx, false, false); + strip.pack_start (meterbox, true, true); + strip.pack_start (btnbox, false, false); + strip.pack_start (namebx, false, false); name_label.show(); peak_display.show(); peakbx.show(); @@ -189,6 +192,8 @@ MeterStrip::MeterStrip (Session* sess, boost::shared_ptr rt) meter_align.show(); peak_align.show(); btnbox.show(); + add(strip); + strip.show(); _route->shared_peak_meter()->ConfigurationChanged.connect ( route_connections, invalidator (*this), boost::bind (&MeterStrip::meter_configuration_changed, this, _1), gui_context() @@ -375,7 +380,7 @@ MeterStrip::meter_configuration_changed (ChanCount c) void MeterStrip::on_size_request (Gtk::Requisition* r) { - VBox::on_size_request(r); + EventBox::on_size_request(r); } void @@ -390,7 +395,7 @@ MeterStrip::on_size_allocate (Gtk::Allocation& a) name_label.set_size_request(18, nh-2); name_label.layout()->set_width((nh-4) * PANGO_SCALE); } - VBox::on_size_allocate(a); + EventBox::on_size_allocate(a); } gint @@ -427,10 +432,30 @@ MeterStrip::set_metric_mode (int metricmode, ARDOUR::MeterType mt) _types.push_back (DataType::AUDIO); break; } - + update_background (mt); meter_metric_area.queue_draw (); } +void +MeterStrip::update_background(MeterType type) +{ + switch(type) { + case MeterIEC1DIN: + case MeterIEC1NOR: + case MeterIEC2BBC: + case MeterIEC2EBU: + case MeterK14: + case MeterK20: + set_name ("meterstripPPM"); + break; + case MeterVU: + set_name ("meterstripVU"); + break; + default: + set_name ("meterstripDPM"); + } +} + MeterType MeterStrip::meter_type() { @@ -631,6 +656,7 @@ MeterStrip::meter_type_changed (MeterType type) if (_route->meter_type() != type) { _route->set_meter_type(type); } + update_background (type); MetricChanged(); } diff --git a/gtk2_ardour/meter_strip.h b/gtk2_ardour/meter_strip.h index fd5f65be3c..4b5868e9d2 100644 --- a/gtk2_ardour/meter_strip.h +++ b/gtk2_ardour/meter_strip.h @@ -43,7 +43,7 @@ namespace Gtk { class Style; } -class MeterStrip : public Gtk::VBox, public RouteUI +class MeterStrip : public Gtk::EventBox, public RouteUI { public: MeterStrip (ARDOUR::Session*, boost::shared_ptr); @@ -90,6 +90,7 @@ class MeterStrip : public Gtk::VBox, public RouteUI void set_button_names (); private: + Gtk::VBox strip; Gtk::HBox meterbox; Gtk::HBox namebx; ArdourButton name_label; @@ -120,6 +121,7 @@ class MeterStrip : public Gtk::VBox, public RouteUI void strip_property_changed (const PBD::PropertyChange&); void meter_configuration_changed (ARDOUR::ChanCount); void meter_type_changed (ARDOUR::MeterType); + void update_background (ARDOUR::MeterType); static int max_pattern_metric_size; // == FastMeter::max_pattern_metric_size From 6f72c8534458dccf1901a95f366280728eee58bd Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 24 Jul 2013 15:47:53 +0200 Subject: [PATCH 102/221] add separator line to meterbridge --- gtk2_ardour/ardour3_styles.rc.in | 5 +++ gtk2_ardour/ardour3_widget_list.rc | 1 + gtk2_ardour/meter_strip.cc | 69 ++++++++++++++++++++++-------- gtk2_ardour/meter_strip.h | 8 +++- 4 files changed, 62 insertions(+), 21 deletions(-) diff --git a/gtk2_ardour/ardour3_styles.rc.in b/gtk2_ardour/ardour3_styles.rc.in index 8a88e7cbbe..7a432f06dd 100644 --- a/gtk2_ardour/ardour3_styles.rc.in +++ b/gtk2_ardour/ardour3_styles.rc.in @@ -1006,3 +1006,8 @@ style "meter_strip_vu" = "default" bg[NORMAL] = { 1.0, 1.0, 0.85 } fg[NORMAL] = { 0.0, 0.0, 0.0 } } + +style "meter_strip_sep" = "default" +{ + bg[NORMAL] = { 0.0, 0.0, 0.0 } +} diff --git a/gtk2_ardour/ardour3_widget_list.rc b/gtk2_ardour/ardour3_widget_list.rc index 26b9a99b7f..0e7075cef4 100644 --- a/gtk2_ardour/ardour3_widget_list.rc +++ b/gtk2_ardour/ardour3_widget_list.rc @@ -293,6 +293,7 @@ widget "*PluginEditorButton" style:highest "default_toggle_button" widget "*meterstripPPM" style:highest "meter_strip_ppm" widget "*meterstripDPM" style:highest "meter_strip_dpm" widget "*meterstripVU" style:highest "meter_strip_vu" +widget "*BlackSeparator" style:highest "meter_strip_sep" widget "*MetricDialogFrame" style:highest "base_frame" widget "*MetricEntry" style:highest "medium_bold_entry" diff --git a/gtk2_ardour/meter_strip.cc b/gtk2_ardour/meter_strip.cc index f7f18fb273..8ec9834c9d 100644 --- a/gtk2_ardour/meter_strip.cc +++ b/gtk2_ardour/meter_strip.cc @@ -64,9 +64,11 @@ MeterStrip::MeterStrip (int metricmode, MeterType mt) { level_meter = 0; _strip_type = 0; - strip.set_spacing(2); + mtr_vbox.set_spacing(2); + nfo_vbox.set_spacing(2); peakbx.set_size_request(-1, 14); namebx.set_size_request(18, 52); + spacer.set_size_request(-1,0); set_metric_mode(metricmode, mt); @@ -77,17 +79,30 @@ MeterStrip::MeterStrip (int metricmode, MeterType mt) meterbox.pack_start(meter_metric_area, true, false); - strip.pack_start (peakbx, false, false); - strip.pack_start (meterbox, true, true); - strip.pack_start (btnbox, false, false); - strip.pack_start (namebx, false, false); - add(strip); + mtr_vbox.pack_start (peakbx, false, false); + mtr_vbox.pack_start (meterbox, true, true); + mtr_vbox.pack_start (spacer, false, false); + mtr_container.add(mtr_vbox); + + mtr_hsep.set_size_request(-1,1); + mtr_hsep.set_name("BlackSeparator"); + + nfo_vbox.pack_start (mtr_hsep, false, false); + nfo_vbox.pack_start (btnbox, false, false); + nfo_vbox.pack_start (namebx, false, false); + + pack_start (mtr_container, true, true); + pack_start (nfo_vbox, false, false); peakbx.show(); btnbox.show(); meter_metric_area.show(); meterbox.show(); - strip.show(); + spacer.show(); + mtr_vbox.show(); + mtr_container.show(); + mtr_hsep.show(); + nfo_vbox.show(); UI::instance()->theme_changed.connect (sigc::mem_fun(*this, &MeterStrip::on_theme_changed)); ColorsChanged.connect (sigc::mem_fun (*this, &MeterStrip::on_theme_changed)); @@ -100,7 +115,8 @@ MeterStrip::MeterStrip (Session* sess, boost::shared_ptr rt) , _route(rt) , peak_display() { - strip.set_spacing(2); + mtr_vbox.set_spacing(2); + nfo_vbox.set_spacing(2); RouteUI::set_route (rt); SessionHandlePtr::set_session (sess); @@ -173,27 +189,42 @@ MeterStrip::MeterStrip (Session* sess, boost::shared_ptr rt) mutebox.set_size_request(16, 16); solobox.set_size_request(16, 16); recbox.set_size_request(16, 16); + spacer.set_size_request(-1,0); update_button_box(); update_name_box(); update_background (_route->meter_type()); - strip.pack_start (peakbx, false, false); - strip.pack_start (meterbox, true, true); - strip.pack_start (btnbox, false, false); - strip.pack_start (namebx, false, false); + mtr_vbox.pack_start (peakbx, false, false); + mtr_vbox.pack_start (meterbox, true, true); + mtr_vbox.pack_start (spacer, false, false); + mtr_container.add(mtr_vbox); + + mtr_hsep.set_size_request(-1,1); + mtr_hsep.set_name("BlackSeparator"); + + nfo_vbox.pack_start (mtr_hsep, false, false); + nfo_vbox.pack_start (btnbox, false, false); + nfo_vbox.pack_start (namebx, false, false); + + pack_start (mtr_container, true, true); + pack_start (nfo_vbox, false, false); + name_label.show(); peak_display.show(); peakbx.show(); meter_ticks1_area.show(); meter_ticks2_area.show(); meterbox.show(); + spacer.show(); level_meter->show(); meter_align.show(); peak_align.show(); btnbox.show(); - add(strip); - strip.show(); + mtr_vbox.show(); + mtr_container.show(); + mtr_hsep.show(); + nfo_vbox.show(); _route->shared_peak_meter()->ConfigurationChanged.connect ( route_connections, invalidator (*this), boost::bind (&MeterStrip::meter_configuration_changed, this, _1), gui_context() @@ -380,7 +411,7 @@ MeterStrip::meter_configuration_changed (ChanCount c) void MeterStrip::on_size_request (Gtk::Requisition* r) { - EventBox::on_size_request(r); + VBox::on_size_request(r); } void @@ -395,7 +426,7 @@ MeterStrip::on_size_allocate (Gtk::Allocation& a) name_label.set_size_request(18, nh-2); name_label.layout()->set_width((nh-4) * PANGO_SCALE); } - EventBox::on_size_allocate(a); + VBox::on_size_allocate(a); } gint @@ -446,13 +477,13 @@ MeterStrip::update_background(MeterType type) case MeterIEC2EBU: case MeterK14: case MeterK20: - set_name ("meterstripPPM"); + mtr_container.set_name ("meterstripPPM"); break; case MeterVU: - set_name ("meterstripVU"); + mtr_container.set_name ("meterstripVU"); break; default: - set_name ("meterstripDPM"); + mtr_container.set_name ("meterstripDPM"); } } diff --git a/gtk2_ardour/meter_strip.h b/gtk2_ardour/meter_strip.h index 4b5868e9d2..f1fe69bce2 100644 --- a/gtk2_ardour/meter_strip.h +++ b/gtk2_ardour/meter_strip.h @@ -43,7 +43,7 @@ namespace Gtk { class Style; } -class MeterStrip : public Gtk::EventBox, public RouteUI +class MeterStrip : public Gtk::VBox, public RouteUI { public: MeterStrip (ARDOUR::Session*, boost::shared_ptr); @@ -90,8 +90,12 @@ class MeterStrip : public Gtk::EventBox, public RouteUI void set_button_names (); private: - Gtk::VBox strip; + Gtk::VBox mtr_vbox; + Gtk::VBox nfo_vbox; + Gtk::EventBox mtr_container; + Gtk::HSeparator mtr_hsep; Gtk::HBox meterbox; + Gtk::HBox spacer; Gtk::HBox namebx; ArdourButton name_label; Gtk::DrawingArea meter_metric_area; From fd9c0a63fdaf689f60aa9f434a2bd148cb4fec2f Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 24 Jul 2013 15:26:40 +0200 Subject: [PATCH 103/221] increase meterbridge with if scrollbar is not visible.. --- gtk2_ardour/meterbridge.cc | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/gtk2_ardour/meterbridge.cc b/gtk2_ardour/meterbridge.cc index a2bc047bdb..3042ba1d0e 100644 --- a/gtk2_ardour/meterbridge.cc +++ b/gtk2_ardour/meterbridge.cc @@ -338,9 +338,25 @@ Meterbridge::on_size_request (Gtk::Requisition* r) Gdk::Geometry geom; Gtk::Requisition mr = meterarea.size_request(); + geom.max_width = mr.width + metrics_left.get_width() + metrics_right.get_width(); geom.max_height = max_height; + const Gtk::Scrollbar * hsc = scroller.get_hscrollbar(); + Glib::RefPtr screen = get_screen (); + Gdk::Rectangle monitor_rect; + screen->get_monitor_geometry (0, monitor_rect); + const int scr_w = monitor_rect.get_width() - 44; + + if (cur_max_width < geom.max_width + && cur_max_width < scr_w + && !(scroller.get_hscrollbar_visible() && hsc)) { + int h = r->height; + *r = Gtk::Requisition(); + r->width = geom.max_width; + r->height = h; + } + if (cur_max_width != geom.max_width) { cur_max_width = geom.max_width; geom.height_inc = 16; From 2ca3329c1084451feacd724e5411f06222de9f1b Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 24 Jul 2013 16:15:06 +0200 Subject: [PATCH 104/221] fix display-type of editor-mixer level-meter --- gtk2_ardour/level_meter.cc | 3 ++- gtk2_ardour/level_meter.h | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/gtk2_ardour/level_meter.cc b/gtk2_ardour/level_meter.cc index d57481b701..f0562ea716 100644 --- a/gtk2_ardour/level_meter.cc +++ b/gtk2_ardour/level_meter.cc @@ -361,7 +361,7 @@ LevelMeter::setup_meters (int len, int initial_width, int thin_width) } } } - if (meters[n].width != width || meters[n].length != len || color_changed) { + if (meters[n].width != width || meters[n].length != len || color_changed || meter_type != visible_meter_type) { delete meters[n].meter; meters[n].meter = new FastMeter ((uint32_t) floor (Config->get_meter_hold()), width, FastMeter::Vertical, len, c[0], c[1], c[2], c[3], c[4], @@ -383,6 +383,7 @@ LevelMeter::setup_meters (int len, int initial_width, int thin_width) } show(); color_changed = false; + visible_meter_type = meter_type; } void diff --git a/gtk2_ardour/level_meter.h b/gtk2_ardour/level_meter.h index ead63aa50b..d3fd4f9bbd 100644 --- a/gtk2_ardour/level_meter.h +++ b/gtk2_ardour/level_meter.h @@ -101,6 +101,7 @@ class LevelMeter : public Gtk::HBox, public ARDOUR::SessionHandlePtr std::vector meters; float max_peak; ARDOUR::MeterType meter_type; + ARDOUR::MeterType visible_meter_type; PBD::ScopedConnection _configuration_connection; PBD::ScopedConnection _meter_type_connection; From 33b067c12c93fe3499a6290c8db48517df97c73c Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 24 Jul 2013 15:47:01 +0200 Subject: [PATCH 105/221] increase saturation of meter-shader --- libs/gtkmm2ext/fastmeter.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/libs/gtkmm2ext/fastmeter.cc b/libs/gtkmm2ext/fastmeter.cc index 282b9e10b8..bac0ba0c92 100644 --- a/libs/gtkmm2ext/fastmeter.cc +++ b/libs/gtkmm2ext/fastmeter.cc @@ -182,8 +182,9 @@ FastMeter::generate_meter_pattern ( if ((styleflags & 1) && !no_rgba_overlay) { cairo_pattern_t* shade_pattern = cairo_pattern_create_linear (0.0, 0.0, width, 0.0); - cairo_pattern_add_color_stop_rgba (shade_pattern, 0, 1.0, 1.0, 1.0, 0.2); - cairo_pattern_add_color_stop_rgba (shade_pattern, 1, 0.0, 0.0, 0.0, 0.3); + cairo_pattern_add_color_stop_rgba (shade_pattern, 0, 0.0, 0.0, 0.0, 0.15); + cairo_pattern_add_color_stop_rgba (shade_pattern, 0.4, 1.0, 1.0, 1.0, 0.05); + cairo_pattern_add_color_stop_rgba (shade_pattern, 1, 0.0, 0.0, 0.0, 0.25); cairo_surface_t* surface; cairo_t* tc = 0; @@ -196,7 +197,7 @@ FastMeter::generate_meter_pattern ( if (styleflags & 2) { // LED stripes cairo_save (tc); cairo_set_line_width(tc, 1.0); - cairo_set_source_rgba(tc, .1, .1, .1, .5); + cairo_set_source_rgba(tc, .0, .0, .0, .3); //cairo_set_operator (tc, CAIRO_OPERATOR_SOURCE); for (float y=.5; y < height; y+= 2.0) { cairo_move_to(tc, 0, y); From 6981e4d68e6f0bcb49a5f1d1518257283dbbaaeb Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 24 Jul 2013 16:14:27 +0200 Subject: [PATCH 106/221] revert VU meter background to default gray-shade --- gtk2_ardour/level_meter.cc | 2 -- 1 file changed, 2 deletions(-) diff --git a/gtk2_ardour/level_meter.cc b/gtk2_ardour/level_meter.cc index f0562ea716..05f7569925 100644 --- a/gtk2_ardour/level_meter.cc +++ b/gtk2_ardour/level_meter.cc @@ -336,8 +336,6 @@ LevelMeter::setup_meters (int len, int initial_width, int thin_width) stp[1] = 115.0 * meter_deflect_vu(-23); // -3 stp[2] = 115.0 * meter_deflect_vu(-20); // 0 stp[3] = 115.0 * meter_deflect_vu(-18); // +2 - b[0] = 0x80806dff; - b[1] = 0xc0c0a3ff; styleflags = 1; break; default: // PEAK, RMS From b70057f5769bcb52ddd3072282d419d38b829a45 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 24 Jul 2013 22:04:46 +0200 Subject: [PATCH 107/221] add [master] meter to the toolbar http://tracker.ardour.org/view.php?id=5601 --- gtk2_ardour/ardour_ui.cc | 31 +++++++++++++++++++++++++++++++ gtk2_ardour/ardour_ui.h | 7 +++++++ gtk2_ardour/ardour_ui2.cc | 1 + gtk2_ardour/ardour_ui_dialogs.cc | 27 +++++++++++++++++++++++++++ 4 files changed, 66 insertions(+) diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 556dee99fe..6a000d2981 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -181,6 +181,8 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir) , solo_alert_button (_("solo")) , feedback_alert_button (_("feedback")) + , editor_meter(0) + , speaker_config_window (X_("speaker-config"), _("Speaker Configuration")) , theme_manager (X_("theme-manager"), _("Theme Manager")) , key_editor (X_("key-editor"), _("Key Bindings")) @@ -1033,6 +1035,9 @@ ARDOUR_UI::every_point_zero_something_seconds () // august 2007: actual update frequency: 25Hz (40ms), not 100Hz SuperRapidScreenUpdate(); /* EMIT_SIGNAL */ + if (editor_meter) { + editor_meter->update_meters(); + } return TRUE; } @@ -4114,3 +4119,29 @@ ARDOUR_UI::session_format_mismatch (std::string xml_path, std::string backup_pat msg.run (); } + + +void +ARDOUR_UI::reset_peak_display () +{ + if (!_session || !_session->master_out() || !editor_meter) return; + editor_meter->clear_meters(); +} + +void +ARDOUR_UI::reset_group_peak_display (RouteGroup* group) +{ + if (!_session || !_session->master_out()) return; + if (group == _session->master_out()->route_group()) { + reset_peak_display (); + } +} + +void +ARDOUR_UI::reset_route_peak_display (Route* route) +{ + if (!_session || !_session->master_out()) return; + if (_session->master_out().get() == route) { + reset_peak_display (); + } +} diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index 5817293b29..5feb18a2a1 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -104,6 +104,7 @@ class SpeakerDialog; class ThemeManager; class TimeInfoBox; class MidiTracer; +class LevelMeter; class GlobalPortMatrixWindow; class GUIObjectState; @@ -281,6 +282,10 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr void get_process_buffers (); void drop_process_buffers (); + void reset_peak_display (); + void reset_route_peak_display (ARDOUR::Route*); + void reset_group_peak_display (ARDOUR::RouteGroup*); + const std::string& announce_string() const { return _announce_string; } protected: @@ -444,6 +449,8 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr ArdourButton feedback_alert_button; Gtk::VBox alert_box; + Gtk::VBox meter_box; + LevelMeter * editor_meter; void solo_blink (bool); void sync_blink (bool); diff --git a/gtk2_ardour/ardour_ui2.cc b/gtk2_ardour/ardour_ui2.cc index 50affa6c96..d9ff245b67 100644 --- a/gtk2_ardour/ardour_ui2.cc +++ b/gtk2_ardour/ardour_ui2.cc @@ -417,6 +417,7 @@ ARDOUR_UI::setup_transport () transport_tearoff_hbox.pack_start (_editor_transport_box, false, false); } transport_tearoff_hbox.pack_start (alert_box, false, false); + transport_tearoff_hbox.pack_start (meter_box, false, false); if (Profile->get_sae()) { Image* img = manage (new Image ((::get_icon (X_("sae"))))); diff --git a/gtk2_ardour/ardour_ui_dialogs.cc b/gtk2_ardour/ardour_ui_dialogs.cc index 8c78d6494d..26cde95444 100644 --- a/gtk2_ardour/ardour_ui_dialogs.cc +++ b/gtk2_ardour/ardour_ui_dialogs.cc @@ -39,6 +39,7 @@ #include "keyeditor.h" #include "location_ui.h" #include "main_clock.h" +#include "meter_patterns.h" #include "midi_tracer.h" #include "mixer_ui.h" #include "public_editor.h" @@ -186,6 +187,26 @@ ARDOUR_UI::set_session (Session *s) point_zero_something_second_connection = Glib::signal_timeout().connect (sigc::mem_fun(*this, &ARDOUR_UI::every_point_zero_something_seconds), 40); update_format (); + + if (editor_meter) { + meter_box.remove(*editor_meter); + delete editor_meter; + editor_meter = 0; + } + + if (_session && _session->master_out()) { + editor_meter = new LevelMeter(_session); + editor_meter->set_meter (_session->master_out()->shared_peak_meter().get()); + editor_meter->clear_meters(); + editor_meter->set_type (_session->master_out()->meter_type()); + editor_meter->setup_meters (30, 12, 6); + meter_box.pack_start(*editor_meter); + + ArdourMeter::ResetAllPeakDisplays.connect (sigc::mem_fun(*this, &ARDOUR_UI::reset_peak_display)); + ArdourMeter::ResetRoutePeakDisplays.connect (sigc::mem_fun(*this, &ARDOUR_UI::reset_route_peak_display)); + ArdourMeter::ResetGroupPeakDisplays.connect (sigc::mem_fun(*this, &ARDOUR_UI::reset_group_peak_display)); + } + } int @@ -225,6 +246,12 @@ ARDOUR_UI::unload_session (bool hide_stuff) point_one_second_connection.disconnect (); point_zero_something_second_connection.disconnect(); + if (editor_meter) { + meter_box.remove(*editor_meter); + delete editor_meter; + editor_meter = 0; + } + ActionManager::set_sensitive (ActionManager::session_sensitive_actions, false); rec_button.set_sensitive (false); From e469ce0961196a3075c391b2256c84e6042c1e2a Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 24 Jul 2013 22:05:24 +0200 Subject: [PATCH 108/221] get meter color from gtkrc style file --- gtk2_ardour/meter_patterns.cc | 28 ++++++++++++++++----- gtk2_ardour/utils.cc | 47 +++++++++++++++++++++++++++++++++++ gtk2_ardour/utils.h | 2 ++ 3 files changed, 71 insertions(+), 6 deletions(-) diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index 4cd96f2433..0182cc3e89 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -200,10 +200,14 @@ static inline float mtr_col_and_fract( } static void set_bg_color(Gtk::Widget& w, cairo_t* cr, MeterType type) { - // TODO use "meterstrip*" stype + float r,g,b; switch(type) { case MeterVU: - cairo_set_source_rgb (cr, 1.0, 1.0, 0.85); + if (rgba_p_from_style("meterstripVU", &r, &g, &b, "bg")) { + cairo_set_source_rgb (cr, r, g, b); + } else { + cairo_set_source_rgb (cr, 1.0, 1.0, 0.85); + } break; case MeterIEC1DIN: case MeterIEC1NOR: @@ -211,7 +215,11 @@ static void set_bg_color(Gtk::Widget& w, cairo_t* cr, MeterType type) { case MeterIEC2EBU: case MeterK14: case MeterK20: - cairo_set_source_rgb (cr, 0.1, 0.1, 0.1); + if (rgba_p_from_style("meterstripPPM", &r, &g, &b, "bg")) { + cairo_set_source_rgb (cr, r, g, b); + } else { + cairo_set_source_rgb (cr, 0.1, 0.1, 0.1); + } break; default: { @@ -223,13 +231,21 @@ static void set_bg_color(Gtk::Widget& w, cairo_t* cr, MeterType type) { } static void set_fg_color(Gtk::Widget& w, MeterType type, Gdk::Color * c) { - // TODO use "meterstrip*" stype + float r,g,b; switch(type) { case MeterVU: - c->set_rgb_p(0.0, 0.0, 0.0); + if (rgba_p_from_style("meterstripVU", &r, &g, &b)) { + c->set_rgb_p(r, g, b); + } else { + c->set_rgb_p(0.0, 0.0, 0.0); + } break; default: - c->set_rgb_p(1.0, 1.0, 1.0); + if (rgba_p_from_style("meterstripPPM", &r, &g, &b)) { + c->set_rgb_p(r, g, b); + } else { + c->set_rgb_p(1.0, 1.0, 1.0); + } break; } } diff --git a/gtk2_ardour/utils.cc b/gtk2_ardour/utils.cc index d4bc460269..72a922046f 100644 --- a/gtk2_ardour/utils.cc +++ b/gtk2_ardour/utils.cc @@ -301,6 +301,53 @@ rgba_from_style (string style, uint32_t r, uint32_t g, uint32_t b, uint32_t a, s } } +bool +rgba_p_from_style (string style, float *r, float *g, float *b, string attr, int state) +{ + static Gtk::Window* window = 0; + assert (r && g && b); + + if (window == 0) { + window = new Window (WINDOW_TOPLEVEL); + } + + Gtk::EventBox foo; + + window->add (foo); + + foo.set_name (style); + foo.ensure_style (); + + GtkRcStyle* rc = foo.get_style()->gobj()->rc_style; + + if (!rc) { + warning << string_compose (_("missing RGBA style for \"%1\""), style) << endl; + return false; + } + if (attr == "fg") { + *r = rc->fg[state].red / 65535.0; + *g = rc->fg[state].green / 65535.0; + *b = rc->fg[state].blue / 65535.0; + } else if (attr == "bg") { + *r = rc->bg[state].red / 65535.0; + *g = rc->bg[state].green / 65535.0; + *b = rc->bg[state].blue / 65535.0; + } else if (attr == "base") { + *r = rc->base[state].red / 65535.0; + *g = rc->base[state].green / 65535.0; + *b = rc->base[state].blue / 65535.0; + } else if (attr == "text") { + *r = rc->text[state].red / 65535.0; + *g = rc->text[state].green / 65535.0; + *b = rc->text[state].blue / 65535.0; + } else { + return false; + } + + window->remove (); + return true; +} + bool canvas_item_visible (ArdourCanvas::Item* item) { diff --git a/gtk2_ardour/utils.h b/gtk2_ardour/utils.h index d3110104fb..5d7bf000ea 100644 --- a/gtk2_ardour/utils.h +++ b/gtk2_ardour/utils.h @@ -56,6 +56,8 @@ Pango::FontDescription get_font_for_style (std::string widgetname); uint32_t rgba_from_style (std::string, uint32_t, uint32_t, uint32_t, uint32_t, std::string = "fg", int = Gtk::STATE_NORMAL, bool = true); +bool rgba_p_from_style (std::string, float*, float*, float*, std::string = "fg", int = Gtk::STATE_NORMAL); + void decorate (Gtk::Window& w, Gdk::WMDecoration d); bool canvas_item_visible (ArdourCanvas::Item* item); From a9975f44a518dd978234d6e067943dbc84a4ac21 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 24 Jul 2013 22:29:46 +0200 Subject: [PATCH 109/221] reduce brightness of VU meter backplate & increase contrast of peak-label --- gtk2_ardour/ardour3_styles.rc.in | 2 +- gtk2_ardour/ardour3_ui_default.conf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gtk2_ardour/ardour3_styles.rc.in b/gtk2_ardour/ardour3_styles.rc.in index 7a432f06dd..42f22c5059 100644 --- a/gtk2_ardour/ardour3_styles.rc.in +++ b/gtk2_ardour/ardour3_styles.rc.in @@ -1003,7 +1003,7 @@ style "meter_strip_ppm" = "default" style "meter_strip_vu" = "default" { - bg[NORMAL] = { 1.0, 1.0, 0.85 } + bg[NORMAL] = { .95, .88, .57 } fg[NORMAL] = { 0.0, 0.0, 0.0 } } diff --git a/gtk2_ardour/ardour3_ui_default.conf b/gtk2_ardour/ardour3_ui_default.conf index 372cab8a16..6331198dca 100644 --- a/gtk2_ardour/ardour3_ui_default.conf +++ b/gtk2_ardour/ardour3_ui_default.conf @@ -221,7 +221,7 @@