diff options
Diffstat (limited to 'libs/ardour')
371 files changed, 15218 insertions, 7397 deletions
diff --git a/libs/ardour/MSVClibardour/ardour.vcproj b/libs/ardour/MSVClibardour/ardour.vcproj new file mode 100644 index 0000000000..9bc6600a7a --- /dev/null +++ b/libs/ardour/MSVClibardour/ardour.vcproj @@ -0,0 +1,2228 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="8.00" + Name="ardour" + ProjectGUID="{0EFCF4A5-C3F8-46DA-B826-2D80E5A9A210}" + RootNamespace="ardour" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug 32|Win32" + OutputDirectory="$(ProjectDir)\$(ConfigurationName)\bin" + IntermediateDirectory="$(ProjectDir)\$(ConfigurationName)\obj\$(ProjectName)" + ConfigurationType="2" + InheritedPropertySheets="..\..\..\MSVCMixbus3\MSVCMixbus3.vsprops" + CharacterSet="2" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h" + Optimization="0" + AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;"..\..\midi++2";..\..\audiographer;"$(GenericIncludeFolder)\taglib";"$(GenericIncludeFolder)\taglib\toolkit";"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0"" + PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;DEBUGGABLE_BACKENDS;BUILDING_LIBARDOUR;LIBARDOUR_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;ENABLE_NLS;PACKAGE="\"ardour3\"";PROGRAM_NAME="\"Mixbus\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_NEW_LILV=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001" + MinimalRebuild="true" + RuntimeLibrary="3" + WarningLevel="3" + DebugInformationFormat="3" + CompileAs="2" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="libfftw3-3.lib libfftw3f-3.lib libfftw3l-3.lib libeay32.lib iconvD.lib zlib1D.lib boost-regex32D.lib $(DllPrefix)atkmm32-2.0-0D.lib $(DllPrefix)gtkmm32-2.0-0D.lib $(DllPrefix)gdkmm32-2.0-0D.lib $(DllPrefix)glibmm32-2.4-0D.lib $(DllPrefix)giomm32-2.4-0D.lib $(DllPrefix)cairomm32-2.0-0D.lib $(DllPrefix)pangomm32-2.0-0D.lib pthreadVCE2.lib $(DllPrefix)pango32-1.0-0D.lib $(DllPrefix)pangoft232-1.0-0D.lib $(DllPrefix)pangowin32-1.0-0D.lib $(DllPrefix)pangocairo32-1.0-0D.lib $(DllPrefix)cairo32-2D.lib $(DllPrefix)atk32-2.0-0D.lib $(DllPrefix)gthread32-2.0-0D.lib $(DllPrefix)gobject32-2.0-0D.lib $(DllPrefix)gmodule32-2.0-0D.lib $(DllPrefix)glib32-2.0-0D.lib $(DllPrefix)gio32-2.0-0D.lib $(DllPrefix)gtk32-2.0-0D.lib $(DllPrefix)gdk32-2.0-0D.lib $(DllPrefix)gdk-pixbuf32-2.0-0D.lib $(DllPrefix)sigc++32-2.0D.lib $(DllPrefix)curlD.lib $(DllPrefix)fontconfigD.lib $(DllPrefix)timecode32D.lib $(DllPrefix)taglib32D.lib freetype32-2D.lib raptor2D.lib lrdfD.lib libloD.lib rubberbandD.lib $(DllPrefix)ltcD.lib $(DllPrefix)audiographer32D.lib $(DllPrefix)pbd32D.lib $(DllPrefix)midi++32D.lib $(DllPrefix)evoral32D.lib $(DllPrefix)sndfile-1D.lib $(DllPrefix)samplerate-0D.lib vampsdkD.lib vamphostsdkD.lib lilv-0D.lib suil-0D.lib serd-0D.lib sord-0D.lib sratom-0D.lib libart_lgpl_2D.lib libjackD.lib libxml2D.lib intlD.lib shell32.lib psapi.lib ws2_32.lib winmm.lib" + OutputFile="$(OutDir)\$(DllPrefix)$(ProjectName)32D.dll" + AdditionalLibraryDirectories="F:\pthread-win32\Pre-built.2\lib" + IgnoreDefaultLibraryNames="libboost_regex-vc80-mt-gd-1_40.lib;msvcrt.lib;dsound.lib" + GenerateDebugInformation="true" + SubSystem="2" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + UseFAT32Workaround="true" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCWebDeploymentTool" + /> + <Tool + Name="VCPostBuildEventTool" + CommandLine="copy /Y "$(OutDir)\$(TargetName).dll" "$(Debug32TargetFolder)\$(TargetName).dll"
copy /Y "$(OutDir)\$(TargetName).dll" "$(Debug32TestSuiteFolder)\$(TargetName).dll"
copy /Y "$(OutDir)\$(TargetName).lib" "$(GenericWin32LibraryFolder)\$(TargetName).lib"
" + /> + </Configuration> + <Configuration + Name="Release 32|Win32" + OutputDirectory="$(ProjectDir)\$(ConfigurationName)\bin" + IntermediateDirectory="$(ProjectDir)\$(ConfigurationName)\obj\$(ProjectName)" + ConfigurationType="2" + InheritedPropertySheets="..\..\..\MSVCMixbus3\MSVCMixbus3.vsprops" + CharacterSet="2" + WholeProgramOptimization="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h" + Optimization="2" + InlineFunctionExpansion="1" + AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;"..\..\midi++2";..\..\audiographer;"$(GenericIncludeFolder)\taglib";"$(GenericIncludeFolder)\taglib\toolkit";"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0"" + PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;_SECURE_SCL=0;BUILDING_LIBARDOUR;LIBARDOUR_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;ENABLE_NLS;PACKAGE="\"ardour3\"";PROGRAM_NAME="\"Mixbus\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_NEW_LILV=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001" + StringPooling="false" + RuntimeLibrary="2" + EnableEnhancedInstructionSet="1" + WarningLevel="3" + CompileAs="2" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="libfftw3-3.lib libfftw3f-3.lib libfftw3l-3.lib libeay32.lib iconv.lib zlib1.lib boost-regex32.lib $(DllPrefix)atkmm32-2.0-0.lib $(DllPrefix)gtkmm32-2.0-0.lib $(DllPrefix)gdkmm32-2.0-0.lib $(DllPrefix)glibmm32-2.4-0.lib $(DllPrefix)giomm32-2.4-0.lib $(DllPrefix)cairomm32-2.0-0.lib $(DllPrefix)pangomm32-2.0-0.lib pthreadVCE2.lib $(DllPrefix)pango32-1.0-0.lib $(DllPrefix)pangoft232-1.0-0.lib $(DllPrefix)pangowin32-1.0-0.lib $(DllPrefix)pangocairo32-1.0-0.lib $(DllPrefix)cairo32-2.lib $(DllPrefix)atk32-2.0-0.lib $(DllPrefix)gthread32-2.0-0.lib $(DllPrefix)gobject32-2.0-0.lib $(DllPrefix)gmodule32-2.0-0.lib $(DllPrefix)glib32-2.0-0.lib $(DllPrefix)gio32-2.0-0.lib $(DllPrefix)gtk32-2.0-0.lib $(DllPrefix)gdk32-2.0-0.lib $(DllPrefix)gdk-pixbuf32-2.0-0.lib $(DllPrefix)sigc++32-2.0.lib $(DllPrefix)curl.lib $(DllPrefix)fontconfig.lib $(DllPrefix)timecode32.lib $(DllPrefix)taglib32.lib freetype32-2.lib raptor2.lib lrdf.lib liblo.lib rubberband.lib $(DllPrefix)ltc.lib $(DllPrefix)audiographer32.lib $(DllPrefix)pbd32.lib $(DllPrefix)midi++32.lib $(DllPrefix)evoral32.lib $(DllPrefix)sndfile-1.lib $(DllPrefix)samplerate-0.lib vampsdk.lib vamphostsdk.lib lilv-0.lib suil-0.lib serd-0.lib sord-0.lib sratom-0.lib libart_lgpl_2.lib libjack.lib libxml2.lib intl.lib shell32.lib psapi.lib ws2_32.lib winmm.lib" + OutputFile="$(OutDir)\$(DllPrefix)$(ProjectName)32.dll" + AdditionalLibraryDirectories="F:\pthread-win32\Pre-built.2\lib" + IgnoreDefaultLibraryNames="libboost_regex-vc80-mt-gd-1_40.lib;dsound.lib" + SubSystem="2" + OptimizeReferences="2" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + UseFAT32Workaround="true" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCWebDeploymentTool" + /> + <Tool + Name="VCPostBuildEventTool" + CommandLine="copy /Y "$(OutDir)\$(TargetName).dll" "$(Release32TargetFolder)\$(TargetName).dll"
copy /Y "$(OutDir)\$(TargetName).dll" "$(Release32TestSuiteFolder)\$(TargetName).dll"
copy /Y "$(OutDir)\$(TargetName).lib" "$(GenericWin32LibraryFolder)\$(TargetName).lib"
" + /> + </Configuration> + <Configuration + Name="Release 32 with Debugging Capability|Win32" + OutputDirectory="$(ProjectDir)\$(ConfigurationName)\bin" + IntermediateDirectory="$(ProjectDir)\$(ConfigurationName)\obj\$(ProjectName)" + ConfigurationType="2" + InheritedPropertySheets="..\..\..\MSVCMixbus3\MSVCMixbus3.vsprops" + CharacterSet="2" + WholeProgramOptimization="0" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h" + Optimization="0" + AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;"..\..\midi++2";..\..\audiographer;"$(GenericIncludeFolder)\taglib";"$(GenericIncludeFolder)\taglib\toolkit";"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0"" + PreprocessorDefinitions="PLATFORM_WINDOWS;DEBUGGABLE_BACKENDS;COMPILER_MSVC;_SECURE_SCL=0;BUILDING_LIBARDOUR;LIBARDOUR_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;ENABLE_NLS;PACKAGE="\"ardour3\"";PROGRAM_NAME="\"Mixbus\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_NEW_LILV=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001" + StringPooling="false" + RuntimeLibrary="2" + EnableEnhancedInstructionSet="1" + WarningLevel="3" + DebugInformationFormat="3" + CompileAs="2" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="libfftw3-3.lib libfftw3f-3.lib libfftw3l-3.lib libeay32.lib iconvRDC.lib zlib1RDC.lib boost-regex32RDC.lib $(DllPrefix)atkmm32-2.0-0RDC.lib $(DllPrefix)gtkmm32-2.0-0RDC.lib $(DllPrefix)gdkmm32-2.0-0RDC.lib $(DllPrefix)glibmm32-2.4-0RDC.lib $(DllPrefix)giomm32-2.4-0RDC.lib $(DllPrefix)cairomm32-2.0-0RDC.lib $(DllPrefix)pangomm32-2.0-0RDC.lib pthreadVCE2.lib $(DllPrefix)pango32-1.0-0RDC.lib $(DllPrefix)pangoft232-1.0-0RDC.lib $(DllPrefix)pangowin32-1.0-0RDC.lib $(DllPrefix)pangocairo32-1.0-0RDC.lib $(DllPrefix)cairo32-2RDC.lib $(DllPrefix)atk32-2.0-0RDC.lib $(DllPrefix)gthread32-2.0-0RDC.lib $(DllPrefix)gobject32-2.0-0RDC.lib $(DllPrefix)gmodule32-2.0-0RDC.lib $(DllPrefix)glib32-2.0-0RDC.lib $(DllPrefix)gio32-2.0-0RDC.lib $(DllPrefix)gtk32-2.0-0RDC.lib $(DllPrefix)gdk32-2.0-0RDC.lib $(DllPrefix)gdk-pixbuf32-2.0-0RDC.lib $(DllPrefix)sigc++32-2.0RDC.lib $(DllPrefix)curlRDC.lib $(DllPrefix)fontconfigRDC.lib $(DllPrefix)timecode32RDC.lib $(DllPrefix)taglib32RDC.lib freetype32-2RDC.lib raptor2.lib lrdf.lib libloRDC.lib rubberbandRDC.lib $(DllPrefix)ltcRDC.lib $(DllPrefix)audiographer32RDC.lib $(DllPrefix)pbd32RDC.lib $(DllPrefix)midi++32RDC.lib $(DllPrefix)evoral32RDC.lib $(DllPrefix)sndfile-1.lib $(DllPrefix)samplerate-0.lib vampsdkRDC.lib vamphostsdkRDC.lib lilv-0RDC.lib suil-0RDC.lib serd-0RDC.lib sord-0RDC.lib sratom-0RDC.lib libart_lgpl_2.lib libjack.lib libxml2.lib intlRDC.lib shell32.lib psapi.lib ws2_32.lib winmm.lib" + OutputFile="$(OutDir)\$(DllPrefix)$(ProjectName)32RDC.dll" + AdditionalLibraryDirectories="F:\pthread-win32\Pre-built.2\lib" + IgnoreDefaultLibraryNames="libboost_regex-vc80-mt-gd-1_40.lib;dsound.lib" + GenerateDebugInformation="true" + SubSystem="2" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + UseFAT32Workaround="true" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCWebDeploymentTool" + /> + <Tool + Name="VCPostBuildEventTool" + CommandLine="copy /Y "$(OutDir)\$(TargetName).dll" "$(Release32TestSuiteFolder)\$(TargetName).dll"
copy /Y "$(OutDir)\$(TargetName).lib" "$(GenericWin32LibraryFolder)\$(TargetName).lib"
" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" + UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" + > + <File + RelativePath="..\amp.cc" + > + <FileConfiguration + Name="Release 32 with Debugging Capability|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\analyser.cc" + > + </File> + <File + RelativePath="..\async_midi_port.cc" + > + </File> + <File + RelativePath="..\audio_buffer.cc" + > + </File> + <File + RelativePath="..\audio_diskstream.cc" + > + </File> + <File + RelativePath="..\audio_library.cc" + > + </File> + <File + RelativePath="..\audio_playlist.cc" + > + </File> + <File + RelativePath="..\audio_playlist_importer.cc" + > + </File> + <File + RelativePath="..\audio_playlist_source.cc" + > + </File> + <File + RelativePath="..\audio_port.cc" + > + </File> + <File + RelativePath="..\audio_region_importer.cc" + > + </File> + <File + RelativePath="..\audio_track.cc" + > + </File> + <File + RelativePath="..\audio_track_importer.cc" + > + </File> + <File + RelativePath="..\audioanalyser.cc" + > + </File> + <File + RelativePath="..\audioengine.cc" + > + </File> + <File + RelativePath="..\audiofile_tagger.cc" + > + </File> + <File + RelativePath="..\audiofilesource.cc" + > + </File> + <File + RelativePath="..\audioregion.cc" + > + </File> + <File + RelativePath="..\audiosource.cc" + > + </File> + <File + RelativePath="..\auditioner.cc" + > + </File> + <File + RelativePath="..\automatable.cc" + > + </File> + <File + RelativePath="..\automation.cc" + > + </File> + <File + RelativePath="..\automation_control.cc" + > + </File> + <File + RelativePath="..\automation_list.cc" + > + </File> + <File + RelativePath="..\automation_watch.cc" + > + </File> + <File + RelativePath="..\beats_frames_converter.cc" + > + </File> + <File + RelativePath="..\broadcast_info.cc" + > + </File> + <File + RelativePath="..\buffer.cc" + > + </File> + <File + RelativePath="..\buffer_manager.cc" + > + </File> + <File + RelativePath="..\buffer_set.cc" + > + </File> + <File + RelativePath="..\bundle.cc" + > + </File> + <File + RelativePath="..\butler.cc" + > + </File> + <File + RelativePath="..\capturing_processor.cc" + > + </File> + <File + RelativePath="..\chan_count.cc" + > + </File> + <File + RelativePath="..\chan_mapping.cc" + > + </File> + <File + RelativePath="..\config_text.cc" + > + </File> + <File + RelativePath="..\configuration.cc" + > + </File> + <File + RelativePath="..\control_protocol_manager.cc" + > + </File> + <File + RelativePath="..\cycle_timer.cc" + > + </File> + <File + RelativePath="..\data_type.cc" + > + </File> + <File + RelativePath="..\debug.cc" + > + </File> + <File + RelativePath="..\default_click.cc" + > + </File> + <File + RelativePath="..\delayline.cc" + > + </File> + <File + RelativePath="..\delivery.cc" + > + </File> + <File + RelativePath="..\directory_names.cc" + > + </File> + <File + RelativePath="..\diskstream.cc" + > + </File> + <File + RelativePath="..\element_import_handler.cc" + > + </File> + <File + RelativePath="..\element_importer.cc" + > + </File> + <File + RelativePath="..\engine_slave.cc" + > + </File> + <File + RelativePath="..\enums.cc" + > + </File> + <File + RelativePath="..\event_type_map.cc" + > + </File> + <File + RelativePath="..\export_channel.cc" + > + </File> + <File + RelativePath="..\export_channel_configuration.cc" + > + </File> + <File + RelativePath="..\export_failed.cc" + > + </File> + <File + RelativePath="..\export_filename.cc" + > + </File> + <File + RelativePath="..\export_format_base.cc" + > + </File> + <File + RelativePath="..\export_format_manager.cc" + > + </File> + <File + RelativePath="..\export_format_specification.cc" + > + </File> + <File + RelativePath="..\export_formats.cc" + > + </File> + <File + RelativePath="..\export_graph_builder.cc" + > + </File> + <File + RelativePath="..\export_handler.cc" + > + </File> + <File + RelativePath="..\export_preset.cc" + > + </File> + <File + RelativePath="..\export_profile_manager.cc" + > + </File> + <File + RelativePath="..\export_status.cc" + > + </File> + <File + RelativePath="..\export_timespan.cc" + > + </File> + <File + RelativePath="..\file_source.cc" + > + </File> + <File + RelativePath="..\filename_extensions.cc" + > + </File> + <File + RelativePath="..\filesystem_paths.cc" + > + </File> + <File + RelativePath="..\filter.cc" + > + </File> + <File + RelativePath="..\find_session.cc" + > + </File> + <File + RelativePath="..\globals.cc" + > + </File> + <File + RelativePath="..\graph.cc" + > + </File> + <File + RelativePath="..\graphnode.cc" + > + </File> + <File + RelativePath="..\iec1ppmdsp.cc" + > + </File> + <File + RelativePath="..\iec2ppmdsp.cc" + > + </File> + <File + RelativePath="..\import.cc" + > + </File> + <File + RelativePath="..\instrument_info.cc" + > + </File> + <File + RelativePath="..\internal_return.cc" + > + </File> + <File + RelativePath="..\internal_send.cc" + > + </File> + <File + RelativePath="..\interpolation.cc" + > + </File> + <File + RelativePath="..\io.cc" + > + </File> + <File + RelativePath="..\io_processor.cc" + > + </File> + <File + RelativePath="..\kmeterdsp.cc" + > + </File> + <File + RelativePath="..\ladspa_plugin.cc" + > + </File> + <File + RelativePath="..\location.cc" + > + </File> + <File + RelativePath="..\location_importer.cc" + > + </File> + <File + RelativePath="..\ltc_slave.cc" + > + </File> + <File + RelativePath="..\lv2_evbuf.c" + > + </File> + <File + RelativePath="..\lv2_plugin.cc" + > + </File> + <File + RelativePath="..\meter.cc" + > + </File> + <File + RelativePath="..\midi_automation_list_binder.cc" + > + </File> + <File + RelativePath="..\midi_buffer.cc" + > + </File> + <File + RelativePath="..\midi_clock_slave.cc" + > + </File> + <File + RelativePath="..\midi_diskstream.cc" + > + </File> + <File + RelativePath="..\midi_model.cc" + > + </File> + <File + RelativePath="..\midi_patch_manager.cc" + > + </File> + <File + RelativePath="..\midi_playlist.cc" + > + </File> + <File + RelativePath="..\midi_playlist_source.cc" + > + </File> + <File + RelativePath="..\midi_port.cc" + > + </File> + <File + RelativePath="..\midi_region.cc" + > + </File> + <File + RelativePath="..\midi_ring_buffer.cc" + > + </File> + <File + RelativePath="..\midi_scene_change.cc" + > + </File> + <File + RelativePath="..\midi_scene_changer.cc" + > + </File> + <File + RelativePath="..\midi_source.cc" + > + </File> + <File + RelativePath="..\midi_state_tracker.cc" + > + </File> + <File + RelativePath="..\midi_stretch.cc" + > + </File> + <File + RelativePath="..\midi_track.cc" + > + </File> + <File + RelativePath="..\midi_ui.cc" + > + </File> + <File + RelativePath="..\mididm.cc" + > + </File> + <File + RelativePath="..\midiport_manager.cc" + > + </File> + <File + RelativePath="..\mix.cc" + > + </File> + <File + RelativePath="..\monitor_processor.cc" + > + </File> + <File + RelativePath="..\mtc_slave.cc" + > + </File> + <File + RelativePath="..\mtdm.cc" + > + </File> + <File + RelativePath="..\mute_master.cc" + > + </File> + <File + RelativePath="..\onset_detector.cc" + > + </File> + <File + RelativePath="..\operations.cc" + > + </File> + <File + RelativePath="..\pan_controllable.cc" + > + </File> + <File + RelativePath="..\pannable.cc" + > + </File> + <File + RelativePath="..\panner.cc" + > + </File> + <File + RelativePath="..\panner_manager.cc" + > + </File> + <File + RelativePath="..\panner_shell.cc" + > + </File> + <File + RelativePath="..\pcm_utils.cc" + > + </File> + <File + RelativePath="..\playlist.cc" + > + </File> + <File + RelativePath="..\playlist_factory.cc" + > + </File> + <File + RelativePath="..\playlist_source.cc" + > + </File> + <File + RelativePath="..\plugin.cc" + > + </File> + <File + RelativePath="..\plugin_insert.cc" + > + </File> + <File + RelativePath="..\plugin_manager.cc" + > + </File> + <File + RelativePath="..\port.cc" + > + </File> + <File + RelativePath="..\port_insert.cc" + > + </File> + <File + RelativePath="..\port_manager.cc" + > + </File> + <File + RelativePath="..\port_set.cc" + > + </File> + <File + RelativePath="..\process_thread.cc" + > + </File> + <File + RelativePath="..\processor.cc" + > + </File> + <File + RelativePath="..\progress.cc" + > + </File> + <File + RelativePath="..\quantize.cc" + > + </File> + <File + RelativePath="..\rb_effect.cc" + > + </File> + <File + RelativePath="..\rc_configuration.cc" + > + </File> + <File + RelativePath="..\recent_sessions.cc" + > + </File> + <File + RelativePath="..\region.cc" + > + </File> + <File + RelativePath="..\region_factory.cc" + > + </File> + <File + RelativePath="..\resampled_source.cc" + > + </File> + <File + RelativePath="..\return.cc" + > + </File> + <File + RelativePath="..\reverse.cc" + > + </File> + <File + RelativePath="..\revision.cc" + > + </File> + <File + RelativePath="..\route.cc" + > + </File> + <File + RelativePath="..\route_graph.cc" + > + </File> + <File + RelativePath="..\route_group.cc" + > + </File> + <File + RelativePath="..\route_group_member.cc" + > + </File> + <File + RelativePath="..\scene_change.cc" + > + </File> + <File + RelativePath="..\search_paths.cc" + > + </File> + <File + RelativePath="..\send.cc" + > + </File> + <File + RelativePath="..\session.cc" + > + <FileConfiguration + Name="Release 32|Win32" + > + <Tool + Name="VCCLCompilerTool" + Optimization="0" + WholeProgramOptimization="false" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\session_butler.cc" + > + <FileConfiguration + Name="Release 32|Win32" + > + <Tool + Name="VCCLCompilerTool" + Optimization="0" + WholeProgramOptimization="false" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\session_click.cc" + > + <FileConfiguration + Name="Release 32|Win32" + > + <Tool + Name="VCCLCompilerTool" + Optimization="0" + WholeProgramOptimization="false" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\session_command.cc" + > + <FileConfiguration + Name="Release 32|Win32" + > + <Tool + Name="VCCLCompilerTool" + Optimization="0" + WholeProgramOptimization="false" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\session_configuration.cc" + > + <FileConfiguration + Name="Release 32|Win32" + > + <Tool + Name="VCCLCompilerTool" + Optimization="0" + WholeProgramOptimization="false" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\session_directory.cc" + > + <FileConfiguration + Name="Release 32|Win32" + > + <Tool + Name="VCCLCompilerTool" + Optimization="0" + WholeProgramOptimization="false" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\session_events.cc" + > + <FileConfiguration + Name="Release 32|Win32" + > + <Tool + Name="VCCLCompilerTool" + Optimization="0" + WholeProgramOptimization="false" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\session_export.cc" + > + <FileConfiguration + Name="Release 32|Win32" + > + <Tool + Name="VCCLCompilerTool" + Optimization="0" + WholeProgramOptimization="false" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\session_handle.cc" + > + <FileConfiguration + Name="Release 32|Win32" + > + <Tool + Name="VCCLCompilerTool" + Optimization="0" + WholeProgramOptimization="false" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\session_ltc.cc" + > + <FileConfiguration + Name="Release 32|Win32" + > + <Tool + Name="VCCLCompilerTool" + Optimization="0" + WholeProgramOptimization="false" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\session_metadata.cc" + > + <FileConfiguration + Name="Release 32|Win32" + > + <Tool + Name="VCCLCompilerTool" + Optimization="0" + WholeProgramOptimization="false" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\session_midi.cc" + > + <FileConfiguration + Name="Release 32|Win32" + > + <Tool + Name="VCCLCompilerTool" + Optimization="0" + WholeProgramOptimization="false" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\session_object.cc" + > + <FileConfiguration + Name="Release 32|Win32" + > + <Tool + Name="VCCLCompilerTool" + Optimization="0" + WholeProgramOptimization="false" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\session_playlists.cc" + > + <FileConfiguration + Name="Release 32|Win32" + > + <Tool + Name="VCCLCompilerTool" + Optimization="0" + WholeProgramOptimization="false" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\session_process.cc" + > + <FileConfiguration + Name="Release 32|Win32" + > + <Tool + Name="VCCLCompilerTool" + Optimization="0" + WholeProgramOptimization="false" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\session_rtevents.cc" + > + <FileConfiguration + Name="Release 32|Win32" + > + <Tool + Name="VCCLCompilerTool" + Optimization="0" + WholeProgramOptimization="false" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\session_state.cc" + > + <FileConfiguration + Name="Release 32|Win32" + > + <Tool + Name="VCCLCompilerTool" + Optimization="0" + WholeProgramOptimization="false" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\session_state_utils.cc" + > + <FileConfiguration + Name="Release 32|Win32" + > + <Tool + Name="VCCLCompilerTool" + Optimization="0" + WholeProgramOptimization="false" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\session_time.cc" + > + <FileConfiguration + Name="Release 32|Win32" + > + <Tool + Name="VCCLCompilerTool" + Optimization="0" + WholeProgramOptimization="false" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\session_transport.cc" + > + <FileConfiguration + Name="Release 32|Win32" + > + <Tool + Name="VCCLCompilerTool" + Optimization="0" + WholeProgramOptimization="false" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\session_vst.cc" + > + </File> + <File + RelativePath="..\slave.cc" + > + </File> + <File + RelativePath="..\smf_source.cc" + > + </File> + <File + RelativePath="..\sndfile_helpers.cc" + > + </File> + <File + RelativePath="..\sndfileimportable.cc" + > + </File> + <File + RelativePath="..\sndfilesource.cc" + > + </File> + <File + RelativePath="..\soundcloud_upload.cc" + > + </File> + <File + RelativePath="..\source.cc" + > + </File> + <File + RelativePath="..\source_factory.cc" + > + </File> + <File + RelativePath="..\speakers.cc" + > + </File> + <File + RelativePath="..\srcfilesource.cc" + > + </File> + <File + RelativePath="..\sse_functions_xmm.cc" + > + </File> + <File + RelativePath="..\strip_silence.cc" + > + </File> + <File + RelativePath="..\system_exec.cc" + > + </File> + <File + RelativePath="..\tape_file_matcher.cc" + > + </File> + <File + RelativePath="..\template_utils.cc" + > + </File> + <File + RelativePath="..\tempo.cc" + > + </File> + <File + RelativePath="..\tempo_map_importer.cc" + > + </File> + <File + RelativePath="..\thread_buffers.cc" + > + </File> + <File + RelativePath="..\ticker.cc" + > + </File> + <File + RelativePath="..\track.cc" + > + </File> + <File + RelativePath="..\transient_detector.cc" + > + </File> + <File + RelativePath="..\unknown_processor.cc" + > + </File> + <File + RelativePath="..\uri_map.cc" + > + </File> + <File + RelativePath="..\user_bundle.cc" + > + </File> + <File + RelativePath="..\utils.cc" + > + </File> + <File + RelativePath="..\version.cc" + > + </File> + <File + RelativePath="..\vst_info_file.cc" + > + </File> + <File + RelativePath="..\vst_plugin.cc" + > + </File> + <File + RelativePath="..\..\fst\vstwin.c" + > + </File> + <File + RelativePath="..\vumeterdsp.cc" + > + </File> + <File + RelativePath="..\windows_vst_plugin.cc" + > + </File> + <File + RelativePath="..\worker.cc" + > + </File> + <Filter + Name="msvc" + > + <File + RelativePath="..\msvc\msvc_libardour.cc" + > + </File> + </Filter> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl;inc;xsd" + UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" + > + <File + RelativePath="..\ardour\amp.h" + > + </File> + <File + RelativePath="..\ardour\analyser.h" + > + </File> + <File + RelativePath="..\ardour\ardour.h" + > + </File> + <File + RelativePath="..\ardour\async_midi_port.h" + > + </File> + <File + RelativePath="..\ardour\audio_backend.h" + > + </File> + <File + RelativePath="..\ardour\audio_buffer.h" + > + </File> + <File + RelativePath="..\ardour\audio_diskstream.h" + > + </File> + <File + RelativePath="..\ardour\audio_library.h" + > + </File> + <File + RelativePath="..\ardour\audio_playlist_importer.h" + > + </File> + <File + RelativePath="..\ardour\audio_playlist_source.h" + > + </File> + <File + RelativePath="..\ardour\audio_port.h" + > + </File> + <File + RelativePath="..\ardour\audio_region_importer.h" + > + </File> + <File + RelativePath="..\ardour\audio_track.h" + > + </File> + <File + RelativePath="..\ardour\audio_track_importer.h" + > + </File> + <File + RelativePath="..\ardour\audio_unit.h" + > + </File> + <File + RelativePath="..\ardour\audioanalyser.h" + > + </File> + <File + RelativePath="..\ardour\audioengine.h" + > + </File> + <File + RelativePath="..\ardour\audiofile_tagger.h" + > + </File> + <File + RelativePath="..\ardour\audiofilesource.h" + > + </File> + <File + RelativePath="..\ardour\audioplaylist.h" + > + </File> + <File + RelativePath="..\ardour\audioregion.h" + > + </File> + <File + RelativePath="..\ardour\audiosource.h" + > + </File> + <File + RelativePath="..\ardour\auditioner.h" + > + </File> + <File + RelativePath="..\ardour\auto_bundle.h" + > + </File> + <File + RelativePath="..\ardour\automatable.h" + > + </File> + <File + RelativePath="..\ardour\automatable_sequence.h" + > + </File> + <File + RelativePath="..\ardour\automation_control.h" + > + </File> + <File + RelativePath="..\ardour\automation_list.h" + > + </File> + <File + RelativePath="..\ardour\automation_watch.h" + > + </File> + <File + RelativePath="..\ardour\beats_frames_converter.h" + > + </File> + <File + RelativePath="..\ardour\broadcast_info.h" + > + </File> + <File + RelativePath="..\ardour\buffer.h" + > + </File> + <File + RelativePath="..\ardour\buffer_manager.h" + > + </File> + <File + RelativePath="..\ardour\buffer_set.h" + > + </File> + <File + RelativePath="..\ardour\bundle.h" + > + </File> + <File + RelativePath="..\ardour\butler.h" + > + </File> + <File + RelativePath="..\ardour\caimportable.h" + > + </File> + <File + RelativePath="..\ardour\capturing_processor.h" + > + </File> + <File + RelativePath="..\ardour\chan_count.h" + > + </File> + <File + RelativePath="..\ardour\chan_mapping.h" + > + </File> + <File + RelativePath="..\ardour\click.h" + > + </File> + <File + RelativePath="..\ardour\comparable_shared_ptr.h" + > + </File> + <File + RelativePath="..\ardour\configuration.h" + > + </File> + <File + RelativePath="..\ardour\configuration_variable.h" + > + </File> + <File + RelativePath="..\ardour\control_protocol_manager.h" + > + </File> + <File + RelativePath="..\ardour\coreaudiosource.h" + > + </File> + <File + RelativePath="..\ardour\cycle_timer.h" + > + </File> + <File + RelativePath="..\ardour\cycles.h" + > + </File> + <File + RelativePath="..\ardour\data_type.h" + > + </File> + <File + RelativePath="..\ardour\dB.h" + > + </File> + <File + RelativePath="..\ardour\debug.h" + > + </File> + <File + RelativePath="..\ardour\delayline.h" + > + </File> + <File + RelativePath="..\ardour\delivery.h" + > + </File> + <File + RelativePath="..\ardour\directory_names.h" + > + </File> + <File + RelativePath="..\ardour\diskstream.h" + > + </File> + <File + RelativePath="..\ardour\element_import_handler.h" + > + </File> + <File + RelativePath="..\ardour\element_importer.h" + > + </File> + <File + RelativePath="..\ardour\event_type_map.h" + > + </File> + <File + RelativePath="..\ardour\export_channel.h" + > + </File> + <File + RelativePath="..\ardour\export_channel_configuration.h" + > + </File> + <File + RelativePath="..\ardour\export_failed.h" + > + </File> + <File + RelativePath="..\ardour\export_filename.h" + > + </File> + <File + RelativePath="..\ardour\export_format_base.h" + > + </File> + <File + RelativePath="..\ardour\export_format_compatibility.h" + > + </File> + <File + RelativePath="..\ardour\export_format_manager.h" + > + </File> + <File + RelativePath="..\ardour\export_format_specification.h" + > + </File> + <File + RelativePath="..\ardour\export_formats.h" + > + </File> + <File + RelativePath="..\ardour\export_graph_builder.h" + > + </File> + <File + RelativePath="..\ardour\export_handler.h" + > + </File> + <File + RelativePath="..\ardour\export_multiplication.h" + > + </File> + <File + RelativePath="..\ardour\export_pointers.h" + > + </File> + <File + RelativePath="..\ardour\export_preset.h" + > + </File> + <File + RelativePath="..\ardour\export_profile_manager.h" + > + </File> + <File + RelativePath="..\ardour\export_status.h" + > + </File> + <File + RelativePath="..\ardour\export_timespan.h" + > + </File> + <File + RelativePath="..\ardour\file_source.h" + > + </File> + <File + RelativePath="..\ardour\filename_extensions.h" + > + </File> + <File + RelativePath="..\ardour\filesystem_paths.h" + > + </File> + <File + RelativePath="..\ardour\filter.h" + > + </File> + <File + RelativePath="..\ardour\graph.h" + > + </File> + <File + RelativePath="..\ardour\graphnode.h" + > + </File> + <File + RelativePath="..\ardour\iec1ppmdsp.h" + > + </File> + <File + RelativePath="..\ardour\iec2ppmdsp.h" + > + </File> + <File + RelativePath="..\ardour\import_status.h" + > + </File> + <File + RelativePath="..\ardour\importable_source.h" + > + </File> + <File + RelativePath="..\ardour\instrument_info.h" + > + </File> + <File + RelativePath="..\ardour\internal_return.h" + > + </File> + <File + RelativePath="..\ardour\internal_send.h" + > + </File> + <File + RelativePath="..\ardour\interpolation.h" + > + </File> + <File + RelativePath="..\ardour\interthread_info.h" + > + </File> + <File + RelativePath="..\ardour\io.h" + > + </File> + <File + RelativePath="..\ardour\io_processor.h" + > + </File> + <File + RelativePath="..\ardour\kmeterdsp.h" + > + </File> + <File + RelativePath="..\ardour\ladspa.h" + > + </File> + <File + RelativePath="..\ardour\ladspa_plugin.h" + > + </File> + <File + RelativePath="..\ardour\latent.h" + > + </File> + <File + RelativePath="..\ardour\location.h" + > + </File> + <File + RelativePath="..\ardour\location_importer.h" + > + </File> + <File + RelativePath="..\ardour\logcurve.h" + > + </File> + <File + RelativePath="..\ardour\lv2_plugin.h" + > + </File> + <File + RelativePath="..\ardour\lxvst_plugin.h" + > + </File> + <File + RelativePath="..\ardour\meter.h" + > + </File> + <File + RelativePath="..\ardour\midi_automation_list_binder.h" + > + </File> + <File + RelativePath="..\ardour\midi_buffer.h" + > + </File> + <File + RelativePath="..\ardour\midi_diskstream.h" + > + </File> + <File + RelativePath="..\ardour\midi_model.h" + > + </File> + <File + RelativePath="..\ardour\midi_operator.h" + > + </File> + <File + RelativePath="..\ardour\midi_patch_manager.h" + > + </File> + <File + RelativePath="..\ardour\midi_playlist.h" + > + </File> + <File + RelativePath="..\ardour\midi_playlist_source.h" + > + </File> + <File + RelativePath="..\ardour\midi_port.h" + > + </File> + <File + RelativePath="..\ardour\midi_region.h" + > + </File> + <File + RelativePath="..\ardour\midi_ring_buffer.h" + > + </File> + <File + RelativePath="..\ardour\midi_scene_change.h" + > + </File> + <File + RelativePath="..\ardour\midi_scene_changer.h" + > + </File> + <File + RelativePath="..\ardour\midi_source.h" + > + </File> + <File + RelativePath="..\ardour\midi_state_tracker.h" + > + </File> + <File + RelativePath="..\ardour\midi_stretch.h" + > + </File> + <File + RelativePath="..\ardour\midi_track.h" + > + </File> + <File + RelativePath="..\ardour\midi_ui.h" + > + </File> + <File + RelativePath="..\ardour\mididm.h" + > + </File> + <File + RelativePath="..\ardour\midiport_manager.h" + > + </File> + <File + RelativePath="..\ardour\mix.h" + > + </File> + <File + RelativePath="..\ardour\monitor_processor.h" + > + </File> + <File + RelativePath="..\ardour\movable.h" + > + </File> + <File + RelativePath="..\ardour\msvc_libardour.h" + > + </File> + <File + RelativePath="..\ardour\mtdm.h" + > + </File> + <File + RelativePath="..\ardour\mute_master.h" + > + </File> + <File + RelativePath="..\ardour\noise.h" + > + </File> + <File + RelativePath="..\ardour\onset_detector.h" + > + </File> + <File + RelativePath="..\ardour\operations.h" + > + </File> + <File + RelativePath="..\ardour\pan_controllable.h" + > + </File> + <File + RelativePath="..\ardour\pannable.h" + > + </File> + <File + RelativePath="..\ardour\panner.h" + > + </File> + <File + RelativePath="..\ardour\panner_manager.h" + > + </File> + <File + RelativePath="..\ardour\panner_shell.h" + > + </File> + <File + RelativePath="..\ardour\pcm_utils.h" + > + </File> + <File + RelativePath="..\ardour\peak.h" + > + </File> + <File + RelativePath="..\ardour\pi_controller.h" + > + </File> + <File + RelativePath="..\ardour\pitch.h" + > + </File> + <File + RelativePath="..\ardour\playlist.h" + > + </File> + <File + RelativePath="..\ardour\playlist_factory.h" + > + </File> + <File + RelativePath="..\ardour\playlist_source.h" + > + </File> + <File + RelativePath="..\ardour\plugin.h" + > + </File> + <File + RelativePath="..\ardour\plugin_insert.h" + > + </File> + <File + RelativePath="..\ardour\plugin_manager.h" + > + </File> + <File + RelativePath="..\ardour\plugin_types.h" + > + </File> + <File + RelativePath="..\ardour\port.h" + > + </File> + <File + RelativePath="..\ardour\port_insert.h" + > + </File> + <File + RelativePath="..\ardour\port_set.h" + > + </File> + <File + RelativePath="..\ardour\process_thread.h" + > + </File> + <File + RelativePath="..\ardour\processor.h" + > + </File> + <File + RelativePath="..\ardour\profile.h" + > + </File> + <File + RelativePath="..\ardour\progress.h" + > + </File> + <File + RelativePath="..\ardour\proxy_controllable.h" + > + </File> + <File + RelativePath="..\ardour\public_diskstream.h" + > + </File> + <File + RelativePath="..\ardour\quantize.h" + > + </File> + <File + RelativePath="..\ardour\rb_effect.h" + > + </File> + <File + RelativePath="..\ardour\rc_configuration.h" + > + </File> + <File + RelativePath="..\ardour\rc_configuration_vars.h" + > + </File> + <File + RelativePath="..\ardour\readable.h" + > + </File> + <File + RelativePath="..\ardour\recent_sessions.h" + > + </File> + <File + RelativePath="..\ardour\region.h" + > + </File> + <File + RelativePath="..\ardour\region_factory.h" + > + </File> + <File + RelativePath="..\ardour\region_sorters.h" + > + </File> + <File + RelativePath="..\ardour\resampled_source.h" + > + </File> + <File + RelativePath="..\ardour\return.h" + > + </File> + <File + RelativePath="..\ardour\reverse.h" + > + </File> + <File + RelativePath="..\ardour\revision.h" + > + </File> + <File + RelativePath="..\ardour\route.h" + > + </File> + <File + RelativePath="..\ardour\route_graph.h" + > + </File> + <File + RelativePath="..\ardour\route_group.h" + > + </File> + <File + RelativePath="..\ardour\route_group_member.h" + > + </File> + <File + RelativePath="..\ardour\route_group_specialized.h" + > + </File> + <File + RelativePath="..\ardour\route_sorters.h" + > + </File> + <File + RelativePath="..\ardour\runtime_functions.h" + > + </File> + <File + RelativePath="..\ardour\scene_change.h" + > + </File> + <File + RelativePath="..\ardour\scene_changer.h" + > + </File> + <File + RelativePath="..\ardour\search_paths.h" + > + </File> + <File + RelativePath="..\ardour\send.h" + > + </File> + <File + RelativePath="..\ardour\session.h" + > + </File> + <File + RelativePath="..\ardour\session_configuration.h" + > + </File> + <File + RelativePath="..\ardour\session_configuration_vars.h" + > + </File> + <File + RelativePath="..\ardour\session_directory.h" + > + </File> + <File + RelativePath="..\ardour\session_event.h" + > + </File> + <File + RelativePath="..\ardour\session_handle.h" + > + </File> + <File + RelativePath="..\ardour\session_metadata.h" + > + </File> + <File + RelativePath="..\ardour\session_object.h" + > + </File> + <File + RelativePath="..\ardour\session_playlist.h" + > + </File> + <File + RelativePath="..\ardour\session_playlists.h" + > + </File> + <File + RelativePath="..\ardour\session_route.h" + > + </File> + <File + RelativePath="..\ardour\session_state_utils.h" + > + </File> + <File + RelativePath="..\ardour\session_utils.h" + > + </File> + <File + RelativePath="..\ardour\silentfilesource.h" + > + </File> + <File + RelativePath="..\ardour\slave.h" + > + </File> + <File + RelativePath="..\ardour\smf_source.h" + > + </File> + <File + RelativePath="..\ardour\sndfile_helpers.h" + > + </File> + <File + RelativePath="..\ardour\sndfileimportable.h" + > + </File> + <File + RelativePath="..\ardour\sndfilesource.h" + > + </File> + <File + RelativePath="..\ardour\soundcloud_upload.h" + > + </File> + <File + RelativePath="..\ardour\soundseq.h" + > + </File> + <File + RelativePath="..\ardour\source.h" + > + </File> + <File + RelativePath="..\ardour\source_factory.h" + > + </File> + <File + RelativePath="..\ardour\speaker.h" + > + </File> + <File + RelativePath="..\ardour\speakers.h" + > + </File> + <File + RelativePath="..\ardour\spline.h" + > + </File> + <File + RelativePath="..\ardour\srcfilesource.h" + > + </File> + <File + RelativePath="..\ardour\stretch.h" + > + </File> + <File + RelativePath="..\ardour\strip_silence.h" + > + </File> + <File + RelativePath="..\ardour\system_exec.h" + > + </File> + <File + RelativePath="..\ardour\tape_file_matcher.h" + > + </File> + <File + RelativePath="..\ardour\template_utils.h" + > + </File> + <File + RelativePath="..\ardour\tempo.h" + > + </File> + <File + RelativePath="..\ardour\tempo_map_importer.h" + > + </File> + <File + RelativePath="..\ardour\thread_buffers.h" + > + </File> + <File + RelativePath="..\ardour\ticker.h" + > + </File> + <File + RelativePath="..\ardour\timecode.h" + > + </File> + <File + RelativePath="..\ardour\timefx_request.h" + > + </File> + <File + RelativePath="..\ardour\timestamps.h" + > + </File> + <File + RelativePath="..\ardour\track.h" + > + </File> + <File + RelativePath="..\ardour\transient_detector.h" + > + </File> + <File + RelativePath="..\ardour\trimmable.h" + > + </File> + <File + RelativePath="..\ardour\types.h" + > + </File> + <File + RelativePath="..\ardour\unknown_processor.h" + > + </File> + <File + RelativePath="..\ardour\uri_map.h" + > + </File> + <File + RelativePath="..\ardour\user_bundle.h" + > + </File> + <File + RelativePath="..\ardour\utils.h" + > + </File> + <File + RelativePath="..\ardour\vst_plugin.h" + > + </File> + <File + RelativePath="..\ardour\vst_types.h" + > + </File> + <File + RelativePath="..\ardour\vumeterdsp.h" + > + </File> + <File + RelativePath="..\ardour\windows_vst_plugin.h" + > + </File> + <File + RelativePath="..\ardour\worker.h" + > + </File> + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/libs/ardour/amp.cc b/libs/ardour/amp.cc index 132be2e1c6..29032525f2 100644 --- a/libs/ardour/amp.cc +++ b/libs/ardour/amp.cc @@ -435,7 +435,10 @@ Amp::setup_gain_automation (framepos_t start_frame, framepos_t end_frame, framec { Glib::Threads::Mutex::Lock am (control_lock(), Glib::Threads::TRY_LOCK); - if (am.locked() && _session.transport_rolling() && _gain_control->automation_playback()) { + if (am.locked() + && (_session.transport_rolling() || _session.bounce_processing()) + && _gain_control->automation_playback()) + { assert (_gain_automation_buffer); _apply_gain_automation = _gain_control->list()->curve().rt_safe_get_vector ( start_frame, end_frame, _gain_automation_buffer, nframes); diff --git a/libs/ardour/ardour/amp.h b/libs/ardour/ardour/amp.h index e21cf62d62..f6a15666e9 100644 --- a/libs/ardour/ardour/amp.h +++ b/libs/ardour/ardour/amp.h @@ -19,6 +19,7 @@ #ifndef __ardour_amp_h__ #define __ardour_amp_h__ +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "ardour/chan_count.h" #include "ardour/processor.h" @@ -32,7 +33,7 @@ class IO; /** Applies a declick operation to all audio inputs, passing the same number of * audio outputs, and passing through any other types unchanged. */ -class Amp : public Processor { +class LIBARDOUR_API Amp : public Processor { public: Amp(Session& s); diff --git a/libs/ardour/ardour/analyser.h b/libs/ardour/ardour/analyser.h index 51adea67b9..cef71186cc 100644 --- a/libs/ardour/ardour/analyser.h +++ b/libs/ardour/ardour/analyser.h @@ -23,13 +23,15 @@ #include <glibmm/threads.h> #include <boost/shared_ptr.hpp> +#include "ardour/libardour_visibility.h" + namespace ARDOUR { class AudioFileSource; class Source; class TransientDetector; -class Analyser { +class LIBARDOUR_API Analyser { public: Analyser(); diff --git a/libs/ardour/ardour/ardour.h b/libs/ardour/ardour/ardour.h index 80bdf9d80e..29cfa4b354 100644 --- a/libs/ardour/ardour/ardour.h +++ b/libs/ardour/ardour/ardour.h @@ -34,9 +34,9 @@ #include "pbd/locale_guard.h" #include "pbd/stateful.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" - -#include <jack/jack.h> +#include "ardour/libardour_visibility.h" namespace MIDI { class MachineControl; @@ -47,8 +47,10 @@ namespace ARDOUR { class AudioEngine; - extern PBD::Signal1<void,std::string> BootMessage; - extern PBD::Signal0<void> GUIIdle; + extern LIBARDOUR_API PBD::Signal1<void,std::string> BootMessage; + extern LIBARDOUR_API PBD::Signal3<void,std::string,std::string,bool> PluginScanMessage; + extern LIBARDOUR_API PBD::Signal1<void,int> PluginScanTimeout; + extern LIBARDOUR_API PBD::Signal0<void> GUIIdle; /** * @param with_vst true to enable VST Support @@ -58,27 +60,27 @@ namespace ARDOUR { * * @return true if Ardour library was successfully initialized */ - bool init (bool with_vst, bool try_optimization, const char* localedir); - void init_post_engine (); - void cleanup (); - bool no_auto_connect (); - void make_property_quarks (); - - extern PBD::PropertyChange bounds_change; + LIBARDOUR_API bool init (bool with_vst, bool try_optimization, const char* localedir); + LIBARDOUR_API void init_post_engine (); + LIBARDOUR_API void cleanup (); + LIBARDOUR_API bool no_auto_connect (); + LIBARDOUR_API void make_property_quarks (); - extern const char* const ardour_config_info; + extern LIBARDOUR_API PBD::PropertyChange bounds_change; + + extern LIBARDOUR_API const char* const ardour_config_info; - void find_bindings_files (std::map<std::string,std::string>&); + LIBARDOUR_API void find_bindings_files (std::map<std::string,std::string>&); /* these only impact bundled installations */ - std::string translation_enable_path (); - bool translations_are_enabled (); - bool set_translations_enabled (bool); + LIBARDOUR_API std::string translation_enable_path (); + LIBARDOUR_API bool translations_are_enabled (); + LIBARDOUR_API bool set_translations_enabled (bool); - microseconds_t get_microseconds (); + LIBARDOUR_API microseconds_t get_microseconds (); - void setup_fpu (); - std::vector<SyncSource> get_available_sync_options(); + LIBARDOUR_API void setup_fpu (); + LIBARDOUR_API std::vector<SyncSource> get_available_sync_options(); } #endif /* __ardour_ardour_h__ */ diff --git a/libs/ardour/ardour/async_midi_port.h b/libs/ardour/ardour/async_midi_port.h index 76bdac0409..26946e3016 100644 --- a/libs/ardour/ardour/async_midi_port.h +++ b/libs/ardour/ardour/async_midi_port.h @@ -22,6 +22,8 @@ #include <string> #include <iostream> +#include <boost/function.hpp> + #include "pbd/xml++.h" #include "pbd/crossthread.h" #include "pbd/signals.h" @@ -34,11 +36,12 @@ #include "midi++/parser.h" #include "midi++/port.h" +#include "ardour/libardour_visibility.h" #include "ardour/midi_port.h" namespace ARDOUR { - class AsyncMIDIPort : public ARDOUR::MidiPort, public MIDI::Port { +class LIBARDOUR_API AsyncMIDIPort : public ARDOUR::MidiPort, public MIDI::Port { public: AsyncMIDIPort (std::string const &, PortFlags); @@ -52,10 +55,18 @@ namespace ARDOUR { /* called from non-RT context */ void parse (framecnt_t timestamp); - int write (const MIDI::byte *msg, size_t msglen, MIDI::timestamp_t timestamp); + int write (const MIDI::byte *msg, size_t msglen, MIDI::timestamp_t timestamp); int read (MIDI::byte *buf, size_t bufsize); void drain (int check_interval_usecs); - int selectable () const { return xthread.selectable(); } + int selectable () const { +#ifdef PLATFORM_WINDOWS + return false; +#else + return xthread.selectable(); +#endif + } + + void set_timer (boost::function<framecnt_t (void)>&); static void set_process_thread (pthread_t); static pthread_t get_process_thread () { return _process_thread; } @@ -64,10 +75,26 @@ namespace ARDOUR { private: bool _currently_in_cycle; MIDI::timestamp_t _last_write_timestamp; + bool have_timer; + boost::function<framecnt_t (void)> timer; RingBuffer< Evoral::Event<double> > output_fifo; Evoral::EventRingBuffer<MIDI::timestamp_t> input_fifo; - Glib::Threads::Mutex output_fifo_lock; - CrossThreadChannel xthread; + Glib::Threads::Mutex output_fifo_lock; +#ifndef PLATFORM_WINDOWS + CrossThreadChannel xthread; +#endif + + int create_port (); + + /** Channel used to signal to the MidiControlUI that input has arrived */ + + std::string _connections; + PBD::ScopedConnection connect_connection; + PBD::ScopedConnection halt_connection; + void flush (void* jack_port_buffer); + void jack_halted (); + void make_connections (); + void init (std::string const &, Flags); void flush_output_fifo (pframes_t); diff --git a/libs/ardour/ardour/audio_backend.h b/libs/ardour/ardour/audio_backend.h index 387410685b..bf860e9aeb 100644 --- a/libs/ardour/ardour/audio_backend.h +++ b/libs/ardour/ardour/audio_backend.h @@ -28,25 +28,60 @@ #include <boost/function.hpp> +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "ardour/audioengine.h" #include "ardour/port_engine.h" -#include "ardour/visibility.h" #ifdef ARDOURBACKEND_DLL_EXPORTS // defined if we are building the ARDOUR Panners DLLs (instead of using them) - #define ARDOURBACKEND_API LIBARDOUR_HELPER_DLL_EXPORT + #define ARDOURBACKEND_API LIBARDOUR_DLL_EXPORT #else - #define ARDOURBACKEND_API LIBARDOUR_HELPER_DLL_IMPORT + #define ARDOURBACKEND_API LIBARDOUR_DLL_IMPORT #endif -#define ARDOURBACKEND_LOCAL LIBARDOUR_HELPER_DLL_LOCAL +#define ARDOURBACKEND_LOCAL LIBARDOUR_DLL_LOCAL namespace ARDOUR { -class AudioBackend : public PortEngine { +struct LIBARDOUR_API AudioBackendInfo { + const char* name; + + /** Using arg1 and arg2, initialize this audiobackend. + * + * Returns zero on success, non-zero otherwise. + */ + int (*instantiate) (const std::string& arg1, const std::string& arg2); + + /** Release all resources associated with this audiobackend + */ + int (*deinstantiate) (void); + + /** Factory method to create an AudioBackend-derived class. + * + * Returns a valid shared_ptr to the object if successfull, + * or a "null" shared_ptr otherwise. + */ + boost::shared_ptr<AudioBackend> (*factory) (AudioEngine&); + + /** Return true if the underlying mechanism/API has been + * configured and does not need (re)configuration in order + * to be usable. Return false otherwise. + * + * Note that this may return true if (re)configuration, even though + * not currently required, is still possible. + */ + bool (*already_configured)(); +}; + +class LIBARDOUR_API AudioBackend : public PortEngine { public: - AudioBackend (AudioEngine& e) : PortEngine (e), engine (e) {} + AudioBackend (AudioEngine& e, AudioBackendInfo& i) : PortEngine (e), _info (i), engine (e) {} virtual ~AudioBackend () {} + + /** Return the AudioBackendInfo object from which this backend + was constructed. + */ + AudioBackendInfo& info() const { return _info; } /** Return the name of this backend. * @@ -188,6 +223,9 @@ class AudioBackend : public PortEngine { /** Set the name of the device to be used */ virtual int set_device_name (const std::string&) = 0; + /** Deinitialize and destroy current device + */ + virtual int drop_device() { return 0; }; /** Set the sample rate to be used */ virtual int set_sample_rate (float) = 0; @@ -200,12 +238,6 @@ class AudioBackend : public PortEngine { * doesn't directly expose the concept). */ virtual int set_buffer_size (uint32_t) = 0; - /** Set the preferred underlying hardware sample format - * - * This does not change the sample format (32 bit float) read and - * written to the device via the Port API. - */ - virtual int set_sample_format (SampleFormat) = 0; /** Set the preferred underlying hardware data layout. * If @param yn is true, then the hardware will interleave * samples for successive channels; otherwise, the hardware will store @@ -231,18 +263,27 @@ class AudioBackend : public PortEngine { * external D-A/D-A converters. Units are samples. */ virtual int set_systemic_output_latency (uint32_t) = 0; + /** Set the (additional) input latency for a specific midi device, + * or if the identifier is empty, apply to all midi devices. + */ + virtual int set_systemic_midi_input_latency (std::string const, uint32_t) = 0; + /** Set the (additional) output latency for a specific midi device, + * or if the identifier is empty, apply to all midi devices. + */ + virtual int set_systemic_midi_output_latency (std::string const, uint32_t) = 0; /* Retrieving parameters */ virtual std::string device_name () const = 0; virtual float sample_rate () const = 0; virtual uint32_t buffer_size () const = 0; - virtual SampleFormat sample_format () const = 0; virtual bool interleaved () const = 0; virtual uint32_t input_channels () const = 0; virtual uint32_t output_channels () const = 0; virtual uint32_t systemic_input_latency () const = 0; virtual uint32_t systemic_output_latency () const = 0; + virtual uint32_t systemic_midi_input_latency (std::string const) const = 0; + virtual uint32_t systemic_midi_output_latency (std::string const) const = 0; /** override this if this implementation returns true from * requires_driver_selection() @@ -280,7 +321,19 @@ class AudioBackend : public PortEngine { virtual int set_midi_option (const std::string& option) = 0; virtual std::string midi_option () const = 0; - + + /** Detailed MIDI device list - if available */ + virtual std::vector<DeviceStatus> enumerate_midi_devices () const = 0; + + /** mark a midi-devices as enabled */ + virtual int set_midi_device_enabled (std::string const, bool) = 0; + + /** query if a midi-device is enabled */ + virtual bool midi_device_enabled (std::string const) const = 0; + + /** if backend supports systemic_midi_[in|ou]tput_latency() */ + virtual bool can_set_systemic_midi_latencies () const = 0; + /* State Control */ /** Start using the device named in the most recent call @@ -486,39 +539,10 @@ class AudioBackend : public PortEngine { } protected: - AudioEngine& engine; - - virtual int _start (bool for_latency_measurement) = 0; -}; - -struct AudioBackendInfo { - const char* name; + AudioBackendInfo& _info; + AudioEngine& engine; - /** Using arg1 and arg2, initialize this audiobackend. - * - * Returns zero on success, non-zero otherwise. - */ - int (*instantiate) (const std::string& arg1, const std::string& arg2); - - /** Release all resources associated with this audiobackend - */ - int (*deinstantiate) (void); - - /** Factory method to create an AudioBackend-derived class. - * - * Returns a valid shared_ptr to the object if successfull, - * or a "null" shared_ptr otherwise. - */ - boost::shared_ptr<AudioBackend> (*factory) (AudioEngine&); - - /** Return true if the underlying mechanism/API has been - * configured and does not need (re)configuration in order - * to be usable. Return false otherwise. - * - * Note that this may return true if (re)configuration, even though - * not currently required, is still possible. - */ - bool (*already_configured)(); + virtual int _start (bool for_latency_measurement) = 0; }; } // namespace diff --git a/libs/ardour/ardour/audio_buffer.h b/libs/ardour/ardour/audio_buffer.h index aaad961abb..91f463cc7f 100644 --- a/libs/ardour/ardour/audio_buffer.h +++ b/libs/ardour/ardour/audio_buffer.h @@ -27,7 +27,7 @@ namespace ARDOUR { /** Buffer containing audio data. */ -class AudioBuffer : public Buffer +class LIBARDOUR_API AudioBuffer : public Buffer { public: AudioBuffer(size_t capacity); diff --git a/libs/ardour/ardour/audio_diskstream.h b/libs/ardour/ardour/audio_diskstream.h index 65d7db67ba..2614b8061c 100644 --- a/libs/ardour/ardour/audio_diskstream.h +++ b/libs/ardour/ardour/audio_diskstream.h @@ -53,7 +53,7 @@ class AudioPlaylist; class AudioFileSource; class IO; -class AudioDiskstream : public Diskstream +class LIBARDOUR_API AudioDiskstream : public Diskstream { public: AudioDiskstream (Session &, const std::string& name, Diskstream::Flag f = Recordable); @@ -108,6 +108,7 @@ class AudioDiskstream : public Diskstream int remove_channel (uint32_t how_many); bool set_name (std::string const &); + bool set_write_source_name (const std::string& str); /* stateful */ diff --git a/libs/ardour/ardour/audio_library.h b/libs/ardour/ardour/audio_library.h index 2009ec39a7..6397821720 100644 --- a/libs/ardour/ardour/audio_library.h +++ b/libs/ardour/ardour/audio_library.h @@ -24,9 +24,11 @@ #include <map> #include <vector> +#include "ardour/libardour_visibility.h" + namespace ARDOUR { -class AudioLibrary +class LIBARDOUR_API AudioLibrary { public: AudioLibrary (); @@ -43,7 +45,7 @@ class AudioLibrary std::string src; }; -extern AudioLibrary* Library; +LIBARDOUR_API extern AudioLibrary* Library; } // ARDOUR namespace diff --git a/libs/ardour/ardour/audio_playlist_importer.h b/libs/ardour/ardour/audio_playlist_importer.h index 011bfe39b8..a6d68b9c73 100644 --- a/libs/ardour/ardour/audio_playlist_importer.h +++ b/libs/ardour/ardour/audio_playlist_importer.h @@ -38,7 +38,7 @@ class AudioRegionImporter; class AudioPlaylistImporter; class Session; -class AudioPlaylistImportHandler : public ElementImportHandler +class LIBARDOUR_API AudioPlaylistImportHandler : public ElementImportHandler { public: typedef boost::shared_ptr<AudioPlaylistImporter> PlaylistPtr; @@ -57,7 +57,7 @@ class AudioPlaylistImportHandler : public ElementImportHandler AudioRegionImportHandler & region_handler; }; -class UnusedAudioPlaylistImportHandler : public AudioPlaylistImportHandler +class LIBARDOUR_API UnusedAudioPlaylistImportHandler : public AudioPlaylistImportHandler { public: UnusedAudioPlaylistImportHandler (XMLTree const & source, Session & session, AudioRegionImportHandler & region_handler) : @@ -65,7 +65,7 @@ class UnusedAudioPlaylistImportHandler : public AudioPlaylistImportHandler std::string get_info () const; }; -class AudioPlaylistImporter : public ElementImporter +class LIBARDOUR_API AudioPlaylistImporter : public ElementImporter { public: AudioPlaylistImporter (XMLTree const & source, Session & session, AudioPlaylistImportHandler & handler, XMLNode const & node); diff --git a/libs/ardour/ardour/audio_playlist_source.h b/libs/ardour/ardour/audio_playlist_source.h index c2e1e87f75..6a586fc30d 100644 --- a/libs/ardour/ardour/audio_playlist_source.h +++ b/libs/ardour/ardour/audio_playlist_source.h @@ -32,7 +32,7 @@ namespace ARDOUR { class AudioPlaylist; -class AudioPlaylistSource : public PlaylistSource, public AudioSource { +class LIBARDOUR_API AudioPlaylistSource : public PlaylistSource, public AudioSource { public: virtual ~AudioPlaylistSource (); diff --git a/libs/ardour/ardour/audio_port.h b/libs/ardour/ardour/audio_port.h index f87b134e9e..ca5f183a13 100644 --- a/libs/ardour/ardour/audio_port.h +++ b/libs/ardour/ardour/audio_port.h @@ -26,7 +26,7 @@ namespace ARDOUR { -class AudioPort : public Port +class LIBARDOUR_API AudioPort : public Port { public: ~AudioPort (); diff --git a/libs/ardour/ardour/audio_region_importer.h b/libs/ardour/ardour/audio_region_importer.h index b3bcb05668..d1a965a5ee 100644 --- a/libs/ardour/ardour/audio_region_importer.h +++ b/libs/ardour/ardour/audio_region_importer.h @@ -39,7 +39,7 @@ class Region; class Session; class Source; -class AudioRegionImportHandler : public ElementImportHandler +class LIBARDOUR_API AudioRegionImportHandler : public ElementImportHandler { public: // Inerface implementation @@ -69,7 +69,7 @@ class AudioRegionImportHandler : public ElementImportHandler IdMap id_map; }; -class AudioRegionImporter : public ElementImporter +class LIBARDOUR_API AudioRegionImporter : public ElementImporter { public: AudioRegionImporter (XMLTree const & source, Session & session, AudioRegionImportHandler & handler, XMLNode const & node); diff --git a/libs/ardour/ardour/audio_track.h b/libs/ardour/ardour/audio_track.h index ada58e8ebe..0bc8be81f4 100644 --- a/libs/ardour/ardour/audio_track.h +++ b/libs/ardour/ardour/audio_track.h @@ -31,7 +31,7 @@ class AudioPlaylist; class RouteGroup; class AudioFileSource; -class AudioTrack : public Track +class LIBARDOUR_API AudioTrack : public Track { public: AudioTrack (Session&, std::string name, Route::Flag f = Route::Flag (0), TrackMode m = Normal); @@ -58,7 +58,7 @@ class AudioTrack : public Track boost::shared_ptr<Region> bounce_range (framepos_t start, framepos_t end, InterThreadInfo&, boost::shared_ptr<Processor> endpoint, bool include_endpoint); int export_stuff (BufferSet& bufs, framepos_t start_frame, framecnt_t nframes, - boost::shared_ptr<Processor> endpoint, bool include_endpoint, bool for_export); + boost::shared_ptr<Processor> endpoint, bool include_endpoint, bool for_export, bool for_freeze); int set_state (const XMLNode&, int version); diff --git a/libs/ardour/ardour/audio_track_importer.h b/libs/ardour/ardour/audio_track_importer.h index 683417de24..58789177e3 100644 --- a/libs/ardour/ardour/audio_track_importer.h +++ b/libs/ardour/ardour/audio_track_importer.h @@ -34,7 +34,7 @@ namespace ARDOUR { class AudioPlaylistImportHandler; class AudioPlaylistImporter; -class AudioTrackImportHandler : public ElementImportHandler +class LIBARDOUR_API AudioTrackImportHandler : public ElementImportHandler { public: AudioTrackImportHandler (XMLTree const & source, Session & session, AudioPlaylistImportHandler & pl_handler); @@ -46,7 +46,7 @@ class AudioTrackImportHandler : public ElementImportHandler }; -class AudioTrackImporter : public ElementImporter +class LIBARDOUR_API AudioTrackImporter : public ElementImporter { public: AudioTrackImporter (XMLTree const & source, diff --git a/libs/ardour/ardour/audio_unit.h b/libs/ardour/ardour/audio_unit.h index 007390b34a..8233e208d3 100644 --- a/libs/ardour/ardour/audio_unit.h +++ b/libs/ardour/ardour/audio_unit.h @@ -48,7 +48,7 @@ namespace ARDOUR { class AudioEngine; class Session; -struct AUParameterDescriptor : public Plugin::ParameterDescriptor { +struct LIBARDOUR_API AUParameterDescriptor : public Plugin::ParameterDescriptor { // additional fields to make operations more efficient AudioUnitParameterID id; AudioUnitScope scope; @@ -58,7 +58,7 @@ struct AUParameterDescriptor : public Plugin::ParameterDescriptor { AudioUnitParameterUnit unit; }; -class AUPlugin : public ARDOUR::Plugin +class LIBARDOUR_API AUPlugin : public ARDOUR::Plugin { public: AUPlugin (AudioEngine& engine, Session& session, boost::shared_ptr<CAComponent> comp); @@ -221,11 +221,11 @@ class AUPlugin : public ARDOUR::Plugin typedef boost::shared_ptr<AUPlugin> AUPluginPtr; -struct AUPluginCachedInfo { +struct LIBARDOUR_API AUPluginCachedInfo { std::vector<std::pair<int,int> > io_configs; }; -class AUPluginInfo : public PluginInfo { +class LIBARDOUR_API AUPluginInfo : public PluginInfo { public: AUPluginInfo (boost::shared_ptr<CAComponentDescription>); ~AUPluginInfo (); diff --git a/libs/ardour/ardour/audioanalyser.h b/libs/ardour/ardour/audioanalyser.h index f525cbd99f..6a9738eb5a 100644 --- a/libs/ardour/ardour/audioanalyser.h +++ b/libs/ardour/ardour/audioanalyser.h @@ -25,7 +25,8 @@ #include <ostream> #include <fstream> #include <boost/utility.hpp> -#include <vamp-sdk/Plugin.h> +#include "vamp-sdk/Plugin.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" namespace ARDOUR { @@ -33,7 +34,7 @@ namespace ARDOUR { class Readable; class Session; -class AudioAnalyser : public boost::noncopyable { +class LIBARDOUR_API AudioAnalyser : public boost::noncopyable { public: typedef Vamp::Plugin AnalysisPlugin; diff --git a/libs/ardour/ardour/audioengine.h b/libs/ardour/ardour/audioengine.h index 09f2ac04f8..7eeae8f205 100644 --- a/libs/ardour/ardour/audioengine.h +++ b/libs/ardour/ardour/audioengine.h @@ -39,6 +39,7 @@ #include "ardour/ardour.h" #include "ardour/data_type.h" #include "ardour/session_handle.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "ardour/chan_count.h" #include "ardour/port_manager.h" @@ -53,13 +54,14 @@ namespace ARDOUR { class InternalPort; class MidiPort; +class MIDIDM; class Port; class Session; class ProcessThread; class AudioBackend; class AudioBackendInfo; -class AudioEngine : public SessionHandlePtr, public PortManager +class LIBARDOUR_API AudioEngine : public SessionHandlePtr, public PortManager { public: @@ -112,7 +114,6 @@ public: int set_device_name (const std::string&); int set_sample_rate (float); int set_buffer_size (uint32_t); - int set_sample_format (SampleFormat); int set_interleaved (bool yn); int set_input_channels (uint32_t); int set_output_channels (uint32_t); @@ -191,14 +192,24 @@ public: /* latency measurement */ - MTDM* mtdm(); + MTDM* mtdm() { return _mtdm; } + MIDIDM* mididm() { return _mididm; } + int prepare_for_latency_measurement (); - int start_latency_detection (); + int start_latency_detection (bool); void stop_latency_detection (); void set_latency_input_port (const std::string&); void set_latency_output_port (const std::string&); uint32_t latency_signal_delay () const { return _latency_signal_latency; } + enum LatencyMeasurement { + MeasureNone, + MeasureAudio, + MeasureMIDI + }; + + LatencyMeasurement measuring_latency () const { return _measuring_latency; } + private: AudioEngine (); @@ -221,7 +232,8 @@ public: Glib::Threads::Thread* m_meter_thread; ProcessThread* _main_thread; MTDM* _mtdm; - bool _measuring_latency; + MIDIDM* _mididm; + LatencyMeasurement _measuring_latency; PortEngine::PortHandle _latency_input_port; PortEngine::PortHandle _latency_output_port; framecnt_t _latency_flush_frames; diff --git a/libs/ardour/ardour/audiofile_tagger.h b/libs/ardour/ardour/audiofile_tagger.h index 656626a5f3..88789f9036 100644 --- a/libs/ardour/ardour/audiofile_tagger.h +++ b/libs/ardour/ardour/audiofile_tagger.h @@ -27,13 +27,15 @@ #include <taglib/taglib.h> #include <taglib/xiphcomment.h> +#include "ardour/libardour_visibility.h" + namespace ARDOUR { class SessionMetadata; /// Class with static functions for tagging audiofiles -class AudiofileTagger +class LIBARDOUR_API AudiofileTagger { public: diff --git a/libs/ardour/ardour/audiofilesource.h b/libs/ardour/ardour/audiofilesource.h index 7f4b18e404..4831eb2081 100644 --- a/libs/ardour/ardour/audiofilesource.h +++ b/libs/ardour/ardour/audiofilesource.h @@ -27,7 +27,7 @@ namespace ARDOUR { -struct SoundFileInfo { +struct LIBARDOUR_API SoundFileInfo { float samplerate; uint16_t channels; int64_t length; @@ -35,7 +35,7 @@ struct SoundFileInfo { int64_t timecode; }; -class AudioFileSource : public AudioSource, public FileSource { +class LIBARDOUR_API AudioFileSource : public AudioSource, public FileSource { public: virtual ~AudioFileSource (); @@ -60,6 +60,7 @@ public: virtual void clear_capture_marks() {} virtual bool one_of_several_channels () const { return false; } + virtual void flush () = 0; virtual int update_header (framepos_t when, struct tm&, time_t) = 0; virtual int flush_header () = 0; diff --git a/libs/ardour/ardour/audioplaylist.h b/libs/ardour/ardour/audioplaylist.h index 478d4872cd..c4196dc3b6 100644 --- a/libs/ardour/ardour/audioplaylist.h +++ b/libs/ardour/ardour/audioplaylist.h @@ -29,13 +29,11 @@ namespace ARDOUR { class Session; -class Region; class AudioRegion; class Source; - class AudioPlaylist; -class AudioPlaylist : public ARDOUR::Playlist +class LIBARDOUR_API AudioPlaylist : public ARDOUR::Playlist { public: AudioPlaylist (Session&, const XMLNode&, bool hidden = false); diff --git a/libs/ardour/ardour/audioregion.h b/libs/ardour/ardour/audioregion.h index 83cd227bce..b3bed8d5fd 100644 --- a/libs/ardour/ardour/audioregion.h +++ b/libs/ardour/ardour/audioregion.h @@ -40,17 +40,17 @@ class PlaylistReadTest; namespace ARDOUR { namespace Properties { - extern PBD::PropertyDescriptor<bool> envelope_active; - extern PBD::PropertyDescriptor<bool> default_fade_in; - extern PBD::PropertyDescriptor<bool> default_fade_out; - extern PBD::PropertyDescriptor<bool> fade_in_active; - extern PBD::PropertyDescriptor<bool> fade_out_active; - extern PBD::PropertyDescriptor<float> scale_amplitude; - extern PBD::PropertyDescriptor<boost::shared_ptr<AutomationList> > fade_in; - extern PBD::PropertyDescriptor<boost::shared_ptr<AutomationList> > inverse_fade_in; - extern PBD::PropertyDescriptor<boost::shared_ptr<AutomationList> > fade_out; - extern PBD::PropertyDescriptor<boost::shared_ptr<AutomationList> > inverse_fade_out; - extern PBD::PropertyDescriptor<boost::shared_ptr<AutomationList> > envelope; + LIBARDOUR_API extern PBD::PropertyDescriptor<bool> envelope_active; + LIBARDOUR_API extern PBD::PropertyDescriptor<bool> default_fade_in; + LIBARDOUR_API extern PBD::PropertyDescriptor<bool> default_fade_out; + LIBARDOUR_API extern PBD::PropertyDescriptor<bool> fade_in_active; + LIBARDOUR_API extern PBD::PropertyDescriptor<bool> fade_out_active; + LIBARDOUR_API extern PBD::PropertyDescriptor<float> scale_amplitude; + LIBARDOUR_API extern PBD::PropertyDescriptor<boost::shared_ptr<AutomationList> > fade_in; + LIBARDOUR_API extern PBD::PropertyDescriptor<boost::shared_ptr<AutomationList> > inverse_fade_in; + LIBARDOUR_API extern PBD::PropertyDescriptor<boost::shared_ptr<AutomationList> > fade_out; + LIBARDOUR_API extern PBD::PropertyDescriptor<boost::shared_ptr<AutomationList> > inverse_fade_out; + LIBARDOUR_API extern PBD::PropertyDescriptor<boost::shared_ptr<AutomationList> > envelope; } class Playlist; @@ -59,7 +59,7 @@ class Filter; class AudioSource; -class AudioRegion : public Region +class LIBARDOUR_API AudioRegion : public Region { public: static void make_property_quarks (); @@ -94,7 +94,7 @@ class AudioRegion : public Region virtual framecnt_t read_peaks (PeakData *buf, framecnt_t npeaks, framecnt_t offset, framecnt_t cnt, - uint32_t chan_n=0, double samples_per_unit= 1.0) const; + uint32_t chan_n=0, double frames_per_pixel = 1.0) const; /* Readable interface */ @@ -115,7 +115,6 @@ class AudioRegion : public Region XMLNode& get_basic_state (); int set_state (const XMLNode&, int version); - static void set_default_fade (float steepness, framecnt_t len); bool fade_in_is_default () const; bool fade_out_is_default () const; @@ -238,9 +237,9 @@ class AudioRegion : public Region /* access from C objects */ extern "C" { - int region_read_peaks_from_c (void *arg, uint32_t npeaks, uint32_t start, uint32_t length, intptr_t data, uint32_t n_chan, double samples_per_unit); - uint32_t region_length_from_c (void *arg); - uint32_t sourcefile_length_from_c (void *arg, double); + LIBARDOUR_API int region_read_peaks_from_c (void *arg, uint32_t npeaks, uint32_t start, uint32_t length, intptr_t data, uint32_t n_chan, double samples_per_unit); + LIBARDOUR_API uint32_t region_length_from_c (void *arg); + LIBARDOUR_API uint32_t sourcefile_length_from_c (void *arg, double); } #endif /* __ardour_audio_region_h__ */ diff --git a/libs/ardour/ardour/audiosource.h b/libs/ardour/ardour/audiosource.h index d5c85a6bf8..910e03170d 100644 --- a/libs/ardour/ardour/audiosource.h +++ b/libs/ardour/ardour/audiosource.h @@ -38,7 +38,7 @@ namespace ARDOUR { -class AudioSource : virtual public Source, +class LIBARDOUR_API AudioSource : virtual public Source, public ARDOUR::Readable, public boost::enable_shared_from_this<ARDOUR::AudioSource> { diff --git a/libs/ardour/ardour/auditioner.h b/libs/ardour/ardour/auditioner.h index e73824b669..452f7eb246 100644 --- a/libs/ardour/ardour/auditioner.h +++ b/libs/ardour/ardour/auditioner.h @@ -37,7 +37,7 @@ class Session; class AudioRegion; class AudioPlaylist; -class Auditioner : public Track +class LIBARDOUR_API Auditioner : public Track { public: Auditioner (Session&); @@ -97,7 +97,7 @@ class Auditioner : public Track boost::shared_ptr<Region> bounce_range (framepos_t, framepos_t, InterThreadInfo&, boost::shared_ptr<Processor>, bool) { return boost::shared_ptr<Region> (); } - int export_stuff (BufferSet&, framepos_t, framecnt_t, boost::shared_ptr<Processor>, bool, bool) + int export_stuff (BufferSet&, framepos_t, framecnt_t, boost::shared_ptr<Processor>, bool, bool, bool) { return -1; } boost::shared_ptr<Diskstream> diskstream_factory (XMLNode const &) @@ -136,6 +136,7 @@ class Auditioner : public Track static void *_drop_ports (void *); void actually_drop_ports (); void output_changed (IOChange, void*); + frameoffset_t _import_position; }; }; /* namespace ARDOUR */ diff --git a/libs/ardour/ardour/auto_bundle.h b/libs/ardour/ardour/auto_bundle.h index d97080c089..703aa8e73d 100644 --- a/libs/ardour/ardour/auto_bundle.h +++ b/libs/ardour/ardour/auto_bundle.h @@ -26,7 +26,7 @@ namespace ARDOUR { -class AutoBundle : public Bundle { +class LIBARDOUR_API AutoBundle : public Bundle { public: AutoBundle (bool i = true); diff --git a/libs/ardour/ardour/automatable.h b/libs/ardour/ardour/automatable.h index b10b8eb2bc..11fb48904c 100644 --- a/libs/ardour/ardour/automatable.h +++ b/libs/ardour/ardour/automatable.h @@ -26,6 +26,7 @@ #include <boost/shared_ptr.hpp> #include "pbd/signals.h" #include "evoral/ControlSet.hpp" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" class XMLNode; @@ -38,7 +39,7 @@ class AutomationControl; /* The inherited ControlSet is virtual because AutomatableSequence inherits * from this AND EvoralSequence, which is also a ControlSet */ -class Automatable : virtual public Evoral::ControlSet +class LIBARDOUR_API Automatable : virtual public Evoral::ControlSet { public: Automatable(Session&); diff --git a/libs/ardour/ardour/automatable_sequence.h b/libs/ardour/ardour/automatable_sequence.h index 730ea33a7c..b0003189a4 100644 --- a/libs/ardour/ardour/automatable_sequence.h +++ b/libs/ardour/ardour/automatable_sequence.h @@ -27,7 +27,7 @@ namespace ARDOUR { /** Contains notes and controllers */ template<typename T> -class AutomatableSequence : public Automatable, public Evoral::Sequence<T> { +class /*LIBARDOUR_API*/ AutomatableSequence : public Automatable, public Evoral::Sequence<T> { public: AutomatableSequence(Session& s) : Evoral::ControlSet() diff --git a/libs/ardour/ardour/automation_control.h b/libs/ardour/ardour/automation_control.h index 10194b3f9b..aeee9dab30 100644 --- a/libs/ardour/ardour/automation_control.h +++ b/libs/ardour/ardour/automation_control.h @@ -26,6 +26,8 @@ #include "pbd/controllable.h" #include "evoral/Control.hpp" + +#include "ardour/libardour_visibility.h" #include "ardour/automation_list.h" namespace ARDOUR { @@ -36,7 +38,7 @@ class Automatable; /** A PBD::Controllable with associated automation data (AutomationList) */ -class AutomationControl : public PBD::Controllable, public Evoral::Control, public boost::enable_shared_from_this<AutomationControl> +class LIBARDOUR_API AutomationControl : public PBD::Controllable, public Evoral::Control, public boost::enable_shared_from_this<AutomationControl> { public: AutomationControl(ARDOUR::Session&, diff --git a/libs/ardour/ardour/automation_list.h b/libs/ardour/ardour/automation_list.h index 71eddda6dd..6e7b0007cd 100644 --- a/libs/ardour/ardour/automation_list.h +++ b/libs/ardour/ardour/automation_list.h @@ -40,7 +40,7 @@ namespace ARDOUR { class AutomationList; /** A SharedStatefulProperty for AutomationLists */ -class AutomationListProperty : public PBD::SharedStatefulProperty<AutomationList> +class LIBARDOUR_API AutomationListProperty : public PBD::SharedStatefulProperty<AutomationList> { public: AutomationListProperty (PBD::PropertyDescriptor<boost::shared_ptr<AutomationList> > d, Ptr p) @@ -59,7 +59,7 @@ private: AutomationListProperty& operator= (AutomationListProperty const &); }; -class AutomationList : public PBD::StatefulDestructible, public Evoral::ControlList +class LIBARDOUR_API AutomationList : public PBD::StatefulDestructible, public Evoral::ControlList { public: AutomationList (Evoral::Parameter id); diff --git a/libs/ardour/ardour/automation_watch.h b/libs/ardour/ardour/automation_watch.h index f3e343468d..db6474c062 100644 --- a/libs/ardour/ardour/automation_watch.h +++ b/libs/ardour/ardour/automation_watch.h @@ -30,7 +30,7 @@ namespace ARDOUR { class AutomationControl; -class AutomationWatch : public sigc::trackable, public ARDOUR::SessionHandlePtr, public PBD::ScopedConnectionList { +class LIBARDOUR_API AutomationWatch : public sigc::trackable, public ARDOUR::SessionHandlePtr, public PBD::ScopedConnectionList { public: static AutomationWatch& instance(); diff --git a/libs/ardour/ardour/backend_search_path.h b/libs/ardour/ardour/backend_search_path.h deleted file mode 100644 index 2adc22bd6f..0000000000 --- a/libs/ardour/ardour/backend_search_path.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - Copyright (C) 2011 Paul Davis - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -#ifndef __ardour_backend_search_path_h__ -#define __ardour_backend_search_path_h__ - -#include "pbd/search_path.h" - -namespace ARDOUR { - - /** - * return a SearchPath containing directories in which to look for - * backend plugins. - * - * If ARDOUR_BACKEND_PATH is defined then the SearchPath returned - * will contain only those directories specified in it, otherwise it will - * contain the user and system directories which may contain audio/MIDI - * backends. - */ - PBD::SearchPath backend_search_path (); - -} // namespace ARDOUR - -#endif /* __ardour_backend_search_path_h__ */ diff --git a/libs/ardour/ardour/beats_frames_converter.h b/libs/ardour/ardour/beats_frames_converter.h index e331b8411d..2e170d278a 100644 --- a/libs/ardour/ardour/beats_frames_converter.h +++ b/libs/ardour/ardour/beats_frames_converter.h @@ -20,6 +20,7 @@ */ #include "evoral/TimeConverter.hpp" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #ifndef __ardour_beats_frames_converter_h__ @@ -33,7 +34,7 @@ class TempoMap; * from some origin (supplied to the constructor in frames), and converts * them to the opposite unit, taking tempo changes into account. */ -class BeatsFramesConverter : public Evoral::TimeConverter<double,framepos_t> { +class LIBARDOUR_API BeatsFramesConverter : public Evoral::TimeConverter<double,framepos_t> { public: BeatsFramesConverter (TempoMap& tempo_map, framepos_t origin) : Evoral::TimeConverter<double, framepos_t> (origin) diff --git a/libs/ardour/ardour/broadcast_info.h b/libs/ardour/ardour/broadcast_info.h index 0e87d6e6df..97f86dd133 100644 --- a/libs/ardour/ardour/broadcast_info.h +++ b/libs/ardour/ardour/broadcast_info.h @@ -23,6 +23,7 @@ #include <string> +#include "ardour/libardour_visibility.h" #include "audiographer/broadcast_info.h" namespace ARDOUR @@ -30,7 +31,7 @@ namespace ARDOUR class Session; -class BroadcastInfo : public AudioGrapher::BroadcastInfo +class LIBARDOUR_API BroadcastInfo : public AudioGrapher::BroadcastInfo { public: BroadcastInfo (); diff --git a/libs/ardour/ardour/buffer.h b/libs/ardour/ardour/buffer.h index 87f7a90fc3..8293a22beb 100644 --- a/libs/ardour/ardour/buffer.h +++ b/libs/ardour/ardour/buffer.h @@ -23,6 +23,7 @@ #include <boost/utility.hpp> +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "ardour/data_type.h" @@ -38,7 +39,7 @@ namespace ARDOUR { * * To actually read/write buffer contents, use the appropriate derived class. */ -class Buffer : public boost::noncopyable +class LIBARDOUR_API Buffer : public boost::noncopyable { public: virtual ~Buffer() {} diff --git a/libs/ardour/ardour/buffer_manager.h b/libs/ardour/ardour/buffer_manager.h index fccd981fba..c73b59b763 100644 --- a/libs/ardour/ardour/buffer_manager.h +++ b/libs/ardour/ardour/buffer_manager.h @@ -32,7 +32,7 @@ namespace ARDOUR { class ThreadBuffers; -class BufferManager +class LIBARDOUR_API BufferManager { public: static void init (uint32_t); @@ -40,7 +40,7 @@ public: static ThreadBuffers* get_thread_buffers (); static void put_thread_buffers (ThreadBuffers*); - static void ensure_buffers (ChanCount howmany = ChanCount::ZERO); + static void ensure_buffers (ChanCount howmany = ChanCount::ZERO, size_t custom = 0); private: static Glib::Threads::Mutex rb_mutex; diff --git a/libs/ardour/ardour/buffer_set.h b/libs/ardour/ardour/buffer_set.h index 5f8553218b..9ea6ab7d6a 100644 --- a/libs/ardour/ardour/buffer_set.h +++ b/libs/ardour/ardour/buffer_set.h @@ -27,9 +27,10 @@ #include <vector> #include "ardour/chan_count.h" #include "ardour/data_type.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" -#if defined VST_SUPPORT || defined LXVST_SUPPORT +#if defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT #include "evoral/MIDIEvent.hpp" struct _VstEvents; typedef struct _VstEvents VstEvents; @@ -61,7 +62,7 @@ class PortSet; * others the form of their output (eg what they did to the BufferSet). * Setting the use counts is realtime safe. */ -class BufferSet +class LIBARDOUR_API BufferSet { public: BufferSet(); @@ -129,7 +130,7 @@ public: void forward_lv2_midi(LV2_Evbuf*, size_t, bool purge_ardour_buffer = true); #endif -#if defined VST_SUPPORT || defined LXVST_SUPPORT +#if defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT VstEvents* get_vst_midi (size_t); #endif @@ -188,7 +189,7 @@ private: LV2Buffers _lv2_buffers; #endif -#if defined VST_SUPPORT || defined LXVST_SUPPORT +#if defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT class VSTBuffer { public: VSTBuffer (size_t); diff --git a/libs/ardour/ardour/bundle.h b/libs/ardour/ardour/bundle.h index 02845481b6..ef2247f12b 100644 --- a/libs/ardour/ardour/bundle.h +++ b/libs/ardour/ardour/bundle.h @@ -40,7 +40,7 @@ class AudioEngine; * `Channel' is a rather overloaded term but I can't think of a better * one right now. */ -class Bundle : public PBD::ScopedConnectionList +class LIBARDOUR_API Bundle : public PBD::ScopedConnectionList { public: @@ -149,7 +149,7 @@ class Bundle : public PBD::ScopedConnectionList Change _pending_change; }; -class BundleChannel +class LIBARDOUR_API BundleChannel { public: BundleChannel () : channel (-1) {} diff --git a/libs/ardour/ardour/butler.h b/libs/ardour/ardour/butler.h index cdd48c3e3a..949668dab3 100644 --- a/libs/ardour/ardour/butler.h +++ b/libs/ardour/ardour/butler.h @@ -20,13 +20,22 @@ #ifndef __ardour_butler_h__ #define __ardour_butler_h__ +#include <pthread.h> + #include <glibmm/threads.h> +#ifdef PLATFORM_WINDOWS +#include "pbd/glib_semaphore.h" +#endif + #include "pbd/ringbuffer.h" #include "pbd/pool.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "ardour/session_handle.h" + + namespace ARDOUR { /** @@ -36,7 +45,7 @@ namespace ARDOUR { * are empty they are deleted. */ -class Butler : public SessionHandleRef +class LIBARDOUR_API Butler : public SessionHandleRef { public: Butler (Session& session); @@ -67,19 +76,48 @@ class Butler : public SessionHandleRef }; pthread_t thread; + bool have_thread; Glib::Threads::Mutex request_lock; Glib::Threads::Cond paused; bool should_run; mutable gint should_do_transport_work; - int request_pipe[2]; framecnt_t audio_dstream_capture_buffer_size; framecnt_t audio_dstream_playback_buffer_size; uint32_t midi_dstream_buffer_size; RingBuffer<CrossThreadPool*> pool_trash; +#ifdef PLATFORM_WINDOWS + PBD::atomic_counter m_request_state; + PBD::GlibSemaphore m_request_sem; +#else + int request_pipe[2]; +#endif + private: void empty_pool_trash (); void config_changed (std::string); + +#ifndef PLATFORM_WINDOWS + int setup_request_pipe (); +#endif + + /** + * return true if there are requests to be processed + */ + bool wait_for_requests (); + + /** + * Remove request from butler request queue + * + * return true if there was another request and req is valid + */ + bool dequeue_request (Request::Type& req); + + /** + * Add request to butler thread request queue + */ + void queue_request (Request::Type r); + }; } // namespace ARDOUR diff --git a/libs/ardour/ardour/caimportable.h b/libs/ardour/ardour/caimportable.h index 1ed8676ee6..211329b8c6 100644 --- a/libs/ardour/ardour/caimportable.h +++ b/libs/ardour/ardour/caimportable.h @@ -21,6 +21,7 @@ #define __ardour_ca_importable_source_h__ #include "pbd/failed_constructor.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "ardour/importable_source.h" @@ -28,7 +29,7 @@ namespace ARDOUR { -class CAImportableSource : public ImportableSource { +class LIBARDOUR_API CAImportableSource : public ImportableSource { public: CAImportableSource (const std::string& path); virtual ~CAImportableSource(); diff --git a/libs/ardour/ardour/capturing_processor.h b/libs/ardour/ardour/capturing_processor.h index 5b9ea51557..9a91e6d02f 100644 --- a/libs/ardour/ardour/capturing_processor.h +++ b/libs/ardour/ardour/capturing_processor.h @@ -24,7 +24,7 @@ namespace ARDOUR { -class CapturingProcessor : public Processor +class LIBARDOUR_API CapturingProcessor : public Processor { public: CapturingProcessor (Session & session); diff --git a/libs/ardour/ardour/chan_count.h b/libs/ardour/ardour/chan_count.h index c4f3caef6b..9f9fd07543 100644 --- a/libs/ardour/ardour/chan_count.h +++ b/libs/ardour/ardour/chan_count.h @@ -26,6 +26,10 @@ #include "pbd/xml++.h" #include "ardour/data_type.h" +#ifdef INFINITE +#undef INFINITE +#endif + namespace ARDOUR { @@ -34,7 +38,7 @@ namespace ARDOUR { * Operators are defined so this may safely be used as if it were a simple * (single-typed) integer count of channels. */ -class ChanCount { +class LIBARDOUR_API ChanCount { public: ChanCount(const XMLNode& node); ChanCount() { reset(); } diff --git a/libs/ardour/ardour/chan_mapping.h b/libs/ardour/ardour/chan_mapping.h index 5b63844f66..ebb7be402a 100644 --- a/libs/ardour/ardour/chan_mapping.h +++ b/libs/ardour/ardour/chan_mapping.h @@ -34,7 +34,7 @@ namespace ARDOUR { /** A mapping from one set of channels to another * (e.g. how to 'connect' two BufferSets). */ -class ChanMapping { +class LIBARDOUR_API ChanMapping { public: ChanMapping() {} ChanMapping(ARDOUR::ChanCount identity); diff --git a/libs/ardour/ardour/click.h b/libs/ardour/ardour/click.h index 1047540a74..7fc6d21f73 100644 --- a/libs/ardour/ardour/click.h +++ b/libs/ardour/ardour/click.h @@ -23,12 +23,13 @@ #include <list> #include "pbd/pool.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "ardour/io.h" namespace ARDOUR { -class Click { +class LIBARDOUR_API Click { public: framepos_t start; framecnt_t duration; @@ -49,7 +50,7 @@ private: static Pool pool; }; -class ClickIO : public IO +class LIBARDOUR_API ClickIO : public IO { public: ClickIO (Session& s, const std::string& name) : IO (s, name, IO::Output) {} diff --git a/libs/ardour/ardour/comparable_shared_ptr.h b/libs/ardour/ardour/comparable_shared_ptr.h index 5ff19af419..f5e9cd346a 100644 --- a/libs/ardour/ardour/comparable_shared_ptr.h +++ b/libs/ardour/ardour/comparable_shared_ptr.h @@ -21,10 +21,12 @@ #ifndef __ardour_comparable_shared_ptr_h__ #define __ardour_comparable_shared_ptr_h__ +#include "ardour/libardour_visibility.h" + namespace ARDOUR { template<typename T> -class ComparableSharedPtr : public boost::shared_ptr<T> +class /*LIBARDOUR_API*/ ComparableSharedPtr : public boost::shared_ptr<T> , public boost::less_than_comparable<ComparableSharedPtr<T> > { public: diff --git a/libs/ardour/ardour/configuration.h b/libs/ardour/ardour/configuration.h index 14a43e160c..f8e512e458 100644 --- a/libs/ardour/ardour/configuration.h +++ b/libs/ardour/ardour/configuration.h @@ -29,7 +29,7 @@ class XMLNode; namespace ARDOUR { -class Configuration : public PBD::Stateful +class LIBARDOUR_API Configuration : public PBD::Stateful { public: Configuration(); diff --git a/libs/ardour/ardour/configuration_variable.h b/libs/ardour/ardour/configuration_variable.h index a7fe8def48..7a83c34c3f 100644 --- a/libs/ardour/ardour/configuration_variable.h +++ b/libs/ardour/ardour/configuration_variable.h @@ -25,12 +25,13 @@ #include "pbd/xml++.h" #include "pbd/convert.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "ardour/utils.h" namespace ARDOUR { -class ConfigVariableBase { +class LIBARDOUR_API ConfigVariableBase { public: ConfigVariableBase (std::string str) : _name (str) {} @@ -51,7 +52,7 @@ class ConfigVariableBase { }; template<class T> -class ConfigVariable : public ConfigVariableBase +class /*LIBARDOUR_API*/ ConfigVariable : public ConfigVariableBase { public: @@ -91,7 +92,7 @@ class ConfigVariable : public ConfigVariableBase /** Specialisation of ConfigVariable for std::string to cope with whitespace properly */ template<> -class ConfigVariable<std::string> : public ConfigVariableBase +class /*LIBARDOUR_API*/ ConfigVariable<std::string> : public ConfigVariableBase { public: @@ -126,7 +127,7 @@ class ConfigVariable<std::string> : public ConfigVariableBase }; template<> -class ConfigVariable<bool> : public ConfigVariableBase +class /*LIBARDOUR_API*/ ConfigVariable<bool> : public ConfigVariableBase { public: @@ -163,7 +164,7 @@ class ConfigVariable<bool> : public ConfigVariableBase }; template<class T> -class ConfigVariableWithMutation : public ConfigVariable<T> +class /*LIBARDOUR_API*/ ConfigVariableWithMutation : public ConfigVariable<T> { public: ConfigVariableWithMutation (std::string name, T val, T (*m)(T)) @@ -192,7 +193,7 @@ class ConfigVariableWithMutation : public ConfigVariable<T> }; template<> -class ConfigVariableWithMutation<std::string> : public ConfigVariable<std::string> +class /*LIBARDOUR_API*/ ConfigVariableWithMutation<std::string> : public ConfigVariable<std::string> { public: ConfigVariableWithMutation (std::string name, std::string val, std::string (*m)(std::string)) diff --git a/libs/ardour/ardour/control_protocol_manager.h b/libs/ardour/ardour/control_protocol_manager.h index 7d3d4872e6..0c8c9014f0 100644 --- a/libs/ardour/ardour/control_protocol_manager.h +++ b/libs/ardour/ardour/control_protocol_manager.h @@ -35,7 +35,7 @@ class ControlProtocol; class ControlProtocolDescriptor; class Session; -class ControlProtocolInfo { +class LIBARDOUR_API ControlProtocolInfo { public: ControlProtocolDescriptor* descriptor; ControlProtocol* protocol; @@ -52,7 +52,7 @@ public: ~ControlProtocolInfo() { delete state; } }; -class ControlProtocolManager : public PBD::Stateful, public ARDOUR::SessionHandlePtr +class LIBARDOUR_API ControlProtocolManager : public PBD::Stateful, public ARDOUR::SessionHandlePtr { public: ~ControlProtocolManager (); diff --git a/libs/ardour/ardour/control_protocol_search_path.h b/libs/ardour/ardour/control_protocol_search_path.h deleted file mode 100644 index 8795f4501a..0000000000 --- a/libs/ardour/ardour/control_protocol_search_path.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - Copyright (C) 2007 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_CONTROL_PROTOCOL_SEARCH_PATH_INCLUDED -#define ARDOUR_CONTROL_PROTOCOL_SEARCH_PATH_INCLUDED - -#include "pbd/search_path.h" - -namespace ARDOUR { - - /** - * return a SearchPath containing directories in which to look for - * control surface plugins. - * - * If ARDOUR_SURFACES_PATH is defined then the SearchPath returned - * will contain only those directories specified in it, otherwise it will - * contain the user and system directories which may contain control - * surface plugins. - */ - PBD::SearchPath control_protocol_search_path (); - -} // namespace ARDOUR - -#endif diff --git a/libs/ardour/ardour/coreaudiosource.h b/libs/ardour/ardour/coreaudiosource.h index 820fa0b9d8..f12a67ded7 100644 --- a/libs/ardour/ardour/coreaudiosource.h +++ b/libs/ardour/ardour/coreaudiosource.h @@ -28,7 +28,7 @@ using namespace std; namespace ARDOUR { -class CoreAudioSource : public AudioFileSource { +class LIBARDOUR_API CoreAudioSource : public AudioFileSource { public: CoreAudioSource (ARDOUR::Session&, const XMLNode&); CoreAudioSource (ARDOUR::Session&, const string& path, int chn, Flag); @@ -43,6 +43,8 @@ class CoreAudioSource : public AudioFileSource { void set_header_timeline_position () {}; bool clamped_at_unity () const { return false; } + void flush () {} + static int get_soundfile_info (string path, SoundFileInfo& _info, string& error_msg); protected: diff --git a/libs/ardour/ardour/cycle_timer.h b/libs/ardour/ardour/cycle_timer.h index 35cc2a4c73..cab389ee69 100644 --- a/libs/ardour/ardour/cycle_timer.h +++ b/libs/ardour/ardour/cycle_timer.h @@ -24,12 +24,13 @@ #include <iostream> #include <cstdlib> +#include "ardour/libardour_visibility.h" #include "ardour/cycles.h" #include "ardour/debug.h" float get_mhz (); -class CycleTimer { +class LIBARDOUR_API CycleTimer { private: static float cycles_per_usec; #ifndef NDEBUG @@ -48,6 +49,8 @@ class CycleTimer { } _entry = get_cycles(); } +#else + (void) name; #endif } @@ -61,7 +64,7 @@ class CycleTimer { } }; -class StoringTimer +class LIBARDOUR_API StoringTimer { public: StoringTimer (int); diff --git a/libs/ardour/ardour/cycles.h b/libs/ardour/ardour/cycles.h index 01e1d55221..dc1095db7b 100644 --- a/libs/ardour/ardour/cycles.h +++ b/libs/ardour/ardour/cycles.h @@ -216,7 +216,10 @@ static inline cycles_t get_cycles (void) /* debian: sparc, arm, m68k */ +#ifndef COMPILER_MSVC +/* GRRR... Annoyingly, #warning aborts the compilation for MSVC !! */ #warning You are compiling libardour on a platform for which ardour/cycles.h needs work +#endif #include <sys/time.h> diff --git a/libs/ardour/ardour/data_type.h b/libs/ardour/ardour/data_type.h index b4129e2629..2a4514a5cf 100644 --- a/libs/ardour/ardour/data_type.h +++ b/libs/ardour/ardour/data_type.h @@ -24,6 +24,8 @@ #include <stdint.h> #include <glib.h> +#include "ardour/libardour_visibility.h" + namespace ARDOUR { /** A type of Data Ardour is capable of processing. @@ -32,7 +34,7 @@ namespace ARDOUR { * other type representations, simple comparison between then, etc. This code * is deliberately 'ugly' so other code doesn't have to be. */ -class DataType +class LIBARDOUR_API DataType { public: /** Numeric symbol for this DataType. diff --git a/libs/ardour/ardour/debug.h b/libs/ardour/ardour/debug.h index 5811f7a484..9a7b0a495f 100644 --- a/libs/ardour/ardour/debug.h +++ b/libs/ardour/ardour/debug.h @@ -24,46 +24,51 @@ #include <sstream> +#include "ardour/libardour_visibility.h" #include "pbd/debug.h" namespace PBD { namespace DEBUG { - extern uint64_t MidiSourceIO; - extern uint64_t MidiPlaylistIO; - extern uint64_t MidiDiskstreamIO; - extern uint64_t SnapBBT; - extern uint64_t Configuration; - extern uint64_t Latency; - extern uint64_t Processors; - extern uint64_t ProcessThreads; - extern uint64_t Graph; - extern uint64_t Destruction; - extern uint64_t MTC; - extern uint64_t LTC; - extern uint64_t Transport; - extern uint64_t Slave; - extern uint64_t SessionEvents; - extern uint64_t MidiIO; - extern uint64_t MackieControl; - extern uint64_t MidiClock; - extern uint64_t Monitor; - extern uint64_t Solo; - extern uint64_t AudioPlayback; - extern uint64_t Panning; - extern uint64_t LV2; - extern uint64_t CaptureAlignment; - extern uint64_t PluginManager; - extern uint64_t AudioUnits; - extern uint64_t ControlProtocols; - extern uint64_t CycleTimers; - extern uint64_t MidiTrackers; - extern uint64_t Layering; - extern uint64_t TempoMath; - extern uint64_t TempoMap; - extern uint64_t OrderKeys; - extern uint64_t Automation; - extern uint64_t WiimoteControl; - extern uint64_t Ports; + LIBARDOUR_API extern uint64_t MidiSourceIO; + LIBARDOUR_API extern uint64_t MidiPlaylistIO; + LIBARDOUR_API extern uint64_t MidiDiskstreamIO; + LIBARDOUR_API extern uint64_t SnapBBT; + LIBARDOUR_API extern uint64_t Configuration; + LIBARDOUR_API extern uint64_t Latency; + LIBARDOUR_API extern uint64_t LatencyCompensation; + LIBARDOUR_API extern uint64_t Peaks; + LIBARDOUR_API extern uint64_t Processors; + LIBARDOUR_API extern uint64_t ProcessThreads; + LIBARDOUR_API extern uint64_t Graph; + LIBARDOUR_API extern uint64_t Destruction; + LIBARDOUR_API extern uint64_t MTC; + LIBARDOUR_API extern uint64_t LTC; + LIBARDOUR_API extern uint64_t Transport; + LIBARDOUR_API extern uint64_t Slave; + LIBARDOUR_API extern uint64_t SessionEvents; + LIBARDOUR_API extern uint64_t MidiIO; + LIBARDOUR_API extern uint64_t MackieControl; + LIBARDOUR_API extern uint64_t MidiClock; + LIBARDOUR_API extern uint64_t Monitor; + LIBARDOUR_API extern uint64_t Solo; + LIBARDOUR_API extern uint64_t AudioPlayback; + LIBARDOUR_API extern uint64_t Panning; + LIBARDOUR_API extern uint64_t LV2; + LIBARDOUR_API extern uint64_t CaptureAlignment; + LIBARDOUR_API extern uint64_t PluginManager; + LIBARDOUR_API extern uint64_t AudioUnits; + LIBARDOUR_API extern uint64_t ControlProtocols; + LIBARDOUR_API extern uint64_t CycleTimers; + LIBARDOUR_API extern uint64_t MidiTrackers; + LIBARDOUR_API extern uint64_t Layering; + LIBARDOUR_API extern uint64_t TempoMath; + LIBARDOUR_API extern uint64_t TempoMap; + LIBARDOUR_API extern uint64_t OrderKeys; + LIBARDOUR_API extern uint64_t Automation; + LIBARDOUR_API extern uint64_t WiimoteControl; + LIBARDOUR_API extern uint64_t Ports; + LIBARDOUR_API extern uint64_t AudioEngine; + LIBARDOUR_API extern uint64_t Soundcloud; } } diff --git a/libs/ardour/ardour/delayline.h b/libs/ardour/ardour/delayline.h new file mode 100644 index 0000000000..56a6de0c63 --- /dev/null +++ b/libs/ardour/ardour/delayline.h @@ -0,0 +1,69 @@ +/* + Copyright (C) 2006, 2013 Paul Davis + Copyright (C) 2013, 2014 Robin Gareus <robin@gareus.org> + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef __ardour_delayline_h__ +#define __ardour_delayline_h__ + +#include "ardour/types.h" +#include "ardour/processor.h" + +namespace ARDOUR { + +class BufferSet; +class ChanCount; +class Session; + +/** Meters peaks on the input and stores them for access. + */ +class LIBARDOUR_API DelayLine : public Processor { +public: + + DelayLine (Session& s, const std::string& name); + ~DelayLine (); + + bool display_to_user() const { return false; } + + void run (BufferSet&, framepos_t, framepos_t, pframes_t, bool); + void set_delay(framecnt_t signal_delay); + framecnt_t get_delay() { return _pending_delay; } + + bool configure_io (ChanCount in, ChanCount out); + bool can_support_io_configuration (const ChanCount& in, ChanCount& out); + + void flush(); + void realtime_handle_transport_stopped () { flush(); } + void realtime_locate () { flush(); } + void monitoring_changed() { flush(); } + + XMLNode& state (bool full); + +private: + friend class IO; + framecnt_t _delay, _pending_delay; + framecnt_t _bsiz, _pending_bsiz; + frameoffset_t _roff, _woff; + boost::shared_ptr<Sample> _buf; + boost::shared_ptr<Sample> _pending_buf; + boost::shared_ptr<MidiBuffer> _midi_buf; + bool _pending_flush; +}; + +} // namespace ARDOUR + +#endif // __ardour_meter_h__ diff --git a/libs/ardour/ardour/delivery.h b/libs/ardour/ardour/delivery.h index 4a6d4368a6..e19eef719f 100644 --- a/libs/ardour/ardour/delivery.h +++ b/libs/ardour/ardour/delivery.h @@ -21,6 +21,7 @@ #include <string> +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "ardour/chan_count.h" #include "ardour/io_processor.h" @@ -34,7 +35,7 @@ class PannerShell; class Panner; class Pannable; -class Delivery : public IOProcessor +class LIBARDOUR_API Delivery : public IOProcessor { public: enum Role { diff --git a/libs/ardour/ardour/directory_names.h b/libs/ardour/ardour/directory_names.h index 935cdd977b..17532e2a3a 100644 --- a/libs/ardour/ardour/directory_names.h +++ b/libs/ardour/ardour/directory_names.h @@ -21,24 +21,28 @@ #ifndef __ardour_directory_names_h__ #define __ardour_directory_names_h__ +#include "ardour/libardour_visibility.h" + namespace ARDOUR { -extern const char* const old_sound_dir_name; -extern const char* const sound_dir_name; -extern const char* const midi_dir_name; -extern const char* const midi_patch_dir_name; -extern const char* const video_dir_name; -extern const char* const dead_dir_name; -extern const char* const interchange_dir_name; -extern const char* const peak_dir_name; -extern const char* const export_dir_name; -extern const char* const export_formats_dir_name; -extern const char* const templates_dir_name; -extern const char* const route_templates_dir_name; -extern const char* const surfaces_dir_name; -extern const char* const user_config_dir_name; -extern const char* const panner_dir_name; -extern const char* const backend_dir_name; + LIBARDOUR_API extern const char* const old_sound_dir_name; + LIBARDOUR_API extern const char* const sound_dir_name; + LIBARDOUR_API extern const char* const ladspa_dir_name; + LIBARDOUR_API extern const char* const midi_dir_name; + LIBARDOUR_API extern const char* const midi_patch_dir_name; + LIBARDOUR_API extern const char* const video_dir_name; + LIBARDOUR_API extern const char* const dead_dir_name; + LIBARDOUR_API extern const char* const interchange_dir_name; + LIBARDOUR_API extern const char* const peak_dir_name; + LIBARDOUR_API extern const char* const export_dir_name; + LIBARDOUR_API extern const char* const export_formats_dir_name; + LIBARDOUR_API extern const char* const templates_dir_name; + LIBARDOUR_API extern const char* const route_templates_dir_name; + LIBARDOUR_API extern const char* const surfaces_dir_name; + LIBARDOUR_API extern const char* const ladspa_dir_name; + LIBARDOUR_API extern const char* const user_config_dir_name; + LIBARDOUR_API extern const char* const panner_dir_name; + LIBARDOUR_API extern const char* const backend_dir_name; }; diff --git a/libs/ardour/ardour/diskstream.h b/libs/ardour/ardour/diskstream.h index 91efb0d517..055a298d84 100644 --- a/libs/ardour/ardour/diskstream.h +++ b/libs/ardour/ardour/diskstream.h @@ -34,6 +34,7 @@ #include "ardour/ardour.h" #include "ardour/chan_count.h" #include "ardour/session_object.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "ardour/utils.h" #include "ardour/public_diskstream.h" @@ -54,7 +55,7 @@ class BufferSet; /** Parent class for classes which can stream data to and from disk. * These are used by Tracks to get playback and put recorded data. */ -class Diskstream : public SessionObject, public PublicDiskstream +class LIBARDOUR_API Diskstream : public SessionObject, public PublicDiskstream { public: enum Flag { @@ -69,6 +70,15 @@ class Diskstream : public SessionObject, public PublicDiskstream virtual ~Diskstream(); virtual bool set_name (const std::string& str); + virtual bool set_write_source_name (const std::string& str); + + std::string write_source_name () const { + if (_write_source_name.empty()) { + return name(); + } else { + return _write_source_name; + } + } virtual std::string steal_write_source_name () { return std::string(); } @@ -311,6 +321,8 @@ class Diskstream : public SessionObject, public PublicDiskstream bool in_set_state; + std::string _write_source_name; + Glib::Threads::Mutex state_lock; PBD::ScopedConnectionList playlist_connections; diff --git a/libs/ardour/ardour/element_import_handler.h b/libs/ardour/ardour/element_import_handler.h index be2e3fafb0..32898ec9de 100644 --- a/libs/ardour/ardour/element_import_handler.h +++ b/libs/ardour/ardour/element_import_handler.h @@ -27,6 +27,9 @@ #include <boost/shared_ptr.hpp> +#include "ardour/libardour_visibility.h" +#include "pbd/libpbd_visibility.h" + class XMLTree; namespace ARDOUR { @@ -35,7 +38,7 @@ class Session; class ElementImporter; /// Virtual interface class for element import handlers -class ElementImportHandler +class LIBARDOUR_API ElementImportHandler { public: typedef boost::shared_ptr<ElementImporter> ElementPtr; diff --git a/libs/ardour/ardour/element_importer.h b/libs/ardour/ardour/element_importer.h index 8c25fd380d..b6d6ff7166 100644 --- a/libs/ardour/ardour/element_importer.h +++ b/libs/ardour/ardour/element_importer.h @@ -25,6 +25,7 @@ #include <utility> #include "pbd/signals.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" class XMLTree; @@ -34,7 +35,7 @@ class Session; class ImportStatus; /// Virtual interface class for element importers -class ElementImporter +class LIBARDOUR_API ElementImporter { public: diff --git a/libs/ardour/ardour/event_type_map.h b/libs/ardour/ardour/event_type_map.h index 02852e9711..fbfd9ec73c 100644 --- a/libs/ardour/ardour/event_type_map.h +++ b/libs/ardour/ardour/event_type_map.h @@ -25,12 +25,14 @@ #include "evoral/TypeMap.hpp" #include "evoral/ControlList.hpp" +#include "ardour/libardour_visibility.h" + namespace ARDOUR { /** This is the interface Ardour provides to Evoral about what * parameter and event types/ranges/names etc. to use. */ -class EventTypeMap : public Evoral::TypeMap { +class LIBARDOUR_API EventTypeMap : public Evoral::TypeMap { public: bool type_is_midi(uint32_t type) const; uint8_t parameter_midi_type(const Evoral::Parameter& param) const; diff --git a/libs/ardour/ardour/export_channel.h b/libs/ardour/ardour/export_channel.h index f3244095a3..894406874e 100644 --- a/libs/ardour/ardour/export_channel.h +++ b/libs/ardour/ardour/export_channel.h @@ -40,7 +40,7 @@ class AudioRegion; class CapturingProcessor; /// Export channel base class interface for different source types -class ExportChannel : public boost::less_than_comparable<ExportChannel> +class LIBARDOUR_API ExportChannel : public boost::less_than_comparable<ExportChannel> { public: @@ -62,7 +62,7 @@ class ExportChannel : public boost::less_than_comparable<ExportChannel> }; /// Basic export channel that reads from AudioPorts -class PortExportChannel : public ExportChannel +class LIBARDOUR_API PortExportChannel : public ExportChannel { public: typedef std::set<boost::weak_ptr<AudioPort> > PortSet; @@ -89,7 +89,7 @@ class PortExportChannel : public ExportChannel /// Handles RegionExportChannels and does actual reading from region -class RegionExportChannelFactory +class LIBARDOUR_API RegionExportChannelFactory { public: enum Type { @@ -128,7 +128,7 @@ class RegionExportChannelFactory }; /// Export channel that reads from region channel -class RegionExportChannel : public ExportChannel +class LIBARDOUR_API RegionExportChannel : public ExportChannel { friend class RegionExportChannelFactory; @@ -152,7 +152,7 @@ class RegionExportChannel : public ExportChannel }; /// Export channel for exporting from different positions in a route -class RouteExportChannel : public ExportChannel +class LIBARDOUR_API RouteExportChannel : public ExportChannel { class ProcessorRemover; // fwd declaration diff --git a/libs/ardour/ardour/export_channel_configuration.h b/libs/ardour/ardour/export_channel_configuration.h index b625be9dc3..4cab886c88 100644 --- a/libs/ardour/ardour/export_channel_configuration.h +++ b/libs/ardour/ardour/export_channel_configuration.h @@ -37,7 +37,7 @@ namespace ARDOUR class Session; -class ExportChannelConfiguration : public boost::enable_shared_from_this<ExportChannelConfiguration> +class LIBARDOUR_API ExportChannelConfiguration : public boost::enable_shared_from_this<ExportChannelConfiguration> { private: diff --git a/libs/ardour/ardour/export_failed.h b/libs/ardour/ardour/export_failed.h index 16687826b1..f1fd57ab4b 100644 --- a/libs/ardour/ardour/export_failed.h +++ b/libs/ardour/ardour/export_failed.h @@ -24,10 +24,12 @@ #include <exception> #include <string> +#include "ardour/libardour_visibility.h" + namespace ARDOUR { -class ExportFailed : public std::exception +class LIBARDOUR_API ExportFailed : public std::exception { public: ExportFailed (std::string const &); diff --git a/libs/ardour/ardour/export_filename.h b/libs/ardour/ardour/export_filename.h index 994f584e8d..7eacc11b90 100644 --- a/libs/ardour/ardour/export_filename.h +++ b/libs/ardour/ardour/export_filename.h @@ -34,7 +34,7 @@ namespace ARDOUR class Session; -class ExportFilename { +class LIBARDOUR_API ExportFilename { public: enum DateFormat { diff --git a/libs/ardour/ardour/export_format_base.h b/libs/ardour/ardour/export_format_base.h index a21c977833..7f09d148fe 100644 --- a/libs/ardour/ardour/export_format_base.h +++ b/libs/ardour/ardour/export_format_base.h @@ -30,6 +30,7 @@ #include <samplerate.h> #include "pbd/signals.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "audiographer/general/sample_format_converter.h" @@ -37,7 +38,7 @@ namespace ARDOUR { -class ExportFormatBase { +class LIBARDOUR_API ExportFormatBase { public: enum Type { @@ -113,7 +114,7 @@ class ExportFormatBase { }; /// Class for managing selection and compatibility states - class SelectableCompatible { + class LIBARDOUR_API SelectableCompatible { public: SelectableCompatible () : _selected (false), _compatible (true) { } diff --git a/libs/ardour/ardour/export_format_compatibility.h b/libs/ardour/ardour/export_format_compatibility.h index a220e4e4a2..6f6e367ae0 100644 --- a/libs/ardour/ardour/export_format_compatibility.h +++ b/libs/ardour/ardour/export_format_compatibility.h @@ -28,7 +28,7 @@ namespace ARDOUR { /// Allows adding to all sets. A format should be able to test if it is compatible with this -class ExportFormatCompatibility : public ExportFormatBase, public ExportFormatBase::SelectableCompatible { +class LIBARDOUR_API ExportFormatCompatibility : public ExportFormatBase, public ExportFormatBase::SelectableCompatible { private: public: diff --git a/libs/ardour/ardour/export_format_manager.h b/libs/ardour/ardour/export_format_manager.h index 2b5d0ad804..dad7d84b72 100644 --- a/libs/ardour/ardour/export_format_manager.h +++ b/libs/ardour/ardour/export_format_manager.h @@ -39,7 +39,7 @@ class ExportFormatCompatibility; class ExportFormatSpecification; class AnyTime; -class ExportFormatManager : public PBD::ScopedConnectionList +class LIBARDOUR_API ExportFormatManager : public PBD::ScopedConnectionList { public: @@ -100,6 +100,8 @@ class ExportFormatManager : public PBD::ScopedConnectionList void select_with_cue (bool); void select_with_toc (bool); + void select_upload (bool); + void set_command (std::string); void select_src_quality (ExportFormatBase::SRCQuality value); void select_trim_beginning (bool value); void select_silence_beginning (AnyTime const & time); diff --git a/libs/ardour/ardour/export_format_specification.h b/libs/ardour/ardour/export_format_specification.h index fc03eb94b0..2a62d792f0 100644 --- a/libs/ardour/ardour/export_format_specification.h +++ b/libs/ardour/ardour/export_format_specification.h @@ -25,6 +25,7 @@ #include "pbd/uuid.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "ardour/export_format_base.h" @@ -37,7 +38,7 @@ class ExportFormat; class ExportFormatCompatibility; class Session; -class ExportFormatSpecification : public ExportFormatBase { +class LIBARDOUR_API ExportFormatSpecification : public ExportFormatBase { private: @@ -95,6 +96,8 @@ class ExportFormatSpecification : public ExportFormatBase { void set_tag (bool tag_it) { _tag = tag_it; } void set_with_cue (bool yn) { _with_cue = yn; } void set_with_toc (bool yn) { _with_toc = yn; } + void set_soundcloud_upload (bool yn) { _soundcloud_upload = yn; } + void set_command (std::string command) { _command = command; } void set_silence_beginning (AnyTime const & value) { _silence_beginning = value; } void set_silence_end (AnyTime const & value) { _silence_end = value; } @@ -124,6 +127,8 @@ class ExportFormatSpecification : public ExportFormatBase { float normalize_target () const { return _normalize_target; } bool with_toc() const { return _with_toc; } bool with_cue() const { return _with_cue; } + bool soundcloud_upload() const { return _soundcloud_upload; } + std::string command() const { return _command; } bool tag () const { return _tag && supports_tagging; } @@ -173,6 +178,8 @@ class ExportFormatSpecification : public ExportFormatBase { float _normalize_target; bool _with_toc; bool _with_cue; + bool _soundcloud_upload; + std::string _command; /* serialization helpers */ diff --git a/libs/ardour/ardour/export_formats.h b/libs/ardour/ardour/export_formats.h index 0e9a93ff96..076bb90d3d 100644 --- a/libs/ardour/ardour/export_formats.h +++ b/libs/ardour/ardour/export_formats.h @@ -33,13 +33,13 @@ namespace ARDOUR { -class ExportFormatIncompatible : public failed_constructor { +class LIBARDOUR_API ExportFormatIncompatible : public failed_constructor { public: virtual const char *what() const throw() { return "Export format constructor failed: Format incompatible with system"; } }; /// Base class for formats -class ExportFormat : public ExportFormatBase, public ExportFormatBase::SelectableCompatible { +class LIBARDOUR_API ExportFormat : public ExportFormatBase, public ExportFormatBase::SelectableCompatible { public: ExportFormat () {}; @@ -86,7 +86,7 @@ class ExportFormat : public ExportFormatBase, public ExportFormatBase::Selectabl }; /// Class to be inherited by export formats that have a selectable sample format -class HasSampleFormat : public PBD::ScopedConnectionList { +class LIBARDOUR_API HasSampleFormat : public PBD::ScopedConnectionList { public: class SampleFormatState : public ExportFormatBase::SelectableCompatible { @@ -156,7 +156,7 @@ class HasSampleFormat : public PBD::ScopedConnectionList { ExportFormatBase::SampleFormatSet & _sample_formats; }; -class ExportFormatLinear : public ExportFormat, public HasSampleFormat { +class LIBARDOUR_API ExportFormatLinear : public ExportFormat, public HasSampleFormat { public: ExportFormatLinear (std::string name, FormatId format_id); @@ -174,7 +174,7 @@ class ExportFormatLinear : public ExportFormat, public HasSampleFormat { SampleFormat _default_sample_format; }; -class ExportFormatOggVorbis : public ExportFormat { +class LIBARDOUR_API ExportFormatOggVorbis : public ExportFormat { public: ExportFormatOggVorbis (); ~ExportFormatOggVorbis () {}; @@ -185,7 +185,7 @@ class ExportFormatOggVorbis : public ExportFormat { virtual bool supports_tagging () const { return true; } }; -class ExportFormatFLAC : public ExportFormat, public HasSampleFormat { +class LIBARDOUR_API ExportFormatFLAC : public ExportFormat, public HasSampleFormat { public: ExportFormatFLAC (); ~ExportFormatFLAC () {}; @@ -198,7 +198,7 @@ class ExportFormatFLAC : public ExportFormat, public HasSampleFormat { virtual bool supports_tagging () const { return true; } }; -class ExportFormatBWF : public ExportFormat, public HasSampleFormat { +class LIBARDOUR_API ExportFormatBWF : public ExportFormat, public HasSampleFormat { public: ExportFormatBWF (); ~ExportFormatBWF () {}; diff --git a/libs/ardour/ardour/export_graph_builder.h b/libs/ardour/ardour/export_graph_builder.h index 07e866475a..40960b2b38 100644 --- a/libs/ardour/ardour/export_graph_builder.h +++ b/libs/ardour/ardour/export_graph_builder.h @@ -48,7 +48,7 @@ namespace ARDOUR class ExportTimespan; class Session; -class ExportGraphBuilder +class LIBARDOUR_API ExportGraphBuilder { private: typedef ExportHandler::FileSpec FileSpec; diff --git a/libs/ardour/ardour/export_handler.h b/libs/ardour/ardour/export_handler.h index d4dd5627f7..8336cea732 100644 --- a/libs/ardour/ardour/export_handler.h +++ b/libs/ardour/ardour/export_handler.h @@ -29,7 +29,9 @@ #include "ardour/export_pointers.h" #include "ardour/session.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" +#include "pbd/signals.h" namespace AudioGrapher { class BroadcastInfo; @@ -45,7 +47,7 @@ class ExportFilename; class ExportGraphBuilder; class Location; -class ExportElementFactory +class LIBARDOUR_API ExportElementFactory { public: @@ -67,7 +69,7 @@ class ExportElementFactory Session & session; }; -class ExportHandler : public ExportElementFactory +class LIBARDOUR_API ExportHandler : public ExportElementFactory, public sigc::trackable { public: struct FileSpec { @@ -94,6 +96,8 @@ class ExportHandler : public ExportElementFactory friend boost::shared_ptr<ExportHandler> Session::get_export_handler(); ExportHandler (Session & session); + void command_output(std::string output, size_t size); + public: ~ExportHandler (); @@ -104,6 +108,18 @@ class ExportHandler : public ExportElementFactory std::string get_cd_marker_filename(std::string filename, CDMarkerFormat format); + /** signal emitted when soundcloud export reports progress updates during upload. + * The parameters are total and current bytes downloaded, and the current filename + */ + PBD::Signal3<void, double, double, std::string> SoundcloudProgress; + + /* upload credentials & preferences */ + std::string soundcloud_username; + std::string soundcloud_password; + bool soundcloud_make_public; + bool soundcloud_open_page; + bool soundcloud_downloadable; + private: void handle_duplicate_format_extensions(); diff --git a/libs/ardour/ardour/export_pointers.h b/libs/ardour/ardour/export_pointers.h index edd7f91325..ee29f0ee4c 100644 --- a/libs/ardour/ardour/export_pointers.h +++ b/libs/ardour/ardour/export_pointers.h @@ -25,6 +25,7 @@ #include <boost/shared_ptr.hpp> #include <boost/weak_ptr.hpp> +#include "ardour/libardour_visibility.h" #include "ardour/comparable_shared_ptr.h" namespace AudioGrapher { diff --git a/libs/ardour/ardour/export_preset.h b/libs/ardour/ardour/export_preset.h index b24cc70dcf..b11ab75bab 100644 --- a/libs/ardour/ardour/export_preset.h +++ b/libs/ardour/ardour/export_preset.h @@ -26,12 +26,14 @@ #include "pbd/uuid.h" #include "pbd/xml++.h" +#include "ardour/libardour_visibility.h" + namespace ARDOUR { class Session; -class ExportPreset { +class LIBARDOUR_API ExportPreset { public: ExportPreset (std::string filename, Session & s); ~ExportPreset (); diff --git a/libs/ardour/ardour/export_profile_manager.h b/libs/ardour/ardour/export_profile_manager.h index 424e0fe163..2757795ff3 100644 --- a/libs/ardour/ardour/export_profile_manager.h +++ b/libs/ardour/ardour/export_profile_manager.h @@ -35,6 +35,7 @@ #include "ardour/filesystem_paths.h" #include "ardour/location.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "ardour/export_handler.h" @@ -46,7 +47,7 @@ class Location; class Session; /// Manages (de)serialization of export profiles and related classes -class ExportProfileManager +class LIBARDOUR_API ExportProfileManager { public: @@ -102,7 +103,7 @@ class ExportProfileManager std::vector<std::string> find_file (std::string const & pattern); std::string export_config_dir; - PBD::SearchPath search_path; + PBD::Searchpath search_path; /* Timespans */ public: diff --git a/libs/ardour/ardour/export_status.h b/libs/ardour/ardour/export_status.h index 31027269f8..6a5be177e4 100644 --- a/libs/ardour/ardour/export_status.h +++ b/libs/ardour/ardour/export_status.h @@ -23,6 +23,7 @@ #include <stdint.h> +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "pbd/signals.h" @@ -30,7 +31,7 @@ namespace ARDOUR { -class ExportStatus { +class LIBARDOUR_API ExportStatus { public: ExportStatus (); void init (); diff --git a/libs/ardour/ardour/export_timespan.h b/libs/ardour/ardour/export_timespan.h index 5cb32dbb1a..754335ba48 100644 --- a/libs/ardour/ardour/export_timespan.h +++ b/libs/ardour/ardour/export_timespan.h @@ -25,6 +25,7 @@ #include <boost/shared_ptr.hpp> +#include "ardour/libardour_visibility.h" #include "ardour/types.h" namespace ARDOUR @@ -34,7 +35,7 @@ class ExportStatus; class ExportChannel; class ExportTempFile; -class ExportTimespan +class LIBARDOUR_API ExportTimespan { private: typedef boost::shared_ptr<ExportStatus> ExportStatusPtr; diff --git a/libs/ardour/ardour/file_source.h b/libs/ardour/ardour/file_source.h index 8eebfeac4e..8b8adfeb66 100644 --- a/libs/ardour/ardour/file_source.h +++ b/libs/ardour/ardour/file_source.h @@ -28,7 +28,7 @@ namespace ARDOUR { -class MissingSource : public std::exception +class LIBARDOUR_API MissingSource : public std::exception { public: MissingSource (const std::string& p, DataType t) throw () @@ -42,7 +42,7 @@ class MissingSource : public std::exception }; /** A source associated with a file on disk somewhere */ -class FileSource : virtual public Source { +class LIBARDOUR_API FileSource : virtual public Source { public: virtual ~FileSource (); @@ -80,7 +80,7 @@ public: virtual void set_path (const std::string&); - static PBD::Signal3<int,std::string,std::string,std::vector<std::string> > AmbiguousFileName; + static PBD::Signal2<int,std::string,std::vector<std::string> > AmbiguousFileName; void existence_check (); virtual void prevent_deletion (); diff --git a/libs/ardour/ardour/filename_extensions.h b/libs/ardour/ardour/filename_extensions.h index a7c9274c4a..c0725932fa 100644 --- a/libs/ardour/ardour/filename_extensions.h +++ b/libs/ardour/ardour/filename_extensions.h @@ -21,17 +21,19 @@ #ifndef __ardour_filename_extensions_h__ #define __ardour_filename_extensions_h__ +#include "ardour/libardour_visibility.h" + namespace ARDOUR { -extern const char* const template_suffix; -extern const char* const statefile_suffix; -extern const char* const pending_suffix; -extern const char* const peakfile_suffix; -extern const char* const backup_suffix; -extern const char* const temp_suffix; -extern const char* const history_suffix; -extern const char* const export_preset_suffix; -extern const char* const export_format_suffix; + LIBARDOUR_API extern const char* const template_suffix; + LIBARDOUR_API extern const char* const statefile_suffix; + LIBARDOUR_API extern const char* const pending_suffix; + LIBARDOUR_API extern const char* const peakfile_suffix; + LIBARDOUR_API extern const char* const backup_suffix; + LIBARDOUR_API extern const char* const temp_suffix; + LIBARDOUR_API extern const char* const history_suffix; + LIBARDOUR_API extern const char* const export_preset_suffix; + LIBARDOUR_API extern const char* const export_format_suffix; } diff --git a/libs/ardour/ardour/filesystem_paths.h b/libs/ardour/ardour/filesystem_paths.h index cfeb633597..a6ca2d1c77 100644 --- a/libs/ardour/ardour/filesystem_paths.h +++ b/libs/ardour/ardour/filesystem_paths.h @@ -22,6 +22,8 @@ #include "pbd/search_path.h" +#include "ardour/libardour_visibility.h" + namespace ARDOUR { /** @@ -29,27 +31,41 @@ namespace ARDOUR { * configuration files. * @post user_config_directory() exists */ - std::string user_config_directory (); + LIBARDOUR_API std::string user_config_directory (); + + /** + * @return the path to the directory used to store user specific + * caches (e.g. plugin indices, blacklist/whitelist) + * it defaults to XDG_CACHE_HOME + */ + LIBARDOUR_API std::string user_cache_directory (); + /** * @return the path to the directory that contains the system wide ardour * modules. */ - std::string ardour_dll_directory (); + LIBARDOUR_API std::string ardour_dll_directory (); /** * @return the search path to be used when looking for per-system * configuration files. This may include user configuration files. */ - PBD::SearchPath ardour_config_search_path (); + LIBARDOUR_API PBD::Searchpath ardour_config_search_path (); /** * @return the search path to be used when looking for data files * that could be shared by systems (h/w and configuration independent * files, such as icons, XML files, etc) */ - PBD::SearchPath ardour_data_search_path (); + LIBARDOUR_API PBD::Searchpath ardour_data_search_path (); +#ifdef PLATFORM_WINDOWS + /** + * @return our 'Windows' search path ( corresponds to <install_dir>/share/ardour3 ) + */ + LIBARDOUR_API PBD::Searchpath windows_search_path (); +#endif } // namespace ARDOUR #endif diff --git a/libs/ardour/ardour/filter.h b/libs/ardour/ardour/filter.h index a9cdc893a6..2b6476c49f 100644 --- a/libs/ardour/ardour/filter.h +++ b/libs/ardour/ardour/filter.h @@ -23,6 +23,7 @@ #include <vector> +#include "ardour/libardour_visibility.h" #include "ardour/types.h" namespace ARDOUR { @@ -31,7 +32,7 @@ class Region; class Session; class Progress; -class Filter { +class LIBARDOUR_API Filter { public: virtual ~Filter() {} diff --git a/libs/ardour/ardour/graph.h b/libs/ardour/ardour/graph.h index 763723c792..b433580a54 100644 --- a/libs/ardour/ardour/graph.h +++ b/libs/ardour/ardour/graph.h @@ -33,6 +33,7 @@ #include "pbd/semutils.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "ardour/audio_backend.h" #include "ardour/session_handle.h" @@ -52,7 +53,7 @@ typedef boost::shared_ptr<GraphNode> node_ptr_t; typedef std::list< node_ptr_t > node_list_t; typedef std::set< node_ptr_t > node_set_t; -class Graph : public SessionHandleRef +class LIBARDOUR_API Graph : public SessionHandleRef { public: Graph (Session & session); diff --git a/libs/ardour/ardour/graphnode.h b/libs/ardour/ardour/graphnode.h index 9e0182300f..55867eac4c 100644 --- a/libs/ardour/ardour/graphnode.h +++ b/libs/ardour/ardour/graphnode.h @@ -38,7 +38,7 @@ typedef std::set< node_ptr_t > node_set_t; typedef std::list< node_ptr_t > node_list_t; /** A node on our processing graph, ie a Route */ -class GraphNode +class LIBARDOUR_API GraphNode { public: GraphNode( boost::shared_ptr<Graph> Graph ); diff --git a/libs/ardour/ardour/iec1ppmdsp.h b/libs/ardour/ardour/iec1ppmdsp.h index 0fe11681b1..b6f1501db7 100644 --- a/libs/ardour/ardour/iec1ppmdsp.h +++ b/libs/ardour/ardour/iec1ppmdsp.h @@ -20,8 +20,9 @@ #ifndef __IEC1PPMDSP_H #define __IEC1PPMDSP_H +#include "ardour/libardour_visibility.h" -class Iec1ppmdsp +class LIBARDOUR_API Iec1ppmdsp { public: diff --git a/libs/ardour/ardour/iec2ppmdsp.h b/libs/ardour/ardour/iec2ppmdsp.h index 8e26dd9e74..6a3852da1d 100644 --- a/libs/ardour/ardour/iec2ppmdsp.h +++ b/libs/ardour/ardour/iec2ppmdsp.h @@ -20,8 +20,9 @@ #ifndef __IEC2PPMDSP_H #define __IEC2PPMDSP_H +#include "ardour/libardour_visibility.h" -class Iec2ppmdsp +class LIBARDOUR_API Iec2ppmdsp { public: diff --git a/libs/ardour/ardour/import_status.h b/libs/ardour/ardour/import_status.h index c261b7a960..4dbf8f8456 100644 --- a/libs/ardour/ardour/import_status.h +++ b/libs/ardour/ardour/import_status.h @@ -26,11 +26,12 @@ #include <stdint.h> #include "ardour/interthread_info.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" namespace ARDOUR { -class ImportStatus : public InterThreadInfo { +class LIBARDOUR_API ImportStatus : public InterThreadInfo { public: std::string doing_what; diff --git a/libs/ardour/ardour/importable_source.h b/libs/ardour/ardour/importable_source.h index fc695d88c1..9463f0b28b 100644 --- a/libs/ardour/ardour/importable_source.h +++ b/libs/ardour/ardour/importable_source.h @@ -21,11 +21,12 @@ #define __ardour_importable_source_h__ #include "pbd/failed_constructor.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" namespace ARDOUR { -class ImportableSource { +class LIBARDOUR_API ImportableSource { public: ImportableSource () {} virtual ~ImportableSource() {} diff --git a/libs/ardour/ardour/instrument_info.h b/libs/ardour/ardour/instrument_info.h index 8691db24e5..745e4803c0 100644 --- a/libs/ardour/ardour/instrument_info.h +++ b/libs/ardour/ardour/instrument_info.h @@ -28,19 +28,22 @@ #include "evoral/Parameter.hpp" +#include "midi++/libmidi_visibility.h" +#include "ardour/libardour_visibility.h" + namespace MIDI { -namespace Name { -class ChannelNameSet; -class Patch; -typedef std::list<boost::shared_ptr<Patch> > PatchNameList; -} + namespace Name { + class ChannelNameSet; + class Patch; + typedef std::list<boost::shared_ptr<Patch> > PatchNameList; + } } namespace ARDOUR { class Processor; -class InstrumentInfo { +class LIBARDOUR_API InstrumentInfo { public: InstrumentInfo(); ~InstrumentInfo (); diff --git a/libs/ardour/ardour/internal_return.h b/libs/ardour/ardour/internal_return.h index 4d2b32f031..d12b330e37 100644 --- a/libs/ardour/ardour/internal_return.h +++ b/libs/ardour/ardour/internal_return.h @@ -29,7 +29,7 @@ namespace ARDOUR { class InternalSend; -class InternalReturn : public Return +class LIBARDOUR_API InternalReturn : public Return { public: InternalReturn (Session&); diff --git a/libs/ardour/ardour/internal_send.h b/libs/ardour/ardour/internal_send.h index ea3d645754..6feeb35c6d 100644 --- a/libs/ardour/ardour/internal_send.h +++ b/libs/ardour/ardour/internal_send.h @@ -25,10 +25,10 @@ namespace ARDOUR { -class InternalSend : public Send +class LIBARDOUR_API InternalSend : public Send { public: - InternalSend (Session&, boost::shared_ptr<Pannable>, boost::shared_ptr<MuteMaster>, boost::shared_ptr<Route> send_to, Delivery::Role role = Delivery::Aux, bool ignore_bitslot = false); + InternalSend (Session&, boost::shared_ptr<Pannable>, boost::shared_ptr<MuteMaster>, boost::shared_ptr<Route> send_from, boost::shared_ptr<Route> send_to, Delivery::Role role = Delivery::Aux, bool ignore_bitslot = false); virtual ~InternalSend (); std::string display_name() const; @@ -46,6 +46,7 @@ class InternalSend : public Send bool configure_io (ChanCount in, ChanCount out); int set_block_size (pframes_t); + boost::shared_ptr<Route> source_route() const { return _send_from; } boost::shared_ptr<Route> target_route() const { return _send_to; } const PBD::ID& target_id() const { return _send_to_id; } @@ -60,6 +61,7 @@ class InternalSend : public Send private: BufferSet mixbufs; + boost::shared_ptr<Route> _send_from; boost::shared_ptr<Route> _send_to; PBD::ID _send_to_id; PBD::ScopedConnection connect_c; diff --git a/libs/ardour/ardour/interpolation.h b/libs/ardour/ardour/interpolation.h index a4a332c8a2..64b0431e0f 100644 --- a/libs/ardour/ardour/interpolation.h +++ b/libs/ardour/ardour/interpolation.h @@ -20,6 +20,7 @@ #include <math.h> #include <samplerate.h> +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #ifndef __interpolation_h__ @@ -27,7 +28,7 @@ namespace ARDOUR { -class Interpolation { +class LIBARDOUR_API Interpolation { protected: double _speed; double _target_speed; @@ -57,12 +58,12 @@ public: } }; -class LinearInterpolation : public Interpolation { +class LIBARDOUR_API LinearInterpolation : public Interpolation { public: framecnt_t interpolate (int channel, framecnt_t nframes, Sample* input, Sample* output); }; -class CubicInterpolation : public Interpolation { +class LIBARDOUR_API CubicInterpolation : public Interpolation { public: framecnt_t interpolate (int channel, framecnt_t nframes, Sample* input, Sample* output); }; diff --git a/libs/ardour/ardour/interthread_info.h b/libs/ardour/ardour/interthread_info.h index 01cacf437c..49055de5d0 100644 --- a/libs/ardour/ardour/interthread_info.h +++ b/libs/ardour/ardour/interthread_info.h @@ -22,6 +22,7 @@ #include <pthread.h> +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "ardour/process_thread.h" @@ -29,7 +30,7 @@ namespace ARDOUR { class InterThreadInfo { public: - InterThreadInfo () : done (false), cancel (false), progress (0), thread (0) {} + InterThreadInfo () : done (false), cancel (false), progress (0), thread () {} volatile bool done; volatile bool cancel; diff --git a/libs/ardour/ardour/io.h b/libs/ardour/ardour/io.h index adad0c753f..9afd0167e3 100644 --- a/libs/ardour/ardour/io.h +++ b/libs/ardour/ardour/io.h @@ -23,7 +23,6 @@ #include <string> #include <vector> #include <cmath> -#include <jack/jack.h> #include <glibmm/threads.h> @@ -40,6 +39,7 @@ #include "ardour/latent.h" #include "ardour/port_set.h" #include "ardour/session_object.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "ardour/utils.h" #include "ardour/buffer_set.h" @@ -64,7 +64,7 @@ class UserBundle; * An IO can contain ports of varying types, making routes/inserts/etc with * varied combinations of types (eg MIDI and audio) possible. */ -class IO : public SessionObject, public Latent +class LIBARDOUR_API IO : public SessionObject, public Latent { public: static const std::string state_node_name; diff --git a/libs/ardour/ardour/io_processor.h b/libs/ardour/ardour/io_processor.h index 7adfab2225..a2735453a7 100644 --- a/libs/ardour/ardour/io_processor.h +++ b/libs/ardour/ardour/io_processor.h @@ -40,7 +40,7 @@ class Route; /** A mixer strip element (Processor) with 1 or 2 IO elements. */ -class IOProcessor : public Processor +class LIBARDOUR_API IOProcessor : public Processor { public: IOProcessor (Session&, bool with_input, bool with_output, diff --git a/libs/ardour/ardour/jack_utils.h b/libs/ardour/ardour/jack_utils.h new file mode 100644 index 0000000000..40eb30f9ea --- /dev/null +++ b/libs/ardour/ardour/jack_utils.h @@ -0,0 +1,253 @@ +/* + 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 <stdint.h> + +#include <vector> +#include <map> +#include <string> + +namespace ARDOUR { + + // Names for the drivers on all possible systems + extern const char * const portaudio_driver_name; + extern const char * const coreaudio_driver_name; + extern const char * const alsa_driver_name; + extern const char * const oss_driver_name; + extern const char * const freebob_driver_name; + extern const char * const ffado_driver_name; + extern const char * const netjack_driver_name; + extern const char * const dummy_driver_name; + + /** + * Get a list of possible JACK audio driver names based on platform + */ + void get_jack_audio_driver_names (std::vector<std::string>& driver_names); + + /** + * Get the default JACK audio driver based on platform + */ + void get_jack_default_audio_driver_name (std::string& driver_name); + + /** + * Get a list of possible JACK midi driver names based on platform + */ + void get_jack_midi_system_names (const std::string& driver, std::vector<std::string>& driver_names); + + /** + * Get the default JACK midi driver based on platform + */ + void get_jack_default_midi_system_name (const std::string& driver_name, std::string& midi_system); + + /** + * Get a list of possible samplerates supported be JACK + */ + void get_jack_sample_rate_strings (std::vector<std::string>& sample_rates); + + /** + * @return The default samplerate + */ + std::string get_jack_default_sample_rate (); + + /** + * @return true if sample rate string was able to be converted + */ + bool get_jack_sample_rate_value_from_string (const std::string& srs, uint32_t& srv); + + /** + * Get a list of possible period sizes supported be JACK + */ + void get_jack_period_size_strings (std::vector<std::string>& samplerates); + + /** + * @return The default period size + */ + std::string get_jack_default_period_size (); + + /** + * @return true if period size string was able to be converted + */ + bool get_jack_period_size_value_from_string (const std::string& pss, uint32_t& psv); + + /** + * These are driver specific I think, so it may require a driver arg + * in future + */ + void get_jack_dither_mode_strings (const std::string& driver, std::vector<std::string>& dither_modes); + + /** + * @return The default dither mode + */ + std::string get_jack_default_dither_mode (const std::string& driver); + + /** + * @return Estimate of latency + * + * API matches current use in GUI + */ + std::string get_jack_latency_string (std::string samplerate, float periods, std::string period_size); + + /** + * @return true if a JACK server is running + */ + bool jack_server_running (); + + /** + * Key being a readable name to display in a GUI + * Value being name used in a jack commandline + */ + typedef std::map<std::string, std::string> device_map_t; + + /** + * Use library specific code to find out what what devices exist for a given + * driver that might work in JACK. There is no easy way to find out what + * modules the JACK server supports so guess based on platform. For instance + * portaudio is cross-platform but we only return devices if built for + * windows etc + */ + void get_jack_alsa_device_names (device_map_t& devices); + void get_jack_portaudio_device_names (device_map_t& devices); + void get_jack_coreaudio_device_names (device_map_t& devices); + void get_jack_oss_device_names (device_map_t& devices); + void get_jack_freebob_device_names (device_map_t& devices); + void get_jack_ffado_device_names (device_map_t& devices); + void get_jack_netjack_device_names (device_map_t& devices); + void get_jack_dummy_device_names (device_map_t& devices); + + /* + * @return true if there were devices found for the driver + * + * @param driver The driver name returned by get_jack_audio_driver_names + * @param devices The map used to insert the drivers into, devices will be cleared before + * adding the available drivers + */ + bool get_jack_device_names_for_audio_driver (const std::string& driver, device_map_t& devices); + + /* + * @return a list of readable device names for a specific driver. + */ + std::vector<std::string> get_jack_device_names_for_audio_driver (const std::string& driver); + + /** + * @return true if the driver supports playback and recording + * on separate devices + */ + bool get_jack_audio_driver_supports_two_devices (const std::string& driver); + + bool get_jack_audio_driver_supports_latency_adjustment (const std::string& driver); + + bool get_jack_audio_driver_supports_setting_period_count (const std::string& driver); + + /** + * The possible names to use to try and find servers, this includes + * any file extensions like .exe on Windows + * + * @return true if the JACK application names for this platform could be guessed + */ + bool get_jack_server_application_names (std::vector<std::string>& server_names); + + /** + * Sets the PATH environment variable to contain directories likely to contain + * JACK servers so that if the JACK server is auto-started it can find the server + * executable. + * + * This is only modifies PATH on the mac at the moment. + */ + void set_path_env_for_jack_autostart (const std::vector<std::string>&); + + /** + * Get absolute paths to directories that might contain JACK servers on the system + * + * @return true if !server_paths.empty() + */ + bool get_jack_server_dir_paths (std::vector<std::string>& server_dir_paths); + + /** + * Get absolute paths to JACK servers on the system + * + * @return true if a server was found + */ + bool get_jack_server_paths (const std::vector<std::string>& server_dir_paths, + const std::vector<std::string>& server_names, + std::vector<std::string>& server_paths); + + + bool get_jack_server_paths (std::vector<std::string>& server_paths); + + /** + * Get absolute path to default JACK server + */ + bool get_jack_default_server_path (std::string& server_path); + + /** + * @return The name of the jack server config file + */ + std::string get_jack_server_config_file_name (); + + std::string get_jack_server_user_config_dir_path (); + + std::string get_jack_server_user_config_file_path (); + + bool write_jack_config_file (const std::string& config_file_path, const std::string& command_line); + + struct JackCommandLineOptions { + + // see implementation for defaults + JackCommandLineOptions (); + + //operator bool + //operator ostream + + std::string server_path; + uint32_t timeout; + bool no_mlock; + uint32_t ports_max; + bool realtime; + uint32_t priority; + bool unlock_gui_libs; + bool verbose; + bool temporary; + bool playback_only; + bool capture_only; + std::string driver; + std::string input_device; + std::string output_device; + uint32_t num_periods; + uint32_t period_size; + uint32_t samplerate; + uint32_t input_latency; + uint32_t output_latency; + bool hardware_metering; + bool hardware_monitoring; + std::string dither_mode; + bool force16_bit; + bool soft_mode; + std::string midi_driver; + }; + + /** + * @return true if able to build a valid command line based on options + */ + bool get_jack_command_line_string (const JackCommandLineOptions& options, std::string& command_line); + + /** + * We don't need this at the moment because the gui stores all its settings + */ + //std::string get_jack_command_line_from_config_file (const std::string& config_file_path); +} diff --git a/libs/ardour/ardour/kmeterdsp.h b/libs/ardour/ardour/kmeterdsp.h index 69d1215b98..7fe2b9d11b 100644 --- a/libs/ardour/ardour/kmeterdsp.h +++ b/libs/ardour/ardour/kmeterdsp.h @@ -20,7 +20,9 @@ #ifndef __KMETERDSP_H #define __KMETERDSP_H -class Kmeterdsp +#include "ardour/libardour_visibility.h" + +class LIBARDOUR_API Kmeterdsp { public: diff --git a/libs/ardour/ardour/ladspa_plugin.h b/libs/ardour/ardour/ladspa_plugin.h index 6853a1dc36..473953e221 100644 --- a/libs/ardour/ardour/ladspa_plugin.h +++ b/libs/ardour/ardour/ladspa_plugin.h @@ -23,12 +23,11 @@ #include <set> #include <vector> #include <string> -#include <dlfcn.h> +#include <glibmm/module.h> #include "pbd/stateful.h" -#include <jack/types.h> #include "ardour/ladspa.h" #include "ardour/plugin.h" @@ -36,10 +35,10 @@ namespace ARDOUR { class AudioEngine; class Session; -class LadspaPlugin : public ARDOUR::Plugin +class LIBARDOUR_API LadspaPlugin : public ARDOUR::Plugin { public: - LadspaPlugin (void *module, ARDOUR::AudioEngine&, ARDOUR::Session&, uint32_t index, framecnt_t sample_rate); + LadspaPlugin (std::string module_path, ARDOUR::AudioEngine&, ARDOUR::Session&, uint32_t index, framecnt_t sample_rate); LadspaPlugin (const LadspaPlugin &); ~LadspaPlugin (); @@ -122,7 +121,8 @@ class LadspaPlugin : public ARDOUR::Plugin void connect_port (uint32_t port, float *ptr) { _descriptor->connect_port (_handle, port, ptr); } private: - void* _module; + std::string _module_path; + Glib::Module* _module; const LADSPA_Descriptor* _descriptor; LADSPA_Handle _handle; framecnt_t _sample_rate; @@ -134,7 +134,7 @@ class LadspaPlugin : public ARDOUR::Plugin void find_presets (); - void init (void *mod, uint32_t index, framecnt_t rate); + void init (std::string module_path, uint32_t index, framecnt_t rate); void run_in_place (pframes_t nsamples); void latency_compute_run (); int set_state_2X (const XMLNode&, int version); @@ -146,7 +146,7 @@ class LadspaPlugin : public ARDOUR::Plugin void add_state (XMLNode *) const; }; -class LadspaPluginInfo : public PluginInfo { +class LIBARDOUR_API LadspaPluginInfo : public PluginInfo { public: LadspaPluginInfo (); ~LadspaPluginInfo () { }; diff --git a/libs/ardour/ardour/latent.h b/libs/ardour/ardour/latent.h index c6e81c17a2..bd639a8651 100644 --- a/libs/ardour/ardour/latent.h +++ b/libs/ardour/ardour/latent.h @@ -20,11 +20,12 @@ #ifndef __ardour_latent_h__ #define __ardour_latent_h__ +#include "ardour/libardour_visibility.h" #include "ardour/types.h" namespace ARDOUR { -class Latent { +class LIBARDOUR_API Latent { public: Latent() : _user_latency (0) {} virtual ~Latent() {} diff --git a/libs/ardour/ardour/libardour_visibility.h b/libs/ardour/ardour/libardour_visibility.h new file mode 100644 index 0000000000..917307732c --- /dev/null +++ b/libs/ardour/ardour/libardour_visibility.h @@ -0,0 +1,45 @@ +/* + Copyright (C) 2013 Paul Davis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#ifndef __libardour_libardour_visibility_h__ +#define __libardour_libardour_visibility_h__ + +#if defined(COMPILER_MSVC) + #define LIBARDOUR_DLL_IMPORT __declspec(dllimport) + #define LIBARDOUR_DLL_EXPORT __declspec(dllexport) + #define LIBARDOUR_DLL_LOCAL +#else + #define LIBARDOUR_DLL_IMPORT __attribute__ ((visibility ("default"))) + #define LIBARDOUR_DLL_EXPORT __attribute__ ((visibility ("default"))) + #define LIBARDOUR_DLL_LOCAL __attribute__ ((visibility ("hidden"))) +#endif + +#ifdef LIBARDOUR_STATIC // libardour is not a DLL +#define LIBARDOUR_API +#define LIBARDOUR_LOCAL +#else + #ifdef LIBARDOUR_DLL_EXPORTS // defined if we are building the libardour DLL (instead of using it) + #define LIBARDOUR_API LIBARDOUR_DLL_EXPORT + #else + #define LIBARDOUR_API LIBARDOUR_DLL_IMPORT + #endif + #define LIBARDOUR_LOCAL LIBARDOUR_DLL_LOCAL +#endif + +#endif /* __libardour_libardour_visibility_h__ */ diff --git a/libs/ardour/ardour/linux_vst_support.h b/libs/ardour/ardour/linux_vst_support.h index c99c4a8cb3..8575e2a72a 100644 --- a/libs/ardour/ardour/linux_vst_support.h +++ b/libs/ardour/ardour/linux_vst_support.h @@ -25,44 +25,43 @@ #include <pthread.h> #include <stdio.h> +#include "ardour/libardour_visibility.h" #include "ardour/vst_types.h" /******************************************************************************************/ /*VSTFX - an engine to manage native linux VST plugins - derived from FST for Windows VSTs*/ /******************************************************************************************/ -extern void (*vstfx_error_callback)(const char *msg); +LIBARDOUR_API extern void (*vstfx_error_callback)(const char *msg); -void vstfx_set_error_function (void (*func)(const char *)); +LIBARDOUR_API void vstfx_set_error_function (void (*func)(const char *)); -void vstfx_error (const char *fmt, ...); +LIBARDOUR_API void vstfx_error (const char *fmt, ...); /*API to vstfx*/ -extern int vstfx_launch_editor (VSTState *); -extern int vstfx_init (void *); -extern void vstfx_exit (); -extern VSTHandle * vstfx_load (const char*); -extern int vstfx_unload (VSTHandle *); -extern VSTState * vstfx_instantiate (VSTHandle *, audioMasterCallback, void *); -extern void vstfx_close (VSTState*); +LIBARDOUR_API extern int vstfx_launch_editor (VSTState *); +LIBARDOUR_API extern int vstfx_init (void *); +LIBARDOUR_API extern void vstfx_exit (); +LIBARDOUR_API extern VSTHandle * vstfx_load (const char*); +LIBARDOUR_API extern int vstfx_unload (VSTHandle *); -extern int vstfx_create_editor (VSTState *); -extern int vstfx_run_editor (VSTState *); -extern void vstfx_destroy_editor (VSTState *); +LIBARDOUR_API extern VSTState * vstfx_instantiate (VSTHandle *, audioMasterCallback, void *); +LIBARDOUR_API extern void vstfx_close (VSTState*); -extern VSTInfo * vstfx_get_info (char *); -extern void vstfx_free_info (VSTInfo *); -extern void vstfx_event_loop_remove_plugin (VSTState *); -extern int vstfx_call_dispatcher (VSTState *, int, int, int, void *, float); +LIBARDOUR_API extern int vstfx_create_editor (VSTState *); +LIBARDOUR_API extern int vstfx_run_editor (VSTState *); +LIBARDOUR_API extern void vstfx_destroy_editor (VSTState *); + +LIBARDOUR_API extern void vstfx_event_loop_remove_plugin (VSTState *); +LIBARDOUR_API extern int vstfx_call_dispatcher (VSTState *, int, int, int, void *, float); /** Load a plugin state from a file.**/ -extern int vstfx_load_state (VSTState* vstfx, char * filename); +LIBARDOUR_API extern int vstfx_load_state (VSTState* vstfx, char * filename); /** Save a plugin state to a file.**/ -extern bool vstfx_save_state (VSTState* vstfx, char * filename); - +LIBARDOUR_API extern bool vstfx_save_state (VSTState* vstfx, char * filename); #endif /* __vstfx_h__ */ diff --git a/libs/ardour/ardour/location.h b/libs/ardour/ardour/location.h index bb42df1b58..6cea208f05 100644 --- a/libs/ardour/ardour/location.h +++ b/libs/ardour/ardour/location.h @@ -34,11 +34,14 @@ #include "pbd/statefuldestructible.h" #include "ardour/ardour.h" +#include "ardour/scene_change.h" #include "ardour/session_handle.h" namespace ARDOUR { -class Location : public SessionHandleRef, public PBD::StatefulDestructible +class SceneChange; + +class LIBARDOUR_API Location : public SessionHandleRef, public PBD::StatefulDestructible { public: enum Flags { @@ -93,6 +96,9 @@ class Location : public SessionHandleRef, public PBD::StatefulDestructible Flags flags () const { return _flags; } + boost::shared_ptr<SceneChange> scene_change() const { return _scene_change; } + void set_scene_change (boost::shared_ptr<SceneChange>); + PBD::Signal1<void,Location*> name_changed; PBD::Signal1<void,Location*> end_changed; PBD::Signal1<void,Location*> start_changed; @@ -116,6 +122,8 @@ class Location : public SessionHandleRef, public PBD::StatefulDestructible void set_position_lock_style (PositionLockStyle ps); void recompute_frames_from_bbt (); + static PBD::Signal0<void> scene_changed; + private: std::string _name; framepos_t _start; @@ -125,13 +133,14 @@ class Location : public SessionHandleRef, public PBD::StatefulDestructible Flags _flags; bool _locked; PositionLockStyle _position_lock_style; + boost::shared_ptr<SceneChange> _scene_change; void set_mark (bool yn); bool set_flag_internal (bool yn, Flags flag); void recompute_bbt_from_frames (); }; -class Locations : public SessionHandleRef, public PBD::StatefulDestructible +class LIBARDOUR_API Locations : public SessionHandleRef, public PBD::StatefulDestructible { public: typedef std::list<Location *> LocationList; @@ -161,6 +170,8 @@ class Locations : public SessionHandleRef, public PBD::StatefulDestructible int set_current (Location *, bool want_lock = true); Location *current () const { return current_location; } + Location* mark_at (framepos_t, framecnt_t slop = 0) const; + framepos_t first_mark_before (framepos_t, bool include_special_ranges = false); framepos_t first_mark_after (framepos_t, bool include_special_ranges = false); diff --git a/libs/ardour/ardour/location_importer.h b/libs/ardour/ardour/location_importer.h index 332c5ae685..574b948062 100644 --- a/libs/ardour/ardour/location_importer.h +++ b/libs/ardour/ardour/location_importer.h @@ -33,14 +33,14 @@ namespace ARDOUR { class Location; class Session; -class LocationImportHandler : public ElementImportHandler +class LIBARDOUR_API LocationImportHandler : public ElementImportHandler { public: LocationImportHandler (XMLTree const & source, Session & session); std::string get_info () const; }; -class LocationImporter : public ElementImporter +class LIBARDOUR_API LocationImporter : public ElementImporter { public: LocationImporter (XMLTree const & source, Session & session, LocationImportHandler & handler, XMLNode const & node); diff --git a/libs/ardour/ardour/logcurve.h b/libs/ardour/ardour/logcurve.h index 4c91ad9a79..2585da66c8 100644 --- a/libs/ardour/ardour/logcurve.h +++ b/libs/ardour/ardour/logcurve.h @@ -25,7 +25,7 @@ namespace ARDOUR { -class LogCurve { +class LIBARDOUR_API LogCurve { public: LogCurve (float steepness = 0.2, uint32_t len = 0) { l = len; @@ -102,7 +102,7 @@ class LogCurve { uint32_t l; }; -class LogCurveIn : public LogCurve +class LIBARDOUR_API LogCurveIn : public LogCurve { public: LogCurveIn (float steepness = 0.2, uint32_t len = 0) @@ -117,7 +117,7 @@ class LogCurveIn : public LogCurve } }; -class LogCurveOut : public LogCurve +class LIBARDOUR_API LogCurveOut : public LogCurve { public: LogCurveOut (float steepness = 0.2, uint32_t len = 0) diff --git a/libs/ardour/ardour/lv2_plugin.h b/libs/ardour/ardour/lv2_plugin.h index 56aa9dc7cf..034101ee41 100644 --- a/libs/ardour/ardour/lv2_plugin.h +++ b/libs/ardour/ardour/lv2_plugin.h @@ -29,6 +29,8 @@ #include "ardour/worker.h" #include "pbd/ringbuffer.h" +typedef struct LV2_Evbuf_Impl LV2_Evbuf; + namespace ARDOUR { // a callback function for lilv_state_new_from_instance(). friend of LV2Plugin @@ -41,7 +43,7 @@ const void* lv2plugin_get_port_value(const char* port_symbol, class AudioEngine; class Session; -class LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee +class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee { public: LV2Plugin (ARDOUR::AudioEngine& engine, @@ -270,7 +272,7 @@ class LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee }; -class LV2PluginInfo : public PluginInfo { +class LIBARDOUR_API LV2PluginInfo : public PluginInfo { public: LV2PluginInfo (const void* c_plugin); ~LV2PluginInfo (); diff --git a/libs/ardour/ardour/lxvst_plugin.h b/libs/ardour/ardour/lxvst_plugin.h index 58bc626d32..cc6f507144 100644 --- a/libs/ardour/ardour/lxvst_plugin.h +++ b/libs/ardour/ardour/lxvst_plugin.h @@ -30,17 +30,17 @@ namespace ARDOUR { class AudioEngine; class Session; -class LXVSTPlugin : public VSTPlugin +class LIBARDOUR_API LXVSTPlugin : public VSTPlugin { public: - LXVSTPlugin (AudioEngine &, Session &, VSTHandle *); + LXVSTPlugin (AudioEngine &, Session &, VSTHandle *, int unique_id); LXVSTPlugin (const LXVSTPlugin &); ~LXVSTPlugin (); std::string state_node_name () const { return "lxvst"; } }; -class LXVSTPluginInfo : public PluginInfo +class LIBARDOUR_API LXVSTPluginInfo : public PluginInfo { public: LXVSTPluginInfo (); diff --git a/libs/ardour/ardour/meter.h b/libs/ardour/ardour/meter.h index df1e381bb4..8ed1ade50d 100644 --- a/libs/ardour/ardour/meter.h +++ b/libs/ardour/ardour/meter.h @@ -20,6 +20,7 @@ #define __ardour_meter_h__ #include <vector> +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "ardour/processor.h" #include "pbd/fastlog.h" @@ -35,7 +36,7 @@ class BufferSet; class ChanCount; class Session; -class Metering { +class LIBARDOUR_API Metering { public: static void update_meters (); static PBD::Signal0<void> Meter; @@ -47,7 +48,7 @@ class Metering { /** Meters peaks on the input and stores them for access. */ -class PeakMeter : public Processor { +class LIBARDOUR_API PeakMeter : public Processor { public: PeakMeter(Session& s, const std::string& name); ~PeakMeter(); diff --git a/libs/ardour/ardour/midi_automation_list_binder.h b/libs/ardour/ardour/midi_automation_list_binder.h index 89c6cdb90b..241c4e7320 100644 --- a/libs/ardour/ardour/midi_automation_list_binder.h +++ b/libs/ardour/ardour/midi_automation_list_binder.h @@ -27,7 +27,7 @@ class MidiSource; class AutomationList; /** A class for late-binding a MidiSource and a Parameter to an AutomationList */ -class MidiAutomationListBinder : public MementoCommandBinder<ARDOUR::AutomationList> +class LIBARDOUR_API MidiAutomationListBinder : public MementoCommandBinder<ARDOUR::AutomationList> { public: MidiAutomationListBinder (boost::shared_ptr<ARDOUR::MidiSource>, Evoral::Parameter); diff --git a/libs/ardour/ardour/midi_buffer.h b/libs/ardour/ardour/midi_buffer.h index c67eef178a..2e2cbf6504 100644 --- a/libs/ardour/ardour/midi_buffer.h +++ b/libs/ardour/ardour/midi_buffer.h @@ -29,7 +29,7 @@ namespace ARDOUR { /** Buffer containing 8-bit unsigned char (MIDI) data. */ -class MidiBuffer : public Buffer +class LIBARDOUR_API MidiBuffer : public Buffer { public: typedef framepos_t TimeType; @@ -45,23 +45,27 @@ public: bool push_back(const Evoral::MIDIEvent<TimeType>& event); bool push_back(TimeType time, size_t size, const uint8_t* data); + uint8_t* reserve(TimeType time, size_t size); void resize(size_t); size_t size() const { return _size; } bool empty() const { return _size == 0; } + bool insert_event(const Evoral::MIDIEvent<TimeType>& event); bool merge_in_place(const MidiBuffer &other); template<typename BufferType, typename EventType> - class iterator_base { + class iterator_base + { public: - iterator_base<BufferType, EventType>(BufferType& b, framecnt_t o) - : buffer(&b), offset(o) {} - iterator_base<BufferType, EventType>(const iterator_base<BufferType,EventType>& o) - : buffer (o.buffer), offset(o.offset) {} - - inline iterator_base<BufferType,EventType> operator= (const iterator_base<BufferType,EventType>& o) { + iterator_base<BufferType, EventType>(BufferType& b, framecnt_t o) + : buffer(&b), offset(o) {} + + iterator_base<BufferType, EventType>(const iterator_base<BufferType,EventType>& o) + : buffer (o.buffer), offset(o.offset) {} + + inline iterator_base<BufferType,EventType> operator= (const iterator_base<BufferType,EventType>& o) { if (&o != this) { buffer = o.buffer; offset = o.offset; @@ -77,6 +81,7 @@ public: *((TimeType*)(buffer->_data + offset)), event_size, ev_start); } + inline EventType operator*() { uint8_t* ev_start = buffer->_data + offset + sizeof(TimeType); int event_size = Evoral::midi_event_size(ev_start); @@ -86,6 +91,10 @@ public: event_size, ev_start); } + inline TimeType * timeptr() { + return ((TimeType*)(buffer->_data + offset)); + } + inline iterator_base<BufferType, EventType>& operator++() { uint8_t* ev_start = buffer->_data + offset + sizeof(TimeType); int event_size = Evoral::midi_event_size(ev_start); @@ -93,12 +102,15 @@ public: offset += sizeof(TimeType) + event_size; return *this; } + inline bool operator!=(const iterator_base<BufferType, EventType>& other) const { return (buffer != other.buffer) || (offset != other.offset); } + inline bool operator==(const iterator_base<BufferType, EventType>& other) const { return (buffer == other.buffer) && (offset == other.offset); } + BufferType* buffer; size_t offset; }; @@ -112,7 +124,7 @@ public: const_iterator begin() const { return const_iterator(*this, 0); } const_iterator end() const { return const_iterator(*this, _size); } - iterator erase(const iterator& i) { + iterator erase(const iterator& i) { assert (i.buffer == this); uint8_t* ev_start = _data + i.offset + sizeof (TimeType); int event_size = Evoral::midi_event_size (ev_start); @@ -124,7 +136,7 @@ public: size_t total_data_deleted = sizeof(TimeType) + event_size; - if (i.offset + total_data_deleted >= _size) { + if (i.offset + total_data_deleted > _size) { _size = 0; return end(); } @@ -155,7 +167,7 @@ public: * its MIDI status byte. */ static bool second_simultaneous_midi_byte_is_first (uint8_t, uint8_t); - + private: friend class iterator_base< MidiBuffer, Evoral::MIDIEvent<TimeType> >; friend class iterator_base< const MidiBuffer, const Evoral::MIDIEvent<TimeType> >; @@ -164,7 +176,6 @@ private: pframes_t _size; }; - } // namespace ARDOUR #endif // __ardour_midi_buffer_h__ diff --git a/libs/ardour/ardour/midi_diskstream.h b/libs/ardour/ardour/midi_diskstream.h index 6401554711..91fb891f17 100644 --- a/libs/ardour/ardour/midi_diskstream.h +++ b/libs/ardour/ardour/midi_diskstream.h @@ -52,7 +52,7 @@ class SMFSource; class Send; class Session; -class MidiDiskstream : public Diskstream +class LIBARDOUR_API MidiDiskstream : public Diskstream { public: MidiDiskstream (Session &, const string& name, Diskstream::Flag f = Recordable); @@ -76,6 +76,7 @@ class MidiDiskstream : public Diskstream int use_copy_playlist (); bool set_name (std::string const &); + bool set_write_source_name (const std::string& str); /* stateful */ XMLNode& get_state(void); @@ -173,6 +174,7 @@ class MidiDiskstream : public Diskstream gint _frames_read_from_ringbuffer; volatile gint _frames_pending_write; volatile gint _num_captured_loops; + framepos_t _accumulated_capture_offset; /** A buffer that we use to put newly-arrived MIDI data in for the GUI to read (so that it can update itself). diff --git a/libs/ardour/ardour/midi_model.h b/libs/ardour/ardour/midi_model.h index 3ecfca7d1c..dc1c7af0e9 100644 --- a/libs/ardour/ardour/midi_model.h +++ b/libs/ardour/ardour/midi_model.h @@ -27,10 +27,12 @@ #include <boost/utility.hpp> #include <glibmm/threads.h> #include "pbd/command.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "ardour/midi_buffer.h" #include "ardour/midi_ring_buffer.h" #include "ardour/automatable_sequence.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "evoral/Note.hpp" #include "evoral/Sequence.hpp" @@ -47,7 +49,7 @@ class MidiSource; * Because of this MIDI controllers and automatable controllers/widgets/etc * are easily interchangeable. */ -class MidiModel : public AutomatableSequence<Evoral::MusicalTime> { +class LIBARDOUR_API MidiModel : public AutomatableSequence<Evoral::MusicalTime> { public: typedef Evoral::MusicalTime TimeType; @@ -56,7 +58,7 @@ public: NoteMode note_mode() const { return (percussive() ? Percussive : Sustained); } void set_note_mode(NoteMode mode) { set_percussive(mode == Percussive); }; - class DiffCommand : public Command { + class LIBARDOUR_API DiffCommand : public Command { public: DiffCommand (boost::shared_ptr<MidiModel> m, const std::string& name); @@ -77,7 +79,7 @@ public: }; - class NoteDiffCommand : public DiffCommand { + class LIBARDOUR_API NoteDiffCommand : public DiffCommand { public: NoteDiffCommand (boost::shared_ptr<MidiModel> m, const std::string& name) : DiffCommand (m, name) {} @@ -143,7 +145,7 @@ public: }; /* Currently this class only supports changes of sys-ex time, but could be expanded */ - class SysExDiffCommand : public DiffCommand { + class LIBARDOUR_API SysExDiffCommand : public DiffCommand { public: SysExDiffCommand (boost::shared_ptr<MidiModel> m, const XMLNode& node); @@ -178,7 +180,7 @@ public: Change unmarshal_change (XMLNode *); }; - class PatchChangeDiffCommand : public DiffCommand { + class LIBARDOUR_API PatchChangeDiffCommand : public DiffCommand { public: PatchChangeDiffCommand (boost::shared_ptr<MidiModel>, const std::string &); PatchChangeDiffCommand (boost::shared_ptr<MidiModel>, const XMLNode &); @@ -220,6 +222,8 @@ public: uint8_t new_program; int new_bank; }; + + Change() : patch_id (-1) {} }; typedef std::list<Change> ChangeList; diff --git a/libs/ardour/ardour/midi_operator.h b/libs/ardour/ardour/midi_operator.h index c5def76384..00678a2831 100644 --- a/libs/ardour/ardour/midi_operator.h +++ b/libs/ardour/ardour/midi_operator.h @@ -32,7 +32,7 @@ namespace ARDOUR { class MidiModel; -class MidiOperator { +class LIBARDOUR_API MidiOperator { public: MidiOperator () {} virtual ~MidiOperator() {} diff --git a/libs/ardour/ardour/midi_patch_manager.h b/libs/ardour/ardour/midi_patch_manager.h index 77e63a2791..cd898aa00f 100644 --- a/libs/ardour/ardour/midi_patch_manager.h +++ b/libs/ardour/ardour/midi_patch_manager.h @@ -35,7 +35,7 @@ namespace MIDI namespace Name { -class MidiPatchManager : public PBD::ScopedConnectionList, public ARDOUR::SessionHandlePtr +class LIBARDOUR_API MidiPatchManager : public PBD::ScopedConnectionList, public ARDOUR::SessionHandlePtr { /// Singleton private: diff --git a/libs/ardour/ardour/midi_patch_search_path.h b/libs/ardour/ardour/midi_patch_search_path.h deleted file mode 100644 index 5d27823461..0000000000 --- a/libs/ardour/ardour/midi_patch_search_path.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - Copyright (C) 2011 Paul Davis - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -#ifndef __ardour_midi_patch_search_path_h__ -#define __ardour_midi_patch_search_path_h__ - -#include "pbd/search_path.h" - -namespace ARDOUR { - - /** - * return a SearchPath containing directories in which to look for - * MIDI patch files ("*.midnam") aka MIDNAM files - * - * If ARDOUR_MIDI_PATCH_PATH is defined then the SearchPath returned - * will contain only those directories specified in it, otherwise it will - * contain the user and system directories which may contain control - * surface plugins. - */ - PBD::SearchPath midi_patch_search_path (); - -} // namespace ARDOUR - -#endif /* __ardour_midi_patch_search_path_h__ */ diff --git a/libs/ardour/ardour/midi_playlist.h b/libs/ardour/ardour/midi_playlist.h index 543e1b353f..b118214c9e 100644 --- a/libs/ardour/ardour/midi_playlist.h +++ b/libs/ardour/ardour/midi_playlist.h @@ -32,12 +32,11 @@ namespace ARDOUR { class Session; -class Region; class MidiRegion; class Source; template<typename T> class MidiRingBuffer; -class MidiPlaylist : public ARDOUR::Playlist +class LIBARDOUR_API MidiPlaylist : public ARDOUR::Playlist { public: MidiPlaylist (Session&, const XMLNode&, bool hidden = false); diff --git a/libs/ardour/ardour/midi_playlist_source.h b/libs/ardour/ardour/midi_playlist_source.h index 5e3bb0de67..7a61f5aa02 100644 --- a/libs/ardour/ardour/midi_playlist_source.h +++ b/libs/ardour/ardour/midi_playlist_source.h @@ -32,7 +32,7 @@ namespace ARDOUR { class MidiPlaylist; -class MidiPlaylistSource : public MidiSource, public PlaylistSource { +class LIBARDOUR_API MidiPlaylistSource : public MidiSource, public PlaylistSource { public: virtual ~MidiPlaylistSource (); diff --git a/libs/ardour/ardour/midi_port.h b/libs/ardour/ardour/midi_port.h index 00617d90ec..cc9fee1b15 100644 --- a/libs/ardour/ardour/midi_port.h +++ b/libs/ardour/ardour/midi_port.h @@ -31,7 +31,7 @@ namespace ARDOUR { class MidiEngine; -class MidiPort : public Port { +class LIBARDOUR_API MidiPort : public Port { public: ~MidiPort(); diff --git a/libs/ardour/ardour/midi_region.h b/libs/ardour/ardour/midi_region.h index 91e048c03e..38229b998b 100644 --- a/libs/ardour/ardour/midi_region.h +++ b/libs/ardour/ardour/midi_region.h @@ -34,9 +34,9 @@ namespace ARDOUR { property, but it allows us to signal changes to the MidiModel used by the MidiRegion */ - extern PBD::PropertyDescriptor<void*> midi_data; - extern PBD::PropertyDescriptor<Evoral::MusicalTime> start_beats; - extern PBD::PropertyDescriptor<Evoral::MusicalTime> length_beats; + LIBARDOUR_API extern PBD::PropertyDescriptor<void*> midi_data; + LIBARDOUR_API extern PBD::PropertyDescriptor<Evoral::MusicalTime> start_beats; + LIBARDOUR_API extern PBD::PropertyDescriptor<Evoral::MusicalTime> length_beats; } } @@ -53,9 +53,10 @@ class MidiFilter; class MidiModel; class MidiSource; class MidiStateTracker; + template<typename T> class MidiRingBuffer; -class MidiRegion : public Region +class LIBARDOUR_API MidiRegion : public Region { public: static void make_property_quarks (); diff --git a/libs/ardour/ardour/midi_ring_buffer.h b/libs/ardour/ardour/midi_ring_buffer.h index d5c9947b9a..78d14b9185 100644 --- a/libs/ardour/ardour/midi_ring_buffer.h +++ b/libs/ardour/ardour/midi_ring_buffer.h @@ -24,6 +24,7 @@ #include "evoral/EventRingBuffer.hpp" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "ardour/midi_state_tracker.h" @@ -40,7 +41,7 @@ class MidiBuffer; * [timestamp][type][size][size bytes of raw MIDI][timestamp][type][size](etc...) */ template<typename T> -class MidiRingBuffer : public Evoral::EventRingBuffer<T> { +class /*LIBARDOUR_API*/ MidiRingBuffer : public Evoral::EventRingBuffer<T> { public: /** @param size Size in bytes. */ diff --git a/libs/ardour/ardour/midi_scene_change.h b/libs/ardour/ardour/midi_scene_change.h new file mode 100644 index 0000000000..1a27446367 --- /dev/null +++ b/libs/ardour/ardour/midi_scene_change.h @@ -0,0 +1,63 @@ +/* + Copyright (C) 2014 Paul Davis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#ifndef __libardour_midi_scene_change_h__ +#define __libardour_midi_scene_change_h__ + +#include "evoral/PatchChange.hpp" + +#include "ardour/scene_change.h" + +namespace ARDOUR +{ + +class MidiPort; + +class MIDISceneChange : public SceneChange +{ + public: + MIDISceneChange (int channel, int bank = -1, int program = -1); + MIDISceneChange (const XMLNode&, int version); + ~MIDISceneChange (); + + void set_channel (int channel); + void set_program (int program); + void set_bank (int bank); + + int channel () const { return _channel; } + int program () const { return _program; } + int bank () const { return _bank; } + + size_t get_bank_msb_message (uint8_t* buf, size_t size) const; + size_t get_bank_lsb_message (uint8_t* buf, size_t size) const; + size_t get_program_message (uint8_t* buf, size_t size) const; + + XMLNode& get_state(); + int set_state (const XMLNode&, int version); + + private: + int _bank; + int _program; + uint8_t _channel; +}; + +} /* namespace */ + + +#endif /* __libardour_scene_change_h__ */ diff --git a/libs/ardour/ardour/midi_scene_changer.h b/libs/ardour/ardour/midi_scene_changer.h new file mode 100644 index 0000000000..e2c62a2656 --- /dev/null +++ b/libs/ardour/ardour/midi_scene_changer.h @@ -0,0 +1,75 @@ +/* + Copyright (C) 2014 Paul Davis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#ifndef __libardour_midi_scene_changer_h__ +#define __libardour_midi_scene_changer_h__ + +#include <glibmm/threads.h> + +#include "ardour/scene_changer.h" + +namespace ARDOUR +{ + +class MIDISceneChanger : public SceneChanger +{ + public: + MIDISceneChanger (Session&); + ~MIDISceneChanger (); + + void run (framepos_t start, framepos_t end); + void set_input_port (MIDI::Port*); + void set_output_port (boost::shared_ptr<MidiPort>); + + uint8_t bank_at (framepos_t, uint8_t channel); + uint8_t program_at (framepos_t, uint8_t channel); + + void set_recording (bool); + void locate (framepos_t); + + private: + typedef std::multimap<framepos_t,boost::shared_ptr<MIDISceneChange> > Scenes; + + MIDI::Port* input_port; + boost::shared_ptr<MidiPort> output_port; + Glib::Threads::RWLock scene_lock; + Scenes scenes; + bool _recording; + framepos_t last_bank_message_time; + framepos_t last_program_message_time; + unsigned short current_bank; + int last_delivered_program; + int last_delivered_bank; + + void gather (); + bool recording () const; + void jump_to (int bank, int program); + void rt_deliver (MidiBuffer&, framepos_t, boost::shared_ptr<MIDISceneChange>); + void non_rt_deliver (boost::shared_ptr<MIDISceneChange>); + + void bank_change_input (MIDI::Parser&, unsigned short, int channel); + void program_change_input (MIDI::Parser&, MIDI::byte, int channel); + void locations_changed (Locations::Change); + + PBD::ScopedConnectionList incoming_connections; +}; + +} // namespace + +#endif /* __libardour_midi_scene_changer_h__ */ diff --git a/libs/ardour/ardour/midi_source.h b/libs/ardour/ardour/midi_source.h index 6a21c03856..07a32c5bfc 100644 --- a/libs/ardour/ardour/midi_source.h +++ b/libs/ardour/ardour/midi_source.h @@ -36,10 +36,11 @@ namespace ARDOUR { class MidiStateTracker; class MidiModel; + template<typename T> class MidiRingBuffer; /** Source for MIDI data */ -class MidiSource : virtual public Source, public boost::enable_shared_from_this<MidiSource> +class LIBARDOUR_API MidiSource : virtual public Source, public boost::enable_shared_from_this<MidiSource> { public: typedef double TimeType; diff --git a/libs/ardour/ardour/midi_state_tracker.h b/libs/ardour/ardour/midi_state_tracker.h index 24d3ab73a1..046e77f38c 100644 --- a/libs/ardour/ardour/midi_state_tracker.h +++ b/libs/ardour/ardour/midi_state_tracker.h @@ -27,12 +27,13 @@ template <typename T> class EventSink; } namespace ARDOUR { + class MidiSource; /** Tracks played notes, so they can be resolved in potential stuck note * situations (e.g. looping, transport stop, etc). */ -class MidiStateTracker +class LIBARDOUR_API MidiStateTracker { public: MidiStateTracker(); diff --git a/libs/ardour/ardour/midi_stretch.h b/libs/ardour/ardour/midi_stretch.h index 42b201b55a..b6f6ac5073 100644 --- a/libs/ardour/ardour/midi_stretch.h +++ b/libs/ardour/ardour/midi_stretch.h @@ -25,7 +25,7 @@ namespace ARDOUR { -class MidiStretch : public Filter { +class LIBARDOUR_API MidiStretch : public Filter { public: MidiStretch (ARDOUR::Session&, const TimeFXRequest&); ~MidiStretch (); diff --git a/libs/ardour/ardour/midi_track.h b/libs/ardour/ardour/midi_track.h index 3b75c0a51b..1acec0346e 100644 --- a/libs/ardour/ardour/midi_track.h +++ b/libs/ardour/ardour/midi_track.h @@ -20,6 +20,8 @@ #ifndef __ardour_midi_track_h__ #define __ardour_midi_track_h__ +#include "pbd/ffs.h" + #include "ardour/track.h" #include "ardour/midi_ring_buffer.h" @@ -33,7 +35,7 @@ class RouteGroup; class SMFSource; class Session; -class MidiTrack : public Track +class LIBARDOUR_API MidiTrack : public Track { public: MidiTrack (Session&, string name, Route::Flag f = Route::Flag (0), TrackMode m = Normal); @@ -70,7 +72,8 @@ public: framecnt_t end_frame, boost::shared_ptr<Processor> endpoint, bool include_endpoint, - bool for_export); + bool for_export, + bool for_freeze); int set_state (const XMLNode&, int version); @@ -183,7 +186,7 @@ private: /* if mode is ForceChannel, force mask to the lowest set channel or 1 if no * channels are set. */ -#define force_mask(mode,mask) (((mode) == ForceChannel) ? (((mask) ? (1<<(ffs((mask))-1)) : 1)) : mask) +#define force_mask(mode,mask) (((mode) == ForceChannel) ? (((mask) ? (1<<(PBD::ffs((mask))-1)) : 1)) : mask) void _set_playback_channel_mode(ChannelMode mode, uint16_t mask) { mask = force_mask (mode, mask); diff --git a/libs/ardour/ardour/midi_ui.h b/libs/ardour/ardour/midi_ui.h index 9e46f226f7..85a8a15e21 100644 --- a/libs/ardour/ardour/midi_ui.h +++ b/libs/ardour/ardour/midi_ui.h @@ -22,6 +22,7 @@ #include <list> +#define ABSTRACT_UI_EXPORTS #include "pbd/abstract_ui.h" #include "pbd/signals.h" #include "pbd/stacktrace.h" @@ -37,13 +38,13 @@ class AsyncMIDIPort; certain types of requests to the MIDI UI */ -struct MidiUIRequest : public BaseUI::BaseRequestObject { +struct LIBARDOUR_API MidiUIRequest : public BaseUI::BaseRequestObject { public: MidiUIRequest () { } ~MidiUIRequest() { } }; -class MidiControlUI : public AbstractUI<MidiUIRequest> +class LIBARDOUR_API MidiControlUI : public AbstractUI<MidiUIRequest> { public: MidiControlUI (Session& s); diff --git a/libs/ardour/ardour/mididm.h b/libs/ardour/ardour/mididm.h new file mode 100644 index 0000000000..65ed15ab72 --- /dev/null +++ b/libs/ardour/ardour/mididm.h @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2013-2014 Robin Gareus <robin@gareus.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef __libardour_mididm_h__ +#define __libardour_mididm_h__ + +#include "ardour/types.h" +#include "ardour/libardour_visibility.h" + +namespace ARDOUR { + +class PortEngine; + +class LIBARDOUR_API MIDIDM +{ +public: + + MIDIDM (framecnt_t sample_rate); + + int process (pframes_t nframes, PortEngine &pe, void *midi_in, void *midi_out); + + framecnt_t latency (void) { return _cnt_total > 10 ? _avg_delay : 0; } + framecnt_t processed (void) { return _cnt_total; } + double deviation (void) { return _cnt_total > 1 ? sqrt(_var_s / ((double)(_cnt_total - 1))) : 0; } + bool ok (void) { return _cnt_total > 200; } + bool have_signal (void) { return (_monotonic_cnt - _last_signal_tme) < (uint64_t) _sample_rate ; } + +private: + int64_t parse_mclk (uint8_t* buf, pframes_t timestamp) const; + int64_t parse_mtc (uint8_t* buf, pframes_t timestamp) const; + + framecnt_t _sample_rate; + + uint64_t _monotonic_cnt; + uint64_t _last_signal_tme; + + uint64_t _cnt_total; + uint64_t _dly_total; + uint32_t _min_delay; + uint32_t _max_delay; + double _avg_delay; + double _var_m; + double _var_s; + +}; + +} + +#endif /* __libardour_mididm_h__ */ diff --git a/libs/ardour/ardour/midiport_manager.h b/libs/ardour/ardour/midiport_manager.h index 9f93c43d5a..5e87238c22 100644 --- a/libs/ardour/ardour/midiport_manager.h +++ b/libs/ardour/ardour/midiport_manager.h @@ -29,6 +29,8 @@ #include "midi++/types.h" #include "midi++/port.h" +#include "ardour/libardour_visibility.h" +#include "ardour/midi_port.h" #include "ardour/types.h" namespace ARDOUR { @@ -36,7 +38,7 @@ namespace ARDOUR { class MidiPort; class Port; -class MidiPortManager { +class LIBARDOUR_API MidiPortManager { public: MidiPortManager(); virtual ~MidiPortManager (); @@ -55,7 +57,12 @@ class MidiPortManager { MIDI::Port* midi_output_port () const { return _midi_output_port; } MIDI::Port* mmc_input_port () const { return _mmc_input_port; } MIDI::Port* mmc_output_port () const { return _mmc_output_port; } + MIDI::Port* scene_input_port () const { return _scene_input_port; } + MIDI::Port* scene_output_port () const { return _scene_output_port; } + boost::shared_ptr<MidiPort> scene_in() const { return boost::dynamic_pointer_cast<MidiPort>(_scene_in); } + boost::shared_ptr<MidiPort> scene_out() const { return boost::dynamic_pointer_cast<MidiPort>(_scene_out); } + /* Ports used for synchronization. These have their I/O handled inside the * process callback. */ @@ -76,13 +83,17 @@ class MidiPortManager { MIDI::Port* _midi_output_port; MIDI::Port* _mmc_input_port; MIDI::Port* _mmc_output_port; - /* these point to the same objects as the 4 members above, + MIDI::Port* _scene_input_port; + MIDI::Port* _scene_output_port; + /* these point to the same objects as the members above, but cast to their ARDOUR::Port base class */ boost::shared_ptr<Port> _midi_in; boost::shared_ptr<Port> _midi_out; boost::shared_ptr<Port> _mmc_in; boost::shared_ptr<Port> _mmc_out; + boost::shared_ptr<Port> _scene_in; + boost::shared_ptr<Port> _scene_out; /* synchronously handled ports: ARDOUR::MidiPort */ boost::shared_ptr<MidiPort> _mtc_input_port; diff --git a/libs/ardour/ardour/mix.h b/libs/ardour/ardour/mix.h index 1c3fb6e5c4..3cd9a3e60f 100644 --- a/libs/ardour/ardour/mix.h +++ b/libs/ardour/ardour/mix.h @@ -19,6 +19,7 @@ #ifndef __ardour_mix_h__ #define __ardour_mix_h__ +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "ardour/utils.h" @@ -26,39 +27,39 @@ extern "C" { /* SSE functions */ -float x86_sse_compute_peak (const ARDOUR::Sample * buf, ARDOUR::pframes_t nsamples, float current); -void x86_sse_apply_gain_to_buffer (ARDOUR::Sample * buf, ARDOUR::pframes_t nframes, float gain); -void x86_sse_mix_buffers_with_gain(ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes, float gain); -void x86_sse_mix_buffers_no_gain (ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes); + LIBARDOUR_API float x86_sse_compute_peak (const ARDOUR::Sample * buf, ARDOUR::pframes_t nsamples, float current); + LIBARDOUR_API void x86_sse_apply_gain_to_buffer (ARDOUR::Sample * buf, ARDOUR::pframes_t nframes, float gain); + LIBARDOUR_API void x86_sse_mix_buffers_with_gain(ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes, float gain); + LIBARDOUR_API void x86_sse_mix_buffers_no_gain (ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes); } -void x86_sse_find_peaks (const ARDOUR::Sample * buf, ARDOUR::pframes_t nsamples, float *min, float *max); +LIBARDOUR_API void x86_sse_find_peaks (const ARDOUR::Sample * buf, ARDOUR::pframes_t nsamples, float *min, float *max); /* debug wrappers for SSE functions */ -float debug_compute_peak (const ARDOUR::Sample * buf, ARDOUR::pframes_t nsamples, float current); -void debug_apply_gain_to_buffer (ARDOUR::Sample * buf, ARDOUR::pframes_t nframes, float gain); -void debug_mix_buffers_with_gain (ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes, float gain); -void debug_mix_buffers_no_gain (ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes); +LIBARDOUR_API float debug_compute_peak (const ARDOUR::Sample * buf, ARDOUR::pframes_t nsamples, float current); +LIBARDOUR_API void debug_apply_gain_to_buffer (ARDOUR::Sample * buf, ARDOUR::pframes_t nframes, float gain); +LIBARDOUR_API void debug_mix_buffers_with_gain (ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes, float gain); +LIBARDOUR_API void debug_mix_buffers_no_gain (ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes); #endif #if defined (__APPLE__) -float veclib_compute_peak (const ARDOUR::Sample * buf, ARDOUR::pframes_t nsamples, float current); -void veclib_find_peaks (const ARDOUR::Sample * buf, ARDOUR::pframes_t nsamples, float *min, float *max); -void veclib_apply_gain_to_buffer (ARDOUR::Sample * buf, ARDOUR::pframes_t nframes, float gain); -void veclib_mix_buffers_with_gain (ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes, float gain); -void veclib_mix_buffers_no_gain (ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes); +LIBARDOUR_API float veclib_compute_peak (const ARDOUR::Sample * buf, ARDOUR::pframes_t nsamples, float current); +LIBARDOUR_API void veclib_find_peaks (const ARDOUR::Sample * buf, ARDOUR::pframes_t nsamples, float *min, float *max); +LIBARDOUR_API void veclib_apply_gain_to_buffer (ARDOUR::Sample * buf, ARDOUR::pframes_t nframes, float gain); +LIBARDOUR_API void veclib_mix_buffers_with_gain (ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes, float gain); +LIBARDOUR_API void veclib_mix_buffers_no_gain (ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes); #endif /* non-optimized functions */ -float default_compute_peak (const ARDOUR::Sample * buf, ARDOUR::pframes_t nsamples, float current); -void default_find_peaks (const ARDOUR::Sample * buf, ARDOUR::pframes_t nsamples, float *min, float *max); -void default_apply_gain_to_buffer (ARDOUR::Sample * buf, ARDOUR::pframes_t nframes, float gain); -void default_mix_buffers_with_gain (ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes, float gain); -void default_mix_buffers_no_gain (ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes); +LIBARDOUR_API float default_compute_peak (const ARDOUR::Sample * buf, ARDOUR::pframes_t nsamples, float current); +LIBARDOUR_API void default_find_peaks (const ARDOUR::Sample * buf, ARDOUR::pframes_t nsamples, float *min, float *max); +LIBARDOUR_API void default_apply_gain_to_buffer (ARDOUR::Sample * buf, ARDOUR::pframes_t nframes, float gain); +LIBARDOUR_API void default_mix_buffers_with_gain (ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes, float gain); +LIBARDOUR_API void default_mix_buffers_no_gain (ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes); #endif /* __ardour_mix_h__ */ diff --git a/libs/ardour/ardour/monitor_processor.h b/libs/ardour/ardour/monitor_processor.h index 64d3b86bfb..33b3e9c366 100644 --- a/libs/ardour/ardour/monitor_processor.h +++ b/libs/ardour/ardour/monitor_processor.h @@ -28,6 +28,7 @@ #include "pbd/compose.h" #include "pbd/controllable.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "ardour/processor.h" @@ -38,7 +39,7 @@ namespace ARDOUR { class Session; template<typename T> -class MPControl : public PBD::Controllable { +class /*LIBARDOUR_API*/ MPControl : public PBD::Controllable { public: MPControl (T initial, const std::string& name, PBD::Controllable::Flag flag, float lower = 0.0f, float upper = 1.0f) @@ -104,7 +105,7 @@ protected: T _upper; }; -class MonitorProcessor : public Processor +class LIBARDOUR_API MonitorProcessor : public Processor { public: MonitorProcessor (Session&); diff --git a/libs/ardour/ardour/movable.h b/libs/ardour/ardour/movable.h index d68d7620ba..df63987f4f 100644 --- a/libs/ardour/ardour/movable.h +++ b/libs/ardour/ardour/movable.h @@ -22,7 +22,7 @@ namespace ARDOUR { -class Movable { +class LIBARDOUR_API Movable { public: Movable() {} diff --git a/libs/ardour/ardour/msvc_libardour.h b/libs/ardour/ardour/msvc_libardour.h new file mode 100644 index 0000000000..f8edcdd3cb --- /dev/null +++ b/libs/ardour/ardour/msvc_libardour.h @@ -0,0 +1,73 @@ +/* + Copyright (C) 2009 John Emmas + + 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 __msvc_libardour_h__ +#define __msvc_libardour_h__ + +#include <ardour/libardour_visibility.h> +#include <limits.h> + +#ifndef _MAX_PATH +#define _MAX_PATH 260 +#endif +#ifndef PATH_MAX +#define PATH_MAX _MAX_PATH +#endif + +#define LIBARDOUR_APICALLTYPE __cdecl + +namespace ARDOUR { + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +// LIBARDOUR_API char* LIBARDOUR_APICALLTYPE placeholder_for_non_msvc_specific_function(s); + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + +} // namespace ARDOUR + +#ifdef COMPILER_MSVC +#include <rpc.h> +//#include <io.h> + +#ifndef __THROW +#define __THROW throw() +#endif +#include <ardourext/sys/time.h> + +namespace ARDOUR { + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +LIBARDOUR_API int LIBARDOUR_APICALLTYPE symlink(const char *dest, const char *shortcut, const char *working_directory = 0); +LIBARDOUR_API int LIBARDOUR_APICALLTYPE readlink(const char *__restrict shortcut, char *__restrict buf, size_t bufsize); + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + +} // namespace ARDOUR + +#endif // COMPILER_MSVC +#endif // __mavc_libardour_h__ diff --git a/libs/ardour/ardour/mtdm.h b/libs/ardour/ardour/mtdm.h index b46e53c0a2..b57df7254a 100644 --- a/libs/ardour/ardour/mtdm.h +++ b/libs/ardour/ardour/mtdm.h @@ -21,7 +21,9 @@ #include <stddef.h> -class MTDM +#include "ardour/libardour_visibility.h" + +class LIBARDOUR_API MTDM { public: diff --git a/libs/ardour/ardour/mute_master.h b/libs/ardour/ardour/mute_master.h index 460c7bf48b..8a83352a5b 100644 --- a/libs/ardour/ardour/mute_master.h +++ b/libs/ardour/ardour/mute_master.h @@ -31,7 +31,7 @@ namespace ARDOUR { class Session; -class MuteMaster : public SessionHandleRef, public PBD::Stateful +class LIBARDOUR_API MuteMaster : public SessionHandleRef, public PBD::Stateful { public: /** deliveries to mute when the channel is "muted" */ diff --git a/libs/ardour/ardour/onset_detector.h b/libs/ardour/ardour/onset_detector.h index 6604a3a362..40eac9b465 100644 --- a/libs/ardour/ardour/onset_detector.h +++ b/libs/ardour/ardour/onset_detector.h @@ -27,7 +27,7 @@ namespace ARDOUR { class AudioSource; class Session; -class OnsetDetector : public AudioAnalyser +class LIBARDOUR_API OnsetDetector : public AudioAnalyser { public: OnsetDetector (float sample_rate); diff --git a/libs/ardour/ardour/operations.h b/libs/ardour/ardour/operations.h index dd6329d7b9..d113c621c2 100644 --- a/libs/ardour/ardour/operations.h +++ b/libs/ardour/ardour/operations.h @@ -17,6 +17,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include "ardour/libardour_visibility.h" + /** These are GQuarks for a subset of UI operations. We use these * so that the undo system can be queried to find out what operations * are currently in progress, by calling Session::current_operations(). @@ -27,19 +29,19 @@ namespace Operations { - extern GQuark capture; - extern GQuark paste; - extern GQuark duplicate_region; - extern GQuark insert_file; - extern GQuark insert_region; - extern GQuark drag_region_brush; - extern GQuark region_drag; - extern GQuark selection_grab; - extern GQuark region_fill; - extern GQuark fill_selection; - extern GQuark create_region; - extern GQuark region_copy; - extern GQuark fixed_time_region_copy; + LIBARDOUR_API extern GQuark capture; + LIBARDOUR_API extern GQuark paste; + LIBARDOUR_API extern GQuark duplicate_region; + LIBARDOUR_API extern GQuark insert_file; + LIBARDOUR_API extern GQuark insert_region; + LIBARDOUR_API extern GQuark drag_region_brush; + LIBARDOUR_API extern GQuark region_drag; + LIBARDOUR_API extern GQuark selection_grab; + LIBARDOUR_API extern GQuark region_fill; + LIBARDOUR_API extern GQuark fill_selection; + LIBARDOUR_API extern GQuark create_region; + LIBARDOUR_API extern GQuark region_copy; + LIBARDOUR_API extern GQuark fixed_time_region_copy; }; diff --git a/libs/ardour/ardour/pan_controllable.h b/libs/ardour/ardour/pan_controllable.h index be0c9260c0..9abbec42ab 100644 --- a/libs/ardour/ardour/pan_controllable.h +++ b/libs/ardour/ardour/pan_controllable.h @@ -34,7 +34,7 @@ namespace ARDOUR { class Session; class Pannable; -class PanControllable : public AutomationControl +class LIBARDOUR_API PanControllable : public AutomationControl { public: PanControllable (Session& s, std::string name, Pannable* o, Evoral::Parameter param) diff --git a/libs/ardour/ardour/pannable.h b/libs/ardour/ardour/pannable.h index 0d5200b685..62c9cd123b 100644 --- a/libs/ardour/ardour/pannable.h +++ b/libs/ardour/ardour/pannable.h @@ -36,7 +36,7 @@ class Session; class AutomationControl; class Panner; -class Pannable : public PBD::Stateful, public Automatable, public SessionHandleRef +class LIBARDOUR_API Pannable : public PBD::Stateful, public Automatable, public SessionHandleRef { public: Pannable (Session& s); diff --git a/libs/ardour/ardour/panner.h b/libs/ardour/ardour/panner.h index 18e3e8045a..211ad0ca8e 100644 --- a/libs/ardour/ardour/panner.h +++ b/libs/ardour/ardour/panner.h @@ -30,10 +30,23 @@ #include "pbd/signals.h" #include "pbd/stateful.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "ardour/automation_control.h" #include "ardour/automatable.h" + +/* This section is for actual panners to use. They will include this file, + * declare ARDOURPANNER_DLL_EXPORTS during compilation, and ... voila. + */ + +#ifdef ARDOURPANNER_DLL_EXPORTS // defined if we are building a panner implementation + #define ARDOURPANNER_API LIBARDOUR_DLL_EXPORT + #else + #define ARDOURPANNER_API LIBARDOUR_DLL_IMPORT + #endif +#define ARDOURPANNER_LOCAL LIBARDOUR_DLL_LOCAL + namespace ARDOUR { class Session; @@ -42,7 +55,7 @@ class BufferSet; class AudioBuffer; class Speakers; -class Panner : public PBD::Stateful, public PBD::ScopedConnectionList +class LIBARDOUR_API Panner : public PBD::Stateful, public PBD::ScopedConnectionList { public: Panner (boost::shared_ptr<Pannable>); @@ -175,7 +188,7 @@ protected: } // namespace extern "C" { -struct PanPluginDescriptor { +struct LIBARDOUR_API PanPluginDescriptor { std::string name; std::string panner_uri; std::string gui_uri; diff --git a/libs/ardour/ardour/panner_manager.h b/libs/ardour/ardour/panner_manager.h index 4a29e1c36b..73d667424f 100644 --- a/libs/ardour/ardour/panner_manager.h +++ b/libs/ardour/ardour/panner_manager.h @@ -20,7 +20,10 @@ #ifndef __ardour_panner_manager_h__ #define __ardour_panner_manager_h__ -#include <dlfcn.h> +#include <map> +#include <string> +#include <glibmm/module.h> + #include "ardour/panner.h" #include "ardour/session_handle.h" @@ -28,21 +31,22 @@ namespace ARDOUR { typedef std::map<std::string,std::string> PannerUriMap; -struct PannerInfo { +struct LIBARDOUR_API PannerInfo { + PanPluginDescriptor descriptor; - void* module; + Glib::Module* module; - PannerInfo (PanPluginDescriptor& d, void* handle) + PannerInfo (PanPluginDescriptor& d, Glib::Module* m) : descriptor (d) - , module (handle) + , module (m) {} ~PannerInfo () { - dlclose (module); + delete module; } }; -class PannerManager : public ARDOUR::SessionHandlePtr +class LIBARDOUR_API PannerManager : public ARDOUR::SessionHandlePtr { public: ~PannerManager (); diff --git a/libs/ardour/ardour/panner_search_path.h b/libs/ardour/ardour/panner_search_path.h deleted file mode 100644 index 889b9efb23..0000000000 --- a/libs/ardour/ardour/panner_search_path.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - Copyright (C) 2011 Paul Davis - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -#ifndef __ardour_panner_search_path_h__ -#define __ardour_panner_search_path_h__ - -#include "pbd/search_path.h" - -namespace ARDOUR { - - /** - * return a SearchPath containing directories in which to look for - * panner plugins. - * - * If ARDOUR_PANNER_PATH is defined then the SearchPath returned - * will contain only those directories specified in it, otherwise it will - * contain the user and system directories which may contain control - * surface plugins. - */ - PBD::SearchPath panner_search_path (); - -} // namespace ARDOUR - -#endif /* __ardour_panner_search_path_h__ */ diff --git a/libs/ardour/ardour/panner_shell.h b/libs/ardour/ardour/panner_shell.h index da4e6e3bee..f344afd54a 100644 --- a/libs/ardour/ardour/panner_shell.h +++ b/libs/ardour/ardour/panner_shell.h @@ -30,6 +30,7 @@ #include "pbd/cartesian.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "ardour/session_object.h" @@ -46,7 +47,7 @@ class Pannable; /** Class to manage panning by instantiating and controlling * an appropriate Panner object for a given in/out configuration. */ -class PannerShell : public SessionObject +class LIBARDOUR_API PannerShell : public SessionObject { public: PannerShell (std::string name, Session&, boost::shared_ptr<Pannable>, bool is_send = false); diff --git a/libs/ardour/ardour/peak.h b/libs/ardour/ardour/peak.h index ab99889dd3..9c871a9e35 100644 --- a/libs/ardour/ardour/peak.h +++ b/libs/ardour/ardour/peak.h @@ -21,6 +21,7 @@ #define __ardour_peak_h__ #include <cmath> +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "ardour/utils.h" diff --git a/libs/ardour/ardour/pi_controller.h b/libs/ardour/ardour/pi_controller.h deleted file mode 100644 index bcbc81701a..0000000000 --- a/libs/ardour/ardour/pi_controller.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - Copyright (C) 2008 Torben Hohn - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -#ifndef __libardour_pi_controller__ -#define __libardour_pi_controller__ - -#include "ardour/types.h" - -class PIController { -public: - PIController (double resample_factor, int fir_size); - ~PIController(); - - void reset (double resample_factor) { - resample_mean = resample_factor; - static_resample_factor = resample_factor; - out_of_bounds (); - } - - double get_ratio (int fill_level, int period_size); - void out_of_bounds(); - -public: - double resample_mean; - double static_resample_factor; - double* offset_array; - double* window_array; - int offset_differential_index; - double offset_integral; - double catch_factor; - double catch_factor2; - double pclamp; - double controlquant; - int smooth_size; - double smooth_offset; - double current_resample_factor; - bool fir_empty; -}; - -#define ESTIMATOR_SIZE 16 - -class PIChaser { -public: - PIChaser(); - ~PIChaser(); - - double get_ratio( framepos_t chasetime_measured, framepos_t chasetime, framepos_t slavetime_measured, framepos_t slavetime, bool in_control, int period_size ); - void reset(); - framepos_t want_locate() { return want_locate_val; } - -private: - PIController *pic; - framepos_t realtime_stamps[ESTIMATOR_SIZE]; - framepos_t chasetime_stamps[ESTIMATOR_SIZE]; - int array_index; - framepos_t want_locate_val; - - void feed_estimator( framepos_t realtime, framepos_t chasetime ); - double get_estimate(); - - double speed; - - double speed_threshold; - framepos_t pos_threshold; -}; - -#endif /* __libardour_pi_controller__ */ diff --git a/libs/ardour/ardour/pitch.h b/libs/ardour/ardour/pitch.h index 961609938c..4c8db5fb80 100644 --- a/libs/ardour/ardour/pitch.h +++ b/libs/ardour/ardour/pitch.h @@ -37,7 +37,7 @@ namespace ARDOUR { namespace ARDOUR { -class Pitch : public RBEffect { +class LIBARDOUR_API Pitch : public RBEffect { public: Pitch (ARDOUR::Session&, TimeFXRequest&); ~Pitch () {} @@ -49,7 +49,7 @@ class Pitch : public RBEffect { namespace ARDOUR { -class Pitch : public Filter { +class LIBARDOUR_API Pitch : public Filter { public: Pitch (ARDOUR::Session&, TimeFXRequest&); ~Pitch () {} diff --git a/libs/ardour/ardour/playlist.h b/libs/ardour/ardour/playlist.h index 754e48cc25..5629a04629 100644 --- a/libs/ardour/ardour/playlist.h +++ b/libs/ardour/ardour/playlist.h @@ -41,13 +41,13 @@ #include "evoral/types.hpp" #include "ardour/ardour.h" +#include "ardour/region.h" #include "ardour/session_object.h" #include "ardour/data_type.h" namespace ARDOUR { class Session; -class Region; class Playlist; class Crossfade; @@ -55,10 +55,10 @@ namespace Properties { /* fake the type, since regions are handled by SequenceProperty which doesn't care about such things. */ - extern PBD::PropertyDescriptor<bool> regions; + LIBARDOUR_API extern PBD::PropertyDescriptor<bool> regions; } -class RegionListProperty : public PBD::SequenceProperty<std::list<boost::shared_ptr<Region> > > +class LIBARDOUR_API RegionListProperty : public PBD::SequenceProperty<std::list<boost::shared_ptr<Region> > > { public: RegionListProperty (Playlist&); @@ -78,7 +78,7 @@ class RegionListProperty : public PBD::SequenceProperty<std::list<boost::shared_ Playlist& _playlist; }; -class Playlist : public SessionObject , public boost::enable_shared_from_this<Playlist> +class LIBARDOUR_API Playlist : public SessionObject , public boost::enable_shared_from_this<Playlist> { public: static void make_property_quarks (); diff --git a/libs/ardour/ardour/playlist_factory.h b/libs/ardour/ardour/playlist_factory.h index 8b5d9d6a23..505836234b 100644 --- a/libs/ardour/ardour/playlist_factory.h +++ b/libs/ardour/ardour/playlist_factory.h @@ -28,7 +28,7 @@ namespace ARDOUR { class Session; -class PlaylistFactory { +class LIBARDOUR_API PlaylistFactory { public: static PBD::Signal2<void,boost::shared_ptr<Playlist>, bool> PlaylistCreated; diff --git a/libs/ardour/ardour/playlist_source.h b/libs/ardour/ardour/playlist_source.h index 71802fddb6..55cc1f6b59 100644 --- a/libs/ardour/ardour/playlist_source.h +++ b/libs/ardour/ardour/playlist_source.h @@ -31,7 +31,7 @@ namespace ARDOUR { class Playlist; -class PlaylistSource : virtual public Source { +class LIBARDOUR_API PlaylistSource : virtual public Source { public: virtual ~PlaylistSource (); diff --git a/libs/ardour/ardour/plugin.h b/libs/ardour/ardour/plugin.h index 1bc7dc5afd..a69b87efbd 100644 --- a/libs/ardour/ardour/plugin.h +++ b/libs/ardour/ardour/plugin.h @@ -32,6 +32,7 @@ #include "ardour/cycles.h" #include "ardour/latent.h" #include "ardour/plugin_insert.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "ardour/midi_state_tracker.h" @@ -49,7 +50,7 @@ class Plugin; typedef boost::shared_ptr<Plugin> PluginPtr; -class PluginInfo { +class LIBARDOUR_API PluginInfo { public: PluginInfo () { } virtual ~PluginInfo () { } @@ -87,7 +88,7 @@ class PluginInfo { typedef boost::shared_ptr<PluginInfo> PluginInfoPtr; typedef std::list<PluginInfoPtr> PluginInfoList; -class Plugin : public PBD::StatefulDestructible, public Latent +class LIBARDOUR_API Plugin : public PBD::StatefulDestructible, public Latent { public: Plugin (ARDOUR::AudioEngine&, ARDOUR::Session&); diff --git a/libs/ardour/ardour/plugin_insert.h b/libs/ardour/ardour/plugin_insert.h index 7d7e2e7269..f1c03a79d2 100644 --- a/libs/ardour/ardour/plugin_insert.h +++ b/libs/ardour/ardour/plugin_insert.h @@ -26,6 +26,7 @@ #include <boost/weak_ptr.hpp> #include "ardour/ardour.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "ardour/processor.h" #include "ardour/automation_control.h" @@ -40,7 +41,7 @@ class Plugin; /** Plugin inserts: send data through a plugin */ -class PluginInsert : public Processor +class LIBARDOUR_API PluginInsert : public Processor { public: PluginInsert (Session&, boost::shared_ptr<Plugin> = boost::shared_ptr<Plugin>()); @@ -176,7 +177,7 @@ class PluginInsert : public Processor /** details of the match currently being used */ Match _match; - void automation_run (BufferSet& bufs, pframes_t nframes); + void automation_run (BufferSet& bufs, framepos_t start, pframes_t nframes); void connect_and_run (BufferSet& bufs, pframes_t nframes, framecnt_t offset, bool with_auto, framepos_t now = 0); void create_automatable_parameters (); diff --git a/libs/ardour/ardour/plugin_manager.h b/libs/ardour/ardour/plugin_manager.h index a7a5703690..6239bd7cb0 100644 --- a/libs/ardour/ardour/plugin_manager.h +++ b/libs/ardour/ardour/plugin_manager.h @@ -30,6 +30,7 @@ #include <set> #include <boost/utility.hpp> +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "ardour/plugin.h" @@ -37,9 +38,10 @@ namespace ARDOUR { class Plugin; -class PluginManager : public boost::noncopyable { +class LIBARDOUR_API PluginManager : public boost::noncopyable { public: static PluginManager& instance(); + static std::string scanner_bin_path; ~PluginManager (); @@ -49,11 +51,17 @@ class PluginManager : public boost::noncopyable { ARDOUR::PluginInfoList &lv2_plugin_info (); ARDOUR::PluginInfoList &au_plugin_info (); - void refresh (); + void refresh (bool cache_only = false); + void cancel_plugin_scan(); + void cancel_plugin_timeout(); + void clear_vst_cache (); + void clear_vst_blacklist (); - int add_ladspa_directory (std::string dirpath); - int add_windows_vst_directory (std::string dirpath); - int add_lxvst_directory (std::string dirpath); + const std::string get_default_windows_vst_path() const { return windows_vst_path; } + const std::string get_default_lxvst_path() const { return lxvst_path; } + + bool cancelled () { return _cancel_scan; } + bool no_timeout () { return _cancel_timeout; } enum PluginStatusType { Normal = 0, @@ -103,13 +111,15 @@ class PluginManager : public boost::noncopyable { std::map<uint32_t, std::string> rdf_type; - std::string ladspa_path; std::string windows_vst_path; std::string lxvst_path; + bool _cancel_scan; + bool _cancel_timeout; + void ladspa_refresh (); - void windows_vst_refresh (); - void lxvst_refresh (); + void windows_vst_refresh (bool cache_only = false); + void lxvst_refresh (bool cache_only = false); void add_lrdf_data (const std::string &path); void add_ladspa_presets (); @@ -121,13 +131,12 @@ class PluginManager : public boost::noncopyable { void lv2_refresh (); - int windows_vst_discover_from_path (std::string path); - int windows_vst_discover (std::string path); + int windows_vst_discover_from_path (std::string path, bool cache_only = false); + int windows_vst_discover (std::string path, bool cache_only = false); - int lxvst_discover_from_path (std::string path); - int lxvst_discover (std::string path); + int lxvst_discover_from_path (std::string path, bool cache_only = false); + int lxvst_discover (std::string path, bool cache_only = false); - int ladspa_discover_from_path (std::string path); int ladspa_discover (std::string path); std::string get_ladspa_category (uint32_t id); diff --git a/libs/ardour/ardour/lv2_bundled_search_path.h b/libs/ardour/ardour/plugin_types.h index f5780c5e0e..e0dd6600fc 100644 --- a/libs/ardour/ardour/lv2_bundled_search_path.h +++ b/libs/ardour/ardour/plugin_types.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2013 Paul Davis + Copyright (C) 2002 Paul Davis This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,19 +17,18 @@ */ -#ifndef ARDOUR_LV2_BUNDLED_SEARCH_PATH_INCLUDED -#define ARDOUR_LV2_BUNDLED_SEARCH_PATH_INCLUDED - -#include "pbd/search_path.h" +#ifndef __ardour_plugin_types_h__ +#define __ardour_plugin_types_h__ namespace ARDOUR { - /** - * return a SearchPath containing directories in which to look for - * lv2 plugins. - */ - PBD::SearchPath lv2_bundled_search_path (); - -} // namespace ARDOUR + enum PluginType { + AudioUnit, + LADSPA, + LV2, + Windows_VST, + LXVST, + }; +} #endif diff --git a/libs/ardour/ardour/port.h b/libs/ardour/ardour/port.h index 77bf2b6f71..6a05314843 100644 --- a/libs/ardour/ardour/port.h +++ b/libs/ardour/ardour/port.h @@ -25,12 +25,12 @@ #include <set> #include <string> #include <vector> -#include <jack/jack.h> #include <boost/utility.hpp> #include "pbd/signals.h" #include "ardour/data_type.h" #include "ardour/port_engine.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" namespace ARDOUR { @@ -38,7 +38,7 @@ namespace ARDOUR { class AudioEngine; class Buffer; -class Port : public boost::noncopyable +class LIBARDOUR_API Port : public boost::noncopyable { public: virtual ~Port (); diff --git a/libs/ardour/ardour/port_engine.h b/libs/ardour/ardour/port_engine.h index 68f8fe1232..62996b7cdf 100644 --- a/libs/ardour/ardour/port_engine.h +++ b/libs/ardour/ardour/port_engine.h @@ -26,6 +26,7 @@ #include <stdint.h> #include "ardour/data_type.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" namespace ARDOUR { @@ -74,7 +75,7 @@ class PortManager; * documentation, on which this entire object is based. */ -class PortEngine { +class LIBARDOUR_API PortEngine { public: PortEngine (PortManager& pm) : manager (pm) {} virtual ~PortEngine() {} diff --git a/libs/ardour/ardour/port_insert.h b/libs/ardour/ardour/port_insert.h index abd9fb73cc..327080984a 100644 --- a/libs/ardour/ardour/port_insert.h +++ b/libs/ardour/ardour/port_insert.h @@ -26,6 +26,7 @@ #include "ardour/ardour.h" #include "ardour/io_processor.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" class XMLNode; @@ -41,7 +42,7 @@ class Pannable; /** Port inserts: send output to a Jack port, pick up input at a Jack port */ -class PortInsert : public IOProcessor +class LIBARDOUR_API PortInsert : public IOProcessor { public: PortInsert (Session&, boost::shared_ptr<Pannable>, boost::shared_ptr<MuteMaster> mm); diff --git a/libs/ardour/ardour/port_manager.h b/libs/ardour/ardour/port_manager.h index ba15142d83..b36e98fe64 100644 --- a/libs/ardour/ardour/port_manager.h +++ b/libs/ardour/ardour/port_manager.h @@ -40,7 +40,7 @@ namespace ARDOUR { class PortEngine; class AudioBackend; -class PortManager +class LIBARDOUR_API PortManager { public: typedef std::map<std::string,boost::shared_ptr<Port> > Ports; diff --git a/libs/ardour/ardour/port_set.h b/libs/ardour/ardour/port_set.h index 690875cd86..cd76f75ee3 100644 --- a/libs/ardour/ardour/port_set.h +++ b/libs/ardour/ardour/port_set.h @@ -39,7 +39,7 @@ class MidiPort; * and once in a vector of all port (_all_ports). This is to speed up the * fairly common case of iterating over all ports. */ -class PortSet : public boost::noncopyable { +class LIBARDOUR_API PortSet : public boost::noncopyable { public: PortSet(); diff --git a/libs/ardour/ardour/process_thread.h b/libs/ardour/ardour/process_thread.h index f96595fbbf..779fdaea2d 100644 --- a/libs/ardour/ardour/process_thread.h +++ b/libs/ardour/ardour/process_thread.h @@ -23,6 +23,7 @@ #include <glibmm/threads.h> #include "ardour/chan_count.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" namespace ARDOUR { @@ -30,7 +31,7 @@ namespace ARDOUR { class ThreadBuffers; class BufferSet; -class ProcessThread +class LIBARDOUR_API ProcessThread { public: ProcessThread (); diff --git a/libs/ardour/ardour/processor.h b/libs/ardour/ardour/processor.h index 18f13dbc78..85d466a169 100644 --- a/libs/ardour/ardour/processor.h +++ b/libs/ardour/ardour/processor.h @@ -30,6 +30,7 @@ #include "ardour/buffer_set.h" #include "ardour/latent.h" #include "ardour/session_object.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "ardour/automatable.h" @@ -41,7 +42,7 @@ class Session; class Route; /** A mixer strip element - plugin, send, meter, etc */ -class Processor : public SessionObject, public Automatable, public Latent +class LIBARDOUR_API Processor : public SessionObject, public Automatable, public Latent { public: static const std::string state_node_name; diff --git a/libs/ardour/ardour/profile.h b/libs/ardour/ardour/profile.h index 5d4e611833..56d9ff62be 100644 --- a/libs/ardour/ardour/profile.h +++ b/libs/ardour/ardour/profile.h @@ -23,15 +23,18 @@ #include <boost/dynamic_bitset.hpp> #include <stdint.h> +#include "ardour/libardour_visibility.h" + namespace ARDOUR { -class RuntimeProfile { +class LIBARDOUR_API RuntimeProfile { public: enum Element { SmallScreen, SAE, SinglePackage, - LastElement + Trx, + LastElement, }; RuntimeProfile() { bits.resize (LastElement); } @@ -43,6 +46,9 @@ public: void set_sae () { bits[SAE] = true; } bool get_sae () const { return bits[SAE]; } + bool get_trx() const { return bits[Trx]; } + void set_trx() { bits[Trx] = true; } + void set_single_package () { bits[SinglePackage] = true; } bool get_single_package () const { return bits[SinglePackage]; } @@ -51,7 +57,7 @@ private: }; -extern RuntimeProfile* Profile; +LIBARDOUR_API extern RuntimeProfile* Profile; }; // namespace ARDOUR diff --git a/libs/ardour/ardour/progress.h b/libs/ardour/ardour/progress.h index 10b7d75960..79043a31ee 100644 --- a/libs/ardour/ardour/progress.h +++ b/libs/ardour/ardour/progress.h @@ -22,10 +22,12 @@ #include <list> +#include "ardour/libardour_visibility.h" + namespace ARDOUR { /** A class to handle reporting of progress of something */ -class Progress +class LIBARDOUR_API Progress { public: Progress (); diff --git a/libs/ardour/ardour/proxy_controllable.h b/libs/ardour/ardour/proxy_controllable.h index 169f60f9f5..066f2aac81 100644 --- a/libs/ardour/ardour/proxy_controllable.h +++ b/libs/ardour/ardour/proxy_controllable.h @@ -30,7 +30,7 @@ namespace ARDOUR { so that it can be used like a regular Controllable, bound to MIDI, OSC etc. */ -class ProxyControllable : public PBD::Controllable { +class LIBARDOUR_API ProxyControllable : public PBD::Controllable { public: ProxyControllable (const std::string& name, PBD::Controllable::Flag flags, boost::function1<bool,double> setter, diff --git a/libs/ardour/ardour/public_diskstream.h b/libs/ardour/ardour/public_diskstream.h index c150ca93b0..4700e7b6be 100644 --- a/libs/ardour/ardour/public_diskstream.h +++ b/libs/ardour/ardour/public_diskstream.h @@ -27,7 +27,7 @@ class Source; class Location; /** Public interface to a Diskstream */ -class PublicDiskstream +class LIBARDOUR_API PublicDiskstream { public: virtual ~PublicDiskstream() {} diff --git a/libs/ardour/ardour/quantize.h b/libs/ardour/ardour/quantize.h index e56927767e..c41d172177 100644 --- a/libs/ardour/ardour/quantize.h +++ b/libs/ardour/ardour/quantize.h @@ -21,6 +21,7 @@ #ifndef __ardour_quantize_h__ #define __ardour_quantize_h__ +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "ardour/midi_operator.h" @@ -28,7 +29,7 @@ namespace ARDOUR { class Session; -class Quantize : public MidiOperator { +class LIBARDOUR_API Quantize : public MidiOperator { public: Quantize (ARDOUR::Session&, bool snap_start, bool snap_end, double start_grid, double end_grid, diff --git a/libs/ardour/ardour/rb_effect.h b/libs/ardour/ardour/rb_effect.h index 1d36f31332..6c10278fb3 100644 --- a/libs/ardour/ardour/rb_effect.h +++ b/libs/ardour/ardour/rb_effect.h @@ -27,7 +27,7 @@ namespace ARDOUR { class AudioRegion; -class RBEffect : public Filter { +class LIBARDOUR_API RBEffect : public Filter { public: RBEffect (ARDOUR::Session&, TimeFXRequest&); ~RBEffect (); diff --git a/libs/ardour/ardour/rc_configuration.h b/libs/ardour/ardour/rc_configuration.h index e2f68477a1..d85c723ff8 100644 --- a/libs/ardour/ardour/rc_configuration.h +++ b/libs/ardour/ardour/rc_configuration.h @@ -23,6 +23,7 @@ #include <map> #include <string> +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "ardour/utils.h" #include "ardour/configuration.h" @@ -31,7 +32,7 @@ class XMLNode; namespace ARDOUR { -class RCConfiguration : public Configuration +class LIBARDOUR_API RCConfiguration : public Configuration { public: RCConfiguration(); @@ -83,8 +84,8 @@ class RCConfiguration : public Configuration }; /* XXX: rename this */ -extern RCConfiguration *Config; -extern gain_t speed_quietning; /* see comment in configuration.cc */ +LIBARDOUR_API extern RCConfiguration *Config; +LIBARDOUR_API extern gain_t speed_quietning; /* see comment in configuration.cc */ } // namespace ARDOUR diff --git a/libs/ardour/ardour/rc_configuration_vars.h b/libs/ardour/ardour/rc_configuration_vars.h index 3c74f067ae..c0c76d3826 100644 --- a/libs/ardour/ardour/rc_configuration_vars.h +++ b/libs/ardour/ardour/rc_configuration_vars.h @@ -43,7 +43,8 @@ CONFIG_VARIABLE (bool, midi_feedback, "midi-feedback", false) CONFIG_VARIABLE (int32_t, mmc_receive_device_id, "mmc-receive-device-id", 0x7f) CONFIG_VARIABLE (int32_t, mmc_send_device_id, "mmc-send-device-id", 0) CONFIG_VARIABLE (int32_t, initial_program_change, "initial-program-change", -1) -CONFIG_VARIABLE (bool, first_midi_bank_is_zero, "diplay-first-midi-bank-as-zero", false) +CONFIG_VARIABLE (bool, first_midi_bank_is_zero, "display-first-midi-bank-as-zero", false) +CONFIG_VARIABLE (int32_t, inter_scene_gap_msecs, "inter-scene-gap-msecs", 1) /* Timecode and related */ @@ -89,6 +90,7 @@ CONFIG_VARIABLE (bool, automation_follows_regions, "automation-follows-regions", CONFIG_VARIABLE (bool, region_boundaries_from_selected_tracks, "region-boundaries-from-selected-tracks", true) CONFIG_VARIABLE (bool, region_boundaries_from_onscreen_tracks, "region-boundaries-from-onscreen_tracks", true) CONFIG_VARIABLE (bool, autoscroll_editor, "autoscroll-editor", true) +CONFIG_VARIABLE (FadeShape, default_fade_shape, "default-fade-shape", FadeLinear) /* monitoring, mute, solo etc */ @@ -133,6 +135,7 @@ CONFIG_VARIABLE (bool, stop_recording_on_xrun, "stop-recording-on-xrun", false) CONFIG_VARIABLE (bool, create_xrun_marker, "create-xrun-marker", true) CONFIG_VARIABLE (bool, stop_at_session_end, "stop-at-session-end", false) CONFIG_VARIABLE (bool, seamless_loop, "seamless-loop", false) +CONFIG_VARIABLE (bool, loop_is_mode, "loop-is-mode", false) CONFIG_VARIABLE (framecnt_t, preroll, "preroll", 0) CONFIG_VARIABLE (framecnt_t, postroll, "postroll", 0) CONFIG_VARIABLE (float, rf_speed, "rf-speed", 2.0f) @@ -158,6 +161,7 @@ CONFIG_VARIABLE (MeterLineUp, meter_line_up_din, "meter-line-up-din", MeteringLi CONFIG_VARIABLE (float, meter_peak, "meter-peak", 0.0f) CONFIG_VARIABLE (bool, meter_style_led, "meter-style-led", true) CONFIG_VARIABLE (bool, show_editor_meter, "show-editor-meter", true) +CONFIG_VARIABLE (double, waveform_clip_level, "waveform-clip-level", -0.0933967) /* units of dB */ /* miscellany */ @@ -167,8 +171,6 @@ CONFIG_VARIABLE (bool, replicate_missing_region_channels, "replicate-missing-reg CONFIG_VARIABLE (bool, hiding_groups_deactivates_groups, "hiding-groups-deactivates-groups", true) CONFIG_VARIABLE (bool, verify_remove_last_capture, "verify-remove-last-capture", true) CONFIG_VARIABLE (bool, no_new_session_dialog, "no-new-session-dialog", false) -CONFIG_VARIABLE (bool, use_windows_vst, "use-windows-vst", true) -CONFIG_VARIABLE (bool, use_lxvst, "use-lxvst", true) CONFIG_VARIABLE (bool, save_history, "save-history", true) CONFIG_VARIABLE (int32_t, saved_history_depth, "save-history-depth", 20) CONFIG_VARIABLE (int32_t, history_depth, "history-depth", 20) @@ -178,7 +180,6 @@ CONFIG_VARIABLE (uint32_t, periodic_safety_backup_interval, "periodic-safety-bac CONFIG_VARIABLE (float, automation_interval_msecs, "automation-interval-msecs", 30) CONFIG_VARIABLE (bool, only_copy_imported_files, "only-copy-imported-files", false) CONFIG_VARIABLE (bool, keep_tearoffs, "keep-tearoffs", false) -CONFIG_VARIABLE (bool, new_plugins_active, "new-plugins-active", true) CONFIG_VARIABLE (std::string, keyboard_layout, "keyboard-layout", "ansi") CONFIG_VARIABLE (std::string, default_bindings, "default-bindings", "ardour") CONFIG_VARIABLE (bool, default_narrow_ms, "default-narrow_ms", false) @@ -192,16 +193,28 @@ CONFIG_VARIABLE (WaveformScale, waveform_scale, "waveform-scale", Linear) CONFIG_VARIABLE (WaveformShape, waveform_shape, "waveform-shape", Traditional) CONFIG_VARIABLE (bool, allow_special_bus_removal, "allow-special-bus-removal", false) CONFIG_VARIABLE (int32_t, processor_usage, "processor-usage", -1) -CONFIG_VARIABLE (bool, color_regions_using_track_color, "color-regions-using-track-color", false) CONFIG_VARIABLE (gain_t, max_gain, "max-gain", 2.0) /* +6.0dB */ CONFIG_VARIABLE (bool, update_editor_during_summary_drag, "update-editor-during-summary-drag", true) CONFIG_VARIABLE (bool, never_display_periodic_midi, "never-display-periodic-midi", true) CONFIG_VARIABLE (bool, sound_midi_notes, "sound-midi-notes", false) -CONFIG_VARIABLE (bool, use_plugin_own_gui, "use-plugin-own-gui", true) CONFIG_VARIABLE (uint32_t, max_recent_sessions, "max-recent-sessions", 10) CONFIG_VARIABLE (double, automation_thinning_factor, "automation-thinning-factor", 20.0) CONFIG_VARIABLE (std::string, freesound_download_dir, "freesound-download-dir", Glib::get_home_dir() + "/Freesound/snd") +/* plugin related */ + +CONFIG_VARIABLE (bool, new_plugins_active, "new-plugins-active", true) +CONFIG_VARIABLE (bool, use_plugin_own_gui, "use-plugin-own-gui", true) +CONFIG_VARIABLE (bool, use_windows_vst, "use-windows-vst", true) +CONFIG_VARIABLE (bool, use_lxvst, "use-lxvst", true) +CONFIG_VARIABLE (bool, show_plugin_scan_window, "show-plugin-scan-window", false) +CONFIG_VARIABLE (bool, discover_vst_on_start, "discover-vst-on-start", false) +CONFIG_VARIABLE (int, vst_scan_timeout, "vst-scan-timeout", 600) /* deciseconds, per plugin, <= 0 no timeout */ + +/* custom user plugin paths */ +CONFIG_VARIABLE (std::string, plugin_path_vst, "plugin-path-vst", "@default@") +CONFIG_VARIABLE (std::string, plugin_path_lxvst, "plugin-path-lxvst", "@default@") + /* denormal management */ CONFIG_VARIABLE (bool, denormal_protection, "denormal-protection", false) @@ -215,6 +228,7 @@ CONFIG_VARIABLE (bool, use_tooltips, "use-tooltips", true) CONFIG_VARIABLE (std::string, mixer_strip_visibility, "mixer-strip-visibility", "PhaseInvert,SoloSafe,SoloIsolated,Group,MeterPoint") CONFIG_VARIABLE (bool, allow_non_quarter_pulse, "allow-non-quarter-pulse", false) CONFIG_VARIABLE (bool, show_region_gain, "show-region-gain", false) +CONFIG_VARIABLE (bool, show_name_highlight, "show-name-highlight", false) /* web addresses used in the program */ diff --git a/libs/ardour/ardour/readable.h b/libs/ardour/ardour/readable.h index d184902deb..18190436df 100644 --- a/libs/ardour/ardour/readable.h +++ b/libs/ardour/ardour/readable.h @@ -20,11 +20,12 @@ #ifndef __ardour_readable_h__ #define __ardour_readable_h__ +#include "ardour/libardour_visibility.h" #include "ardour/types.h" namespace ARDOUR { -class Readable { +class LIBARDOUR_API Readable { public: Readable () {} virtual ~Readable() {} diff --git a/libs/ardour/ardour/recent_sessions.h b/libs/ardour/ardour/recent_sessions.h index 2951496849..03134da6d2 100644 --- a/libs/ardour/ardour/recent_sessions.h +++ b/libs/ardour/ardour/recent_sessions.h @@ -24,13 +24,15 @@ #include <utility> #include <string> +#include "ardour/libardour_visibility.h" + namespace ARDOUR { typedef std::deque<std::pair<std::string,std::string> > RecentSessions; - int read_recent_sessions (RecentSessions& rs); - int store_recent_sessions (std::string name, std::string path); - int write_recent_sessions (RecentSessions& rs); - int remove_recent_sessions (const std::string& path); + LIBARDOUR_API int read_recent_sessions (RecentSessions& rs); + LIBARDOUR_API int store_recent_sessions (std::string name, std::string path); + LIBARDOUR_API int write_recent_sessions (RecentSessions& rs); + LIBARDOUR_API int remove_recent_sessions (const std::string& path); }; // namespace ARDOUR #endif // __ardour_recent_sessions_h__ diff --git a/libs/ardour/ardour/region.h b/libs/ardour/ardour/region.h index 3ee829ed12..a66047a02a 100644 --- a/libs/ardour/ardour/region.h +++ b/libs/ardour/ardour/region.h @@ -38,35 +38,34 @@ class XMLNode; - namespace ARDOUR { namespace Properties { - extern PBD::PropertyDescriptor<bool> muted; - extern PBD::PropertyDescriptor<bool> opaque; - extern PBD::PropertyDescriptor<bool> locked; - extern PBD::PropertyDescriptor<bool> video_locked; - extern PBD::PropertyDescriptor<bool> automatic; - extern PBD::PropertyDescriptor<bool> whole_file; - extern PBD::PropertyDescriptor<bool> import; - extern PBD::PropertyDescriptor<bool> external; - extern PBD::PropertyDescriptor<bool> sync_marked; - extern PBD::PropertyDescriptor<bool> left_of_split; - extern PBD::PropertyDescriptor<bool> right_of_split; - extern PBD::PropertyDescriptor<bool> hidden; - extern PBD::PropertyDescriptor<bool> position_locked; - extern PBD::PropertyDescriptor<bool> valid_transients; - extern PBD::PropertyDescriptor<framepos_t> start; - extern PBD::PropertyDescriptor<framecnt_t> length; - extern PBD::PropertyDescriptor<framepos_t> position; - extern PBD::PropertyDescriptor<framecnt_t> sync_position; - extern PBD::PropertyDescriptor<layer_t> layer; - extern PBD::PropertyDescriptor<framepos_t> ancestral_start; - extern PBD::PropertyDescriptor<framecnt_t> ancestral_length; - extern PBD::PropertyDescriptor<float> stretch; - extern PBD::PropertyDescriptor<float> shift; - extern PBD::PropertyDescriptor<PositionLockStyle> position_lock_style; - extern PBD::PropertyDescriptor<uint64_t> layering_index; + LIBARDOUR_API extern PBD::PropertyDescriptor<bool> muted; + LIBARDOUR_API extern PBD::PropertyDescriptor<bool> opaque; + LIBARDOUR_API extern PBD::PropertyDescriptor<bool> locked; + LIBARDOUR_API extern PBD::PropertyDescriptor<bool> video_locked; + LIBARDOUR_API extern PBD::PropertyDescriptor<bool> automatic; + LIBARDOUR_API extern PBD::PropertyDescriptor<bool> whole_file; + LIBARDOUR_API extern PBD::PropertyDescriptor<bool> import; + LIBARDOUR_API extern PBD::PropertyDescriptor<bool> external; + LIBARDOUR_API extern PBD::PropertyDescriptor<bool> sync_marked; + LIBARDOUR_API extern PBD::PropertyDescriptor<bool> left_of_split; + LIBARDOUR_API extern PBD::PropertyDescriptor<bool> right_of_split; + LIBARDOUR_API extern PBD::PropertyDescriptor<bool> hidden; + LIBARDOUR_API extern PBD::PropertyDescriptor<bool> position_locked; + LIBARDOUR_API extern PBD::PropertyDescriptor<bool> valid_transients; + LIBARDOUR_API extern PBD::PropertyDescriptor<framepos_t> start; + LIBARDOUR_API extern PBD::PropertyDescriptor<framecnt_t> length; + LIBARDOUR_API extern PBD::PropertyDescriptor<framepos_t> position; + LIBARDOUR_API extern PBD::PropertyDescriptor<framecnt_t> sync_position; + LIBARDOUR_API extern PBD::PropertyDescriptor<layer_t> layer; + LIBARDOUR_API extern PBD::PropertyDescriptor<framepos_t> ancestral_start; + LIBARDOUR_API extern PBD::PropertyDescriptor<framecnt_t> ancestral_length; + LIBARDOUR_API extern PBD::PropertyDescriptor<float> stretch; + LIBARDOUR_API extern PBD::PropertyDescriptor<float> shift; + LIBARDOUR_API extern PBD::PropertyDescriptor<PositionLockStyle> position_lock_style; + LIBARDOUR_API extern PBD::PropertyDescriptor<uint64_t> layering_index; }; class Playlist; @@ -74,14 +73,14 @@ class Filter; class ExportSpecification; class Progress; -enum RegionEditState { +enum LIBARDOUR_API RegionEditState { EditChangesNothing = 0, EditChangesName = 1, EditChangesID = 2 }; -class Region +class LIBARDOUR_API Region : public SessionObject , public boost::enable_shared_from_this<Region> , public Readable @@ -220,7 +219,7 @@ class Region bool at_natural_position () const; void move_to_natural_position (); - void trim_start (framepos_t new_position); + void move_start (frameoffset_t distance); void trim_front (framepos_t new_position); void trim_end (framepos_t new_position); void trim_to (framepos_t position, framecnt_t length); diff --git a/libs/ardour/ardour/region_factory.h b/libs/ardour/ardour/region_factory.h index ed0c962d87..a9b73dc462 100644 --- a/libs/ardour/ardour/region_factory.h +++ b/libs/ardour/ardour/region_factory.h @@ -28,6 +28,7 @@ #include "pbd/property_list.h" #include "pbd/signals.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" class XMLNode; @@ -38,7 +39,7 @@ namespace ARDOUR { class Session; class AudioRegion; -class RegionFactory { +class LIBARDOUR_API RegionFactory { public: typedef std::map<PBD::ID,boost::shared_ptr<Region> > RegionMap; diff --git a/libs/ardour/ardour/region_sorters.h b/libs/ardour/ardour/region_sorters.h index baa3a3417d..3afd66bf3c 100644 --- a/libs/ardour/ardour/region_sorters.h +++ b/libs/ardour/ardour/region_sorters.h @@ -24,18 +24,31 @@ namespace ARDOUR { -struct RegionSortByPosition { +struct LIBARDOUR_API RegionSortByPosition { bool operator() (boost::shared_ptr<Region> a, boost::shared_ptr<Region> b) { return a->position() < b->position(); } }; -struct RegionSortByLayer { +struct LIBARDOUR_API RegionSortByLayer { bool operator() (boost::shared_ptr<Region> a, boost::shared_ptr<Region> b) { return a->layer() < b->layer(); } }; +/* sort by RegionSortByLayerAndPosition() + * is equivalent to + * stable_sort by RegionSortByPosition(); + * stable_sort by RegionSortByLayer(); + */ +struct LIBARDOUR_API RegionSortByLayerAndPosition { + bool operator() (boost::shared_ptr<Region> a, boost::shared_ptr<Region> b) { + return + (a->layer() < b->layer() && a->position() < b->position()) + || (a->layer() == b->layer() && a->position() < b->position()); + } +}; + } // namespace #endif /* __libardour_region_sorters_h__ */ diff --git a/libs/ardour/ardour/resampled_source.h b/libs/ardour/ardour/resampled_source.h index a36ad4331f..bb088f36fb 100644 --- a/libs/ardour/ardour/resampled_source.h +++ b/libs/ardour/ardour/resampled_source.h @@ -22,12 +22,13 @@ #include <samplerate.h> +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "ardour/importable_source.h" namespace ARDOUR { -class ResampledImportableSource : public ImportableSource +class LIBARDOUR_API ResampledImportableSource : public ImportableSource { public: ResampledImportableSource (boost::shared_ptr<ImportableSource>, framecnt_t rate, SrcQuality); diff --git a/libs/ardour/ardour/return.h b/libs/ardour/ardour/return.h index 6dcd6ac2fc..45bb5573b2 100644 --- a/libs/ardour/ardour/return.h +++ b/libs/ardour/ardour/return.h @@ -34,7 +34,7 @@ class Amp; class PeakMeter; -class Return : public IOProcessor +class LIBARDOUR_API Return : public IOProcessor { public: Return (Session&, bool internal = false); diff --git a/libs/ardour/ardour/reverse.h b/libs/ardour/ardour/reverse.h index edc72ce707..4c24a7c1cb 100644 --- a/libs/ardour/ardour/reverse.h +++ b/libs/ardour/ardour/reverse.h @@ -24,7 +24,7 @@ namespace ARDOUR { -class Reverse : public Filter { +class LIBARDOUR_API Reverse : public Filter { public: Reverse (ARDOUR::Session&); ~Reverse (); diff --git a/libs/ardour/ardour/revision.h b/libs/ardour/ardour/revision.h index 9eeb1e2a9a..69c7519e01 100644 --- a/libs/ardour/ardour/revision.h +++ b/libs/ardour/ardour/revision.h @@ -20,8 +20,15 @@ #ifndef __ardour_revision_h__ #define __ardour_revision_h__ +#include "ardour/libardour_visibility.h" + namespace ARDOUR { - extern const char* revision; + + extern LIBARDOUR_API const char* revision; + + extern "C" { + LIBARDOUR_API const char* get_ardour_revision(); + } } #endif diff --git a/libs/ardour/ardour/route.h b/libs/ardour/ardour/route.h index 83605d7413..6dbdda496c 100644 --- a/libs/ardour/ardour/route.h +++ b/libs/ardour/ardour/route.h @@ -43,6 +43,7 @@ #include "ardour/ardour.h" #include "ardour/instrument_info.h" #include "ardour/io.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "ardour/mute_master.h" #include "ardour/route_group_member.h" @@ -53,6 +54,7 @@ namespace ARDOUR { class Amp; +class DelayLine; class Delivery; class IOProcessor; class Panner; @@ -67,7 +69,7 @@ class Pannable; class CapturingProcessor; class InternalSend; -class Route : public SessionObject, public Automatable, public RouteGroupMember, public GraphNode, public boost::enable_shared_from_this<Route> +class LIBARDOUR_API Route : public SessionObject, public Automatable, public RouteGroupMember, public GraphNode, public boost::enable_shared_from_this<Route> { public: @@ -189,6 +191,7 @@ class Route : public SessionObject, public Automatable, public RouteGroupMember, PeakMeter& peak_meter() { return *_meter.get(); } const PeakMeter& peak_meter() const { return *_meter.get(); } boost::shared_ptr<PeakMeter> shared_peak_meter() const { return _meter; } + boost::shared_ptr<DelayLine> delay_line() const { return _delayline; } void flush_processors (); @@ -284,6 +287,21 @@ class Route : public SessionObject, public Automatable, public RouteGroupMember, PBD::Signal1<void,void*> mute_changed; PBD::Signal0<void> mute_points_changed; + /** track numbers - assigned by session + * nubers > 0 indicate tracks (audio+midi) + * nubers < 0 indicate busses + * zero is reserved for unnumbered special busses. + * */ + PBD::Signal0<void> track_number_changed; + int64_t track_number() const { return _track_number; } + + void set_track_number(int64_t tn) { + if (tn == _track_number) { return; } + _track_number = tn; + track_number_changed(); + PropertyChanged (ARDOUR::Properties::name); + } + /** the processors have changed; the parameter indicates what changed */ PBD::Signal1<void,RouteProcessorChange> processors_changed; PBD::Signal1<void,void*> record_enable_changed; @@ -469,11 +487,20 @@ class Route : public SessionObject, public Automatable, public RouteGroupMember, pframes_t nframes, int declick, bool gain_automation_ok); + virtual void bounce_process (BufferSet& bufs, + framepos_t start_frame, framecnt_t nframes, + boost::shared_ptr<Processor> endpoint, bool include_endpoint, + bool for_export, bool for_freeze); + + framecnt_t bounce_get_latency (boost::shared_ptr<Processor> endpoint, bool include_endpoint, bool for_export, bool for_freeze) const; + ChanCount bounce_get_output_streams (ChanCount &cc, boost::shared_ptr<Processor> endpoint, bool include_endpoint, bool for_export, bool for_freeze) const; + boost::shared_ptr<IO> _input; boost::shared_ptr<IO> _output; bool _active; framecnt_t _signal_latency; + framecnt_t _signal_latency_at_amp_position; framecnt_t _initial_delay; framecnt_t _roll_delay; @@ -538,6 +565,7 @@ class Route : public SessionObject, public Automatable, public RouteGroupMember, boost::shared_ptr<Amp> _amp; boost::shared_ptr<PeakMeter> _meter; + boost::shared_ptr<DelayLine> _delayline; boost::shared_ptr<Processor> the_instrument_unlocked() const; @@ -549,6 +577,8 @@ class Route : public SessionObject, public Automatable, public RouteGroupMember, bool _has_order_key; uint32_t _remote_control_id; + int64_t _track_number; + void input_change_handler (IOChange, void *src); void output_change_handler (IOChange, void *src); diff --git a/libs/ardour/ardour/route_graph.h b/libs/ardour/ardour/route_graph.h index 0b0af6c7dd..77e74ceafd 100644 --- a/libs/ardour/ardour/route_graph.h +++ b/libs/ardour/ardour/route_graph.h @@ -37,7 +37,7 @@ typedef boost::shared_ptr<Route> GraphVertex; * * This may be a premature optimisation... */ -class GraphEdges +class LIBARDOUR_API GraphEdges { public: typedef std::map<GraphVertex, std::set<GraphVertex> > EdgeMap; diff --git a/libs/ardour/ardour/route_group.h b/libs/ardour/ardour/route_group.h index 2f62193d83..763430e1f1 100644 --- a/libs/ardour/ardour/route_group.h +++ b/libs/ardour/ardour/route_group.h @@ -29,24 +29,25 @@ #include "pbd/stateful.h" #include "pbd/signals.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "ardour/session_object.h" namespace ARDOUR { namespace Properties { - extern PBD::PropertyDescriptor<bool> relative; - extern PBD::PropertyDescriptor<bool> active; - extern PBD::PropertyDescriptor<bool> gain; - extern PBD::PropertyDescriptor<bool> mute; - extern PBD::PropertyDescriptor<bool> solo; - extern PBD::PropertyDescriptor<bool> recenable; - extern PBD::PropertyDescriptor<bool> select; - extern PBD::PropertyDescriptor<bool> route_active; - extern PBD::PropertyDescriptor<bool> color; - extern PBD::PropertyDescriptor<bool> monitoring; + LIBARDOUR_API extern PBD::PropertyDescriptor<bool> relative; + LIBARDOUR_API extern PBD::PropertyDescriptor<bool> active; + LIBARDOUR_API extern PBD::PropertyDescriptor<bool> gain; + LIBARDOUR_API extern PBD::PropertyDescriptor<bool> mute; + LIBARDOUR_API extern PBD::PropertyDescriptor<bool> solo; + LIBARDOUR_API extern PBD::PropertyDescriptor<bool> recenable; + LIBARDOUR_API extern PBD::PropertyDescriptor<bool> select; + LIBARDOUR_API extern PBD::PropertyDescriptor<bool> route_active; + LIBARDOUR_API extern PBD::PropertyDescriptor<bool> color; + LIBARDOUR_API extern PBD::PropertyDescriptor<bool> monitoring; /* we use this, but its declared in region.cc */ - extern PBD::PropertyDescriptor<bool> hidden; + LIBARDOUR_API extern PBD::PropertyDescriptor<bool> hidden; }; class Route; @@ -54,7 +55,7 @@ class Track; class AudioTrack; class Session; -class RouteGroup : public SessionObject +class LIBARDOUR_API RouteGroup : public SessionObject { public: static void make_property_quarks(); diff --git a/libs/ardour/ardour/route_group_member.h b/libs/ardour/ardour/route_group_member.h index 2665c719e6..b0368cb240 100644 --- a/libs/ardour/ardour/route_group_member.h +++ b/libs/ardour/ardour/route_group_member.h @@ -26,7 +26,7 @@ namespace ARDOUR { class RouteGroup; -class RouteGroupMember +class LIBARDOUR_API RouteGroupMember { public: RouteGroupMember () : _route_group (0) {} diff --git a/libs/ardour/backend_search_path.cc b/libs/ardour/ardour/route_sorters.h index 9a0425094b..022d5a24c3 100644 --- a/libs/ardour/backend_search_path.cc +++ b/libs/ardour/ardour/route_sorters.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2013 Paul Davis + Copyright (C) 2000-2014 Paul Davis This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,29 +17,28 @@ */ -#include <glibmm/miscutils.h> +#ifndef __libardour_route_sorters_h__ +#define __libardour_route_sorters_h__ -#include "ardour/backend_search_path.h" -#include "ardour/directory_names.h" -#include "ardour/filesystem_paths.h" - -namespace { - const char * const backend_env_variable_name = "ARDOUR_BACKEND_PATH"; -} // anonymous - -using namespace PBD; +#include "ardour/route.h" namespace ARDOUR { -SearchPath -backend_search_path () -{ - SearchPath spath(user_config_directory ()); - spath += ardour_dll_directory (); - spath.add_subdirectory_to_paths(backend_dir_name); - - spath += SearchPath(Glib::getenv(backend_env_variable_name)); - return spath; -} - -} // namespace ARDOUR +struct SignalOrderRouteSorter { + bool operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b) { + if (a->is_master() || a->is_monitor()) { + /* "a" is a special route (master, monitor, etc), and comes + * last in the mixer ordering + */ + return false; + } else if (b->is_master() || b->is_monitor()) { + /* everything comes before b */ + return true; + } + return a->order_key () < b->order_key (); + } +}; + +} // namespace + +#endif /* __libardour_route_sorters_h__ */ diff --git a/libs/ardour/ardour/runtime_functions.h b/libs/ardour/ardour/runtime_functions.h index 8882d721d7..e1d6b99f61 100644 --- a/libs/ardour/ardour/runtime_functions.h +++ b/libs/ardour/ardour/runtime_functions.h @@ -20,6 +20,7 @@ #ifndef __ardour_runtime_functions_h__ #define __ardour_runtime_functions_h__ +#include "ardour/libardour_visibility.h" #include "ardour/types.h" namespace ARDOUR { @@ -30,11 +31,11 @@ namespace ARDOUR { typedef void (*mix_buffers_with_gain_t) (ARDOUR::Sample *, const ARDOUR::Sample *, pframes_t, float); typedef void (*mix_buffers_no_gain_t) (ARDOUR::Sample *, const ARDOUR::Sample *, pframes_t); - extern compute_peak_t compute_peak; - extern find_peaks_t find_peaks; - extern apply_gain_to_buffer_t apply_gain_to_buffer; - extern mix_buffers_with_gain_t mix_buffers_with_gain; - extern mix_buffers_no_gain_t mix_buffers_no_gain; + LIBARDOUR_API extern compute_peak_t compute_peak; + LIBARDOUR_API extern find_peaks_t find_peaks; + LIBARDOUR_API extern apply_gain_to_buffer_t apply_gain_to_buffer; + LIBARDOUR_API extern mix_buffers_with_gain_t mix_buffers_with_gain; + LIBARDOUR_API extern mix_buffers_no_gain_t mix_buffers_no_gain; } #endif /* __ardour_runtime_functions_h__ */ diff --git a/libs/ardour/ardour/export_formats_search_path.h b/libs/ardour/ardour/scene_change.h index 7b6fcea09b..1f856beedf 100644 --- a/libs/ardour/ardour/export_formats_search_path.h +++ b/libs/ardour/ardour/scene_change.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2011 Paul Davis + Copyright (C) 2014 Paul Davis This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -14,21 +14,30 @@ 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_export_formats_search_path_h__ -#define __ardour_export_formats_search_path_h__ +#ifndef __libardour_scene_change_h__ +#define __libardour_scene_change_h__ + +#include "pbd/stateful.h" + +#include "ardour/types.h" -#include "pbd/search_path.h" +namespace ARDOUR +{ -namespace ARDOUR { +class SceneChange : public PBD::Stateful +{ + public: + SceneChange () {}; + virtual ~SceneChange () {}; - /** - * return a SearchPath containing directories in which to look for - * export_formats. - */ - PBD::SearchPath export_formats_search_path (); + static boost::shared_ptr<SceneChange> factory (const XMLNode&, int version); + static std::string xml_node_name; +}; -} // namespace ARDOUR +} /* namespace */ + -#endif /* __ardour_export_formats_search_path_h__ */ +#endif /* __libardour_scene_change_h__ */ diff --git a/libs/ardour/control_protocol_search_path.cc b/libs/ardour/ardour/scene_changer.h index 254cd03fe9..e171a23094 100644 --- a/libs/ardour/control_protocol_search_path.cc +++ b/libs/ardour/ardour/scene_changer.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2007 Tim Mayberry + Copyright (C) 2014 Paul Davis This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,31 +17,41 @@ */ -#include <iostream> +#ifndef __libardour_scene_changer_h__ +#define __libardour_scene_changer_h__ -#include <glibmm/miscutils.h> +#include <map> -#include "ardour/control_protocol_search_path.h" -#include "ardour/directory_names.h" -#include "ardour/filesystem_paths.h" +#include "pbd/signals.h" -namespace { - const char * const surfaces_env_variable_name = "ARDOUR_SURFACES_PATH"; -} // anonymous +#include "ardour/location.h" +#include "ardour/midi_scene_change.h" +#include "ardour/session_handle.h" +#include "ardour/types.h" -using namespace PBD; +namespace MIDI +{ +class Parser; +class Port; +} + +namespace ARDOUR +{ -namespace ARDOUR { +class Session; +class AsyncMidiPort; -SearchPath -control_protocol_search_path () +class SceneChanger : public SessionHandleRef { - SearchPath spath(user_config_directory ()); - spath += ardour_dll_directory (); - spath.add_subdirectory_to_paths (surfaces_dir_name); + public: + SceneChanger (Session& s) : SessionHandleRef (s) {} + virtual ~SceneChanger () {}; + + virtual void run (framepos_t start, framepos_t end) = 0; + virtual void locate (framepos_t where) = 0; +}; + +} /* namespace */ - spath += SearchPath(Glib::getenv(surfaces_env_variable_name)); - return spath; -} -} // namespace ARDOUR +#endif /* __libardour_scene_change_h__ */ diff --git a/libs/ardour/ardour/search_paths.h b/libs/ardour/ardour/search_paths.h new file mode 100644 index 0000000000..1815bc077c --- /dev/null +++ b/libs/ardour/ardour/search_paths.h @@ -0,0 +1,112 @@ +/* + Copyright (C) 2011 Tim Mayberry + Copyright (C) 2013 Paul Davis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#ifndef __libardour_search_paths_h__ +#define __libardour_search_paths_h__ + +#include "ardour/libardour_visibility.h" + +#include "pbd/search_path.h" + +namespace ARDOUR { + + LIBARDOUR_API const char *vst_search_path (); + + /** + * return a SearchPath containing directories in which to look for + * backend plugins. + * + * If ARDOUR_BACKEND_PATH is defined then the SearchPath returned + * will contain only those directories specified in it, otherwise it will + * contain the user and system directories which may contain audio/MIDI + * backends. + */ + LIBARDOUR_API PBD::Searchpath backend_search_path (); + + /** + * return a Searchpath containing directories in which to look for + * control surface plugins. + * + * If ARDOUR_SURFACES_PATH is defined then the Searchpath returned + * will contain only those directories specified in it, otherwise it will + * contain the user and system directories which may contain control + * surface plugins. + */ + LIBARDOUR_API PBD::Searchpath control_protocol_search_path (); + + /** + * return a Searchpath containing directories in which to look for + * export_formats. + */ + LIBARDOUR_API PBD::Searchpath export_formats_search_path (); + + /** + * return a Searchpath containing directories in which to look for + * LADSPA plugins. + * + * If LADSPA_PATH is defined then the Searchpath returned + * will contain the directories specified in it as well as the + * user and system directories. + */ + LIBARDOUR_API PBD::Searchpath ladspa_search_path (); + + /** + * return a Searchpath containing directories in which to look for + * lv2 plugins. + */ + LIBARDOUR_API PBD::Searchpath lv2_bundled_search_path (); + + /** + * return a Searchpath containing directories in which to look for + * MIDI patch files ("*.midnam") aka MIDNAM files + * + * If ARDOUR_MIDI_PATCH_PATH is defined then the Searchpath returned + * will contain only those directories specified in it, otherwise it will + * contain the user and system directories which may contain control + * surface plugins. + */ + LIBARDOUR_API PBD::Searchpath midi_patch_search_path (); + + /** + * return a Searchpath containing directories in which to look for + * panner plugins. + * + * If ARDOUR_PANNER_PATH is defined then the Searchpath returned + * will contain only those directories specified in it, otherwise it will + * contain the user and system directories which may contain control + * surface plugins. + */ + LIBARDOUR_API PBD::Searchpath panner_search_path (); + + /** + * return a Searchpath containing directories in which to look for + * route templates. + */ + LIBARDOUR_API PBD::Searchpath route_template_search_path (); + + /** + * return a Searchpath containing directories in which to look for + * other templates. + */ + LIBARDOUR_API PBD::Searchpath template_search_path (); + +} // namespace ARDOUR + +#endif /* __libardour_search_paths_h__ */ diff --git a/libs/ardour/ardour/send.h b/libs/ardour/ardour/send.h index 6e2775286d..17343bff96 100644 --- a/libs/ardour/ardour/send.h +++ b/libs/ardour/ardour/send.h @@ -26,13 +26,14 @@ #include "ardour/ardour.h" #include "ardour/delivery.h" +#include "ardour/delayline.h" namespace ARDOUR { class PeakMeter; class Amp; -class Send : public Delivery +class LIBARDOUR_API Send : public Delivery { public: Send (Session&, boost::shared_ptr<Pannable> pannable, boost::shared_ptr<MuteMaster>, Delivery::Role r = Delivery::Send, bool ignore_bitslot = false); @@ -59,6 +60,12 @@ class Send : public Delivery bool can_support_io_configuration (const ChanCount& in, ChanCount& out); bool configure_io (ChanCount in, ChanCount out); + /* latency compensation */ + void set_delay_in (framecnt_t); + void set_delay_out (framecnt_t); + framecnt_t get_delay_in () const { return _delay_in; } + framecnt_t get_delay_out () const { return _delay_out; } + void activate (); void deactivate (); @@ -73,6 +80,7 @@ class Send : public Delivery bool _metering; boost::shared_ptr<Amp> _amp; boost::shared_ptr<PeakMeter> _meter; + boost::shared_ptr<DelayLine> _delayline; private: /* disallow copy construction */ @@ -82,6 +90,9 @@ class Send : public Delivery int set_state_2X (XMLNode const &, int); uint32_t _bitslot; + + framecnt_t _delay_in; + framecnt_t _delay_out; }; } // namespace ARDOUR diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index b93f932cc0..03eccd40a3 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -129,6 +129,7 @@ class Route; class RouteGroup; class SMFSource; class Send; +class SceneChanger; class SessionDirectory; class SessionMetadata; class SessionPlaylists; @@ -141,7 +142,7 @@ class WindowsVSTPlugin; extern void setup_enum_writer (); -class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionList, public SessionEventManager +class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionList, public SessionEventManager { public: enum RecordState { @@ -236,7 +237,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi return _bundles.reader (); } - struct RoutePublicOrderSorter { + struct LIBARDOUR_API RoutePublicOrderSorter { bool operator() (boost::shared_ptr<Route>, boost::shared_ptr<Route> b); }; @@ -259,6 +260,10 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi bool route_name_unique (std::string) const; bool route_name_internal (std::string) const; + uint32_t track_number_decimals () const { + return _track_number_decimals; + } + bool get_record_enabled() const { return (record_status () >= Enabled); } @@ -396,13 +401,14 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi int rename (const std::string&); bool get_nsm_state () const { return _under_nsm_control; } void set_nsm_state (bool state) { _under_nsm_control = state; } + bool save_default_options (); PBD::Signal1<void,std::string> StateSaved; PBD::Signal0<void> StateReady; PBD::Signal0<void> SaveSession; - std::vector<std::string*>* possible_states() const; - static std::vector<std::string*>* possible_states (std::string path); + std::vector<std::string> possible_states() const; + static std::vector<std::string> possible_states (std::string path); XMLNode& get_state(); int set_state(const XMLNode& node, int version); // not idempotent @@ -424,6 +430,23 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi StateOfTheState state_of_the_state() const { return _state_of_the_state; } + class StateProtector { + public: + StateProtector (Session* s) : _session (s) { + g_atomic_int_inc (&s->_suspend_save); + } + ~StateProtector () { + if (g_atomic_int_dec_and_test (&_session->_suspend_save)) { + while (_session->_save_queued) { + _session->_save_queued = false; + _session->save_state (""); + } + } + } + private: + Session * _session; + }; + void add_route_group (RouteGroup *); void remove_route_group (RouteGroup&); void reorder_route_groups (std::list<RouteGroup*>); @@ -605,7 +628,8 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi boost::shared_ptr<Region> write_one_track (AudioTrack&, framepos_t start, framepos_t end, bool overwrite, std::vector<boost::shared_ptr<Source> >&, InterThreadInfo& wot, - boost::shared_ptr<Processor> endpoint, bool include_endpoint, bool for_export); + boost::shared_ptr<Processor> endpoint, + bool include_endpoint, bool for_export, bool for_freeze); int freeze_all (InterThreadInfo&); /* session-wide solo/mute/rec-enable */ @@ -753,6 +777,10 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi /* VST support */ + static int vst_current_loading_id; + static const char* vst_can_do_strings[]; + static const int vst_can_do_string_count; + static intptr_t vst_callback ( AEffect* effect, int32_t opcode, @@ -784,6 +812,10 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi return _exporting; } + bool bounce_processing() const { + return _bounce_processing_active; + } + /* this is a private enum, but setup_enum_writer() needs it, and i can't find a way to give that function friend access. sigh. @@ -827,7 +859,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi void request_resume_timecode_transmission (); bool timecode_transmission_suspended () const; - std::string source_search_path(DataType) const; + std::vector<std::string> source_search_path(DataType) const; void ensure_search_path_includes (const std::string& path, DataType type); std::list<std::string> unknown_processors () const; @@ -862,23 +894,31 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi */ static PBD::Signal2<void,std::string,std::string> VersionMismatch; + SceneChanger* scene_changer() const { return _scene_changer; } + boost::shared_ptr<Port> ltc_input_port() const; boost::shared_ptr<Port> ltc_output_port() const; boost::shared_ptr<IO> ltc_input_io() { return _ltc_input; } boost::shared_ptr<IO> ltc_output_io() { return _ltc_output; } - MIDI::Port* midi_input_port () const; - MIDI::Port* midi_output_port () const; - MIDI::Port* mmc_output_port () const; - MIDI::Port* mmc_input_port () const; + MIDI::Port* midi_input_port () const; + MIDI::Port* midi_output_port () const; + MIDI::Port* mmc_output_port () const; + MIDI::Port* mmc_input_port () const; - boost::shared_ptr<MidiPort> midi_clock_output_port () const; - boost::shared_ptr<MidiPort> midi_clock_input_port () const; - boost::shared_ptr<MidiPort> mtc_output_port () const; - boost::shared_ptr<MidiPort> mtc_input_port () const; + MIDI::Port* scene_input_port () const; + MIDI::Port* scene_output_port () const; - MIDI::MachineControl& mmc() { return *_mmc; } + boost::shared_ptr<MidiPort> scene_in () const; + boost::shared_ptr<MidiPort> scene_out () const; + + boost::shared_ptr<MidiPort> midi_clock_output_port () const; + boost::shared_ptr<MidiPort> midi_clock_input_port () const; + boost::shared_ptr<MidiPort> mtc_output_port () const; + boost::shared_ptr<MidiPort> mtc_input_port () const; + + MIDI::MachineControl& mmc() { return *_mmc; } protected: friend class AudioEngine; @@ -913,6 +953,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi mutable gint processing_prohibited; process_function_type process_function; process_function_type last_process_function; + bool _bounce_processing_active; bool waiting_for_sync_offset; framecnt_t _base_frame_rate; framecnt_t _current_frame_rate; //this includes video pullup offset @@ -967,13 +1008,15 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi void process_without_events (pframes_t); void process_with_events (pframes_t); void process_audition (pframes_t); - int process_export (pframes_t); + int process_export (pframes_t); int process_export_fw (pframes_t); void block_processing() { g_atomic_int_set (&processing_prohibited, 1); } void unblock_processing() { g_atomic_int_set (&processing_prohibited, 0); } bool processing_blocked() const { return g_atomic_int_get (&processing_prohibited); } + static const framecnt_t bounce_chunk_size; + /* slave tracking */ static const int delta_accumulator_size = 25; @@ -1072,6 +1115,10 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi bool state_was_pending; StateOfTheState _state_of_the_state; + friend class StateProtector; + gint _suspend_save; /* atomic */ + volatile bool _save_queued; + void auto_save(); int load_options (const XMLNode&); int load_state (std::string snapshot_name); @@ -1256,7 +1303,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi int start_midi_thread (); - void set_play_loop (bool yn); + void set_play_loop (bool yn, double speed); void unset_play_loop (); void overwrite_some_buffers (Track *); void flush_all_inserts (); @@ -1319,6 +1366,11 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi ChanCount input_start = ChanCount (), ChanCount output_start = ChanCount ()); void midi_output_change_handler (IOChange change, void* /*src*/, boost::weak_ptr<Route> midi_track); + /* track numbering */ + + void reassign_track_numbers (); + uint32_t _track_number_decimals; + /* mixer stuff */ bool solo_update_disabled; @@ -1601,18 +1653,22 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi void reconnect_ltc_input (); void reconnect_ltc_output (); - /* persistent, non-track related MIDI ports */ - MidiPortManager* _midi_ports; - MIDI::MachineControl* _mmc; - - void setup_ltc (); - void setup_click (); - void setup_click_state (const XMLNode*); - void setup_bundles (); - - static int get_session_info_from_path (XMLTree& state_tree, const std::string& xmlpath); + /* Scene Changing */ + SceneChanger* _scene_changer; + + /* persistent, non-track related MIDI ports */ + MidiPortManager* _midi_ports; + MIDI::MachineControl* _mmc; + + void setup_ltc (); + void setup_click (); + void setup_click_state (const XMLNode*); + void setup_bundles (); + + static int get_session_info_from_path (XMLTree& state_tree, const std::string& xmlpath); }; + } // namespace ARDOUR #endif /* __ardour_session_h__ */ diff --git a/libs/ardour/ardour/session_configuration.h b/libs/ardour/ardour/session_configuration.h index 46d6defa7d..c0af223943 100644 --- a/libs/ardour/ardour/session_configuration.h +++ b/libs/ardour/ardour/session_configuration.h @@ -24,7 +24,7 @@ namespace ARDOUR { -class SessionConfiguration : public Configuration +class LIBARDOUR_API SessionConfiguration : public Configuration { public: SessionConfiguration (); @@ -35,6 +35,9 @@ public: XMLNode& get_variables (); void set_variables (XMLNode const &); + bool load_state (); + bool save_state (); + /* define accessor methods */ #undef CONFIG_VARIABLE diff --git a/libs/ardour/ardour/session_configuration_vars.h b/libs/ardour/ardour/session_configuration_vars.h index 6349692e77..ec11fc545d 100644 --- a/libs/ardour/ardour/session_configuration_vars.h +++ b/libs/ardour/ardour/session_configuration_vars.h @@ -25,7 +25,6 @@ the value of the variable. *****************************************************/ -CONFIG_VARIABLE (CrossfadeChoice, xfade_choice, "xfade-choice", ConstantPowerMinus3dB) CONFIG_VARIABLE (uint32_t, destructive_xfade_msecs, "destructive-xfade-msecs", 2) CONFIG_VARIABLE (bool, use_region_fades, "use-region-fades", true) CONFIG_VARIABLE (bool, show_region_fades, "show-region-fades", true) @@ -41,6 +40,9 @@ CONFIG_VARIABLE (Timecode::TimecodeFormat, timecode_format, "timecode-format", T CONFIG_VARIABLE_SPECIAL(std::string, raid_path, "raid-path", "", PBD::path_expand) CONFIG_VARIABLE_SPECIAL(std::string, audio_search_path, "audio-search-path", "", PBD::search_path_expand) CONFIG_VARIABLE_SPECIAL(std::string, midi_search_path, "midi-search-path", "", PBD::search_path_expand) +CONFIG_VARIABLE (bool, track_name_number, "track-name-number", false) +CONFIG_VARIABLE (bool, track_name_take, "track-name-take", false) +CONFIG_VARIABLE (std::string, take_name, "take-name", "Take1") CONFIG_VARIABLE (bool, jack_time_master, "jack-time-master", true) CONFIG_VARIABLE (bool, use_video_sync, "use-video-sync", false) CONFIG_VARIABLE (float, video_pullup, "video-pullup", 0.0f) diff --git a/libs/ardour/ardour/session_directory.h b/libs/ardour/ardour/session_directory.h index a4c372d6ed..685f0870dd 100644 --- a/libs/ardour/ardour/session_directory.h +++ b/libs/ardour/ardour/session_directory.h @@ -22,9 +22,11 @@ #include <string> #include <vector> +#include "ardour/libardour_visibility.h" + namespace ARDOUR { -class SessionDirectory +class LIBARDOUR_API SessionDirectory { public: diff --git a/libs/ardour/ardour/session_event.h b/libs/ardour/ardour/session_event.h index ccec43d909..1283f32004 100644 --- a/libs/ardour/ardour/session_event.h +++ b/libs/ardour/ardour/session_event.h @@ -28,6 +28,7 @@ #include "pbd/ringbuffer.h" #include "pbd/event_loop.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" namespace ARDOUR { @@ -35,7 +36,7 @@ namespace ARDOUR { class Slave; class Region; -class SessionEvent { +class LIBARDOUR_API SessionEvent { public: enum Type { SetTransportSpeed, @@ -108,7 +109,7 @@ public: boost::shared_ptr<Region> region; - SessionEvent (Type t, Action a, framepos_t when, framepos_t where, double spd, bool yn = false, bool yn2 = false, bool yn3 = false) + SessionEvent (Type t, Action a, framepos_t when, framepos_t where, double spd, bool yn = false, bool yn2 = false, bool yn3 = false) : type (t) , action (a) , action_frame (when) diff --git a/libs/ardour/ardour/session_handle.h b/libs/ardour/ardour/session_handle.h index 0331970e5c..330f1805cd 100644 --- a/libs/ardour/ardour/session_handle.h +++ b/libs/ardour/ardour/session_handle.h @@ -22,10 +22,12 @@ #include "pbd/signals.h" +#include "ardour/libardour_visibility.h" + namespace ARDOUR { class Session; -class SessionHandleRef : public PBD::ScopedConnectionList +class LIBARDOUR_API SessionHandleRef : public PBD::ScopedConnectionList { public: SessionHandleRef (ARDOUR::Session& s); @@ -37,7 +39,7 @@ class SessionHandleRef : public PBD::ScopedConnectionList virtual void insanity_check (); }; -class SessionHandlePtr +class LIBARDOUR_API SessionHandlePtr { public: SessionHandlePtr (ARDOUR::Session* s); diff --git a/libs/ardour/ardour/session_metadata.h b/libs/ardour/ardour/session_metadata.h index c4341dbc61..b163e98f65 100644 --- a/libs/ardour/ardour/session_metadata.h +++ b/libs/ardour/ardour/session_metadata.h @@ -28,13 +28,15 @@ #include "pbd/statefuldestructible.h" #include "pbd/xml++.h" +#include "ardour/libardour_visibility.h" + namespace ARDOUR { /** Represents metadata associated to a Session * Metadata can be accessed and edited via this class. * Exported files can also be tagged with this data. */ -class SessionMetadata : public PBD::StatefulDestructible +class LIBARDOUR_API SessionMetadata : public PBD::StatefulDestructible { public: //singleton instance: diff --git a/libs/ardour/ardour/session_object.h b/libs/ardour/ardour/session_object.h index eacb0c49e9..ac74f07b77 100644 --- a/libs/ardour/ardour/session_object.h +++ b/libs/ardour/ardour/session_object.h @@ -31,7 +31,7 @@ namespace ARDOUR { namespace Properties { - extern PBD::PropertyDescriptor<std::string> name; + LIBARDOUR_API extern PBD::PropertyDescriptor<std::string> name; } class Session; @@ -40,7 +40,7 @@ class Session; expected to be destroyed before the session calls drop_references(). */ -class SessionObject : public SessionHandleRef, public PBD::StatefulDestructible +class LIBARDOUR_API SessionObject : public SessionHandleRef, public PBD::StatefulDestructible { public: static void make_property_quarks (); diff --git a/libs/ardour/ardour/session_playlists.h b/libs/ardour/ardour/session_playlists.h index 83dc8ee58c..e7ad1624dd 100644 --- a/libs/ardour/ardour/session_playlists.h +++ b/libs/ardour/ardour/session_playlists.h @@ -44,7 +44,7 @@ class Session; class Crossfade; class Track; -class SessionPlaylists : public PBD::ScopedConnectionList +class LIBARDOUR_API SessionPlaylists : public PBD::ScopedConnectionList { public: ~SessionPlaylists (); diff --git a/libs/ardour/ardour/session_state_utils.h b/libs/ardour/ardour/session_state_utils.h index 166b738d05..f35bbd0778 100644 --- a/libs/ardour/ardour/session_state_utils.h +++ b/libs/ardour/ardour/session_state_utils.h @@ -22,6 +22,8 @@ #include <vector> #include <string> +#include "ardour/libardour_visibility.h" + namespace ARDOUR { /** @@ -32,7 +34,7 @@ namespace ARDOUR { * * @return true if successful, false otherwise. */ -bool create_backup_file (const std::string & file_path); +LIBARDOUR_API bool create_backup_file (const std::string & file_path); /** * Get the absolute paths to all state files in the directory @@ -41,8 +43,8 @@ bool create_backup_file (const std::string & file_path); * @param directory_path The absolute path to a directory. * @param result vector to contain resulting state files. */ -void get_state_files_in_directory (const std::string& directory_path, - std::vector<std::string>& result); +LIBARDOUR_API void get_state_files_in_directory (const std::string& directory_path, + std::vector<std::string>& result); /** * Given a vector of paths to files, return a vector containing @@ -52,7 +54,7 @@ void get_state_files_in_directory (const std::string& directory_path, * @return a vector containing a list of file names without any * filename extension. */ -std::vector<std::string> get_file_names_no_extension (const std::vector<std::string> & file_paths); +LIBARDOUR_API std::vector<std::string> get_file_names_no_extension (const std::vector<std::string> & file_paths); } // namespace ARDOUR diff --git a/libs/ardour/ardour/session_utils.h b/libs/ardour/ardour/session_utils.h index ab24e976b2..bd9cc92267 100644 --- a/libs/ardour/ardour/session_utils.h +++ b/libs/ardour/ardour/session_utils.h @@ -23,9 +23,11 @@ #include <string> +#include "ardour/libardour_visibility.h" + namespace ARDOUR { -int find_session (std::string str, std::string& path, std::string& snapshot, bool& isnew); + LIBARDOUR_API extern int find_session (std::string str, std::string& path, std::string& snapshot, bool& isnew); }; diff --git a/libs/ardour/ardour/silentfilesource.h b/libs/ardour/ardour/silentfilesource.h index 5cdade3751..cf6462247a 100644 --- a/libs/ardour/ardour/silentfilesource.h +++ b/libs/ardour/ardour/silentfilesource.h @@ -25,13 +25,14 @@ namespace ARDOUR { -class SilentFileSource : public AudioFileSource { +class LIBARDOUR_API SilentFileSource : public AudioFileSource { public: int update_header (framepos_t /*when*/, struct tm&, time_t) { return 0; } int flush_header () { return 0; } float sample_rate () const { return _sample_rate; } void set_length (framecnt_t len) { _length = len; } + void flush () {} bool destructive() const { return false; } bool can_be_analysed() const { return false; } @@ -59,7 +60,7 @@ protected: void set_header_timeline_position () {} int read_peaks_with_fpp (PeakData *peaks, framecnt_t npeaks, framepos_t /*start*/, framecnt_t /*cnt*/, - double /*samples_per_unit*/, framecnt_t /*fpp*/) const { + double /*frames_per_pixel*/, framecnt_t /*fpp*/) const { memset (peaks, 0, sizeof (PeakData) * npeaks); return 0; } diff --git a/libs/ardour/ardour/slave.h b/libs/ardour/ardour/slave.h index 364929eaab..6df10c3f9a 100644 --- a/libs/ardour/ardour/slave.h +++ b/libs/ardour/ardour/slave.h @@ -24,13 +24,13 @@ #include <glibmm/threads.h> -#include <jack/jack.h> #include <ltc.h> #include "pbd/signals.h" #include "timecode/time.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "midi++/parser.h" #include "midi++/types.h" @@ -59,7 +59,7 @@ class MidiPort; * Therefore it is rather that class, that makes ARDOUR a slave by connecting it * to its external time master. */ -class Slave { +class LIBARDOUR_API Slave { public: Slave() { } virtual ~Slave() {} @@ -180,7 +180,7 @@ class Slave { }; /// We need this wrapper for testability, it's just too hard to mock up a session class -class ISlaveSessionProxy { +class LIBARDOUR_API ISlaveSessionProxy { public: virtual ~ISlaveSessionProxy() {} virtual TempoMap& tempo_map() const { return *((TempoMap *) 0); } @@ -200,7 +200,7 @@ class ISlaveSessionProxy { /// The Session Proxy for use in real Ardour -class SlaveSessionProxy : public ISlaveSessionProxy { +class LIBARDOUR_API SlaveSessionProxy : public ISlaveSessionProxy { Session& session; public: @@ -219,7 +219,7 @@ class SlaveSessionProxy : public ISlaveSessionProxy { void request_transport_speed (double speed); }; -struct SafeTime { +struct LIBARDOUR_API SafeTime { volatile int guard1; framepos_t position; framepos_t timestamp; @@ -235,7 +235,7 @@ struct SafeTime { } }; -class TimecodeSlave : public Slave { +class LIBARDOUR_API TimecodeSlave : public Slave { public: TimecodeSlave () {} @@ -252,7 +252,7 @@ class TimecodeSlave : public Slave { bool timecode_negative_offset; }; -class MTC_Slave : public TimecodeSlave { +class LIBARDOUR_API MTC_Slave : public TimecodeSlave { public: MTC_Slave (Session&, MidiPort&); ~MTC_Slave (); @@ -336,7 +336,7 @@ class MTC_Slave : public TimecodeSlave { void parameter_changed(std::string const & p); }; -class LTC_Slave : public TimecodeSlave { +class LIBARDOUR_API LTC_Slave : public TimecodeSlave { public: LTC_Slave (Session&); ~LTC_Slave (); @@ -404,7 +404,7 @@ public: double b, c; ///< DLL filter coefficients }; -class MIDIClock_Slave : public Slave { +class LIBARDOUR_API MIDIClock_Slave : public Slave { public: MIDIClock_Slave (Session&, MidiPort&, int ppqn = 24); @@ -490,7 +490,7 @@ class MIDIClock_Slave : public Slave { bool _starting; }; -class Engine_Slave : public Slave +class LIBARDOUR_API Engine_Slave : public Slave { public: Engine_Slave (AudioEngine&); diff --git a/libs/ardour/ardour/smf_source.h b/libs/ardour/ardour/smf_source.h index f359100451..84c45f9b3c 100644 --- a/libs/ardour/ardour/smf_source.h +++ b/libs/ardour/ardour/smf_source.h @@ -34,7 +34,7 @@ namespace ARDOUR { template<typename T> class MidiRingBuffer; /** Standard Midi File (Type 0) Source */ -class SMFSource : public MidiSource, public FileSource, public Evoral::SMF { +class LIBARDOUR_API SMFSource : public MidiSource, public FileSource, public Evoral::SMF { public: /** Constructor for new internal-to-session files */ SMFSource (Session& session, const std::string& path, Source::Flag flags); diff --git a/libs/ardour/ardour/sndfileimportable.h b/libs/ardour/ardour/sndfileimportable.h index 8612e264c4..10c429c545 100644 --- a/libs/ardour/ardour/sndfileimportable.h +++ b/libs/ardour/ardour/sndfileimportable.h @@ -22,12 +22,13 @@ #include <boost/shared_ptr.hpp> #include <sndfile.h> +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "ardour/importable_source.h" namespace ARDOUR { -class SndFileImportableSource : public ImportableSource { +class LIBARDOUR_API SndFileImportableSource : public ImportableSource { public: SndFileImportableSource (const std::string& path); virtual ~SndFileImportableSource(); diff --git a/libs/ardour/ardour/sndfilesource.h b/libs/ardour/ardour/sndfilesource.h index 9604d3f232..831f8db5f7 100644 --- a/libs/ardour/ardour/sndfilesource.h +++ b/libs/ardour/ardour/sndfilesource.h @@ -28,7 +28,7 @@ namespace ARDOUR { -class SndFileSource : public AudioFileSource { +class LIBARDOUR_API SndFileSource : public AudioFileSource { public: /** Constructor to be called for existing external-to-session files */ SndFileSource (Session&, const std::string& path, int chn, Flag flags); @@ -55,6 +55,7 @@ class SndFileSource : public AudioFileSource { float sample_rate () const; int update_header (framepos_t when, struct tm&, time_t); int flush_header (); + void flush (); framepos_t natural_position () const; diff --git a/libs/ardour/ardour/soundcloud_upload.h b/libs/ardour/ardour/soundcloud_upload.h new file mode 100644 index 0000000000..c1074f016b --- /dev/null +++ b/libs/ardour/ardour/soundcloud_upload.h @@ -0,0 +1,55 @@ +/* soundcloud_upload.h ****************************************************** + + Adapted for Ardour by Ben Loftis, March 2012 + +*****************************************************************************/ + +#ifndef __ardour_soundcloud_upload_h__ +#define __ardour_soundcloud_upload_h__ + +#include <string> +#include <fstream> +#include <iostream> +#include <stdio.h> +#include <cstring> +#include <string> +#include <sstream> +#include <vector> + +#include "curl/curl.h" +#include "ardour/session_handle.h" +#include "ardour/export_handler.h" +#include "pbd/signals.h" + +//--- struct to store XML file +struct MemoryStruct { + char *memory; + size_t size; +}; + + +class SoundcloudUploader +{ +public: + SoundcloudUploader(); + ~SoundcloudUploader(); + + std::string Get_Auth_Token(std::string username, std::string password); + std::string Upload (std::string file_path, std::string title, std::string token, bool ispublic, bool downloadable, ARDOUR::ExportHandler *caller); + static int progress_callback(void *caller, double dltotal, double dlnow, double ultotal, double ulnow); + + +private: + + void setcUrlOptions(); + + CURL *curl_handle; + CURLM *multi_handle; + char errorBuffer[CURL_ERROR_SIZE]; // storage for cUrl error message + + std::string title; + ARDOUR::ExportHandler *caller; + +}; + +#endif /* __ardour_soundcloud_upload_h__ */ diff --git a/libs/ardour/ardour/soundseq.h b/libs/ardour/ardour/soundseq.h index ff8e96ad8f..02425a71cf 100644 --- a/libs/ardour/ardour/soundseq.h +++ b/libs/ardour/ardour/soundseq.h @@ -26,21 +26,21 @@ namespace ARDOUR { typedef gint16 peak_datum; -struct peak_data_t { +struct LIBARDOUR_API peak_data_t { peak_datum min; peak_datum max; }; const uint32_t frames_per_peak = 2048; -class Sound : public EDL::Piece { +class LIBARDOUR_API Sound : public EDL::Piece { public: int peak (peak_data_t& pk, uint32_t start, uint32_t cnt); int read_peaks (peak_data_t *, uint32_t npeaks, uint32_t start, uint32_t cnt); int build_peak (uint32_t first_frame, uint32_t cnt); }; -class SoundPlaylist : public EDL::Playlist { +class LIBARDOUR_API SoundPlaylist : public EDL::Playlist { public: int read_peaks (peak_data_t *, uint32_t npeaks, uint32_t start, uint32_t cnt); }; diff --git a/libs/ardour/ardour/source.h b/libs/ardour/ardour/source.h index 5e851702d4..78b3cfaa21 100644 --- a/libs/ardour/ardour/source.h +++ b/libs/ardour/ardour/source.h @@ -36,7 +36,7 @@ namespace ARDOUR { class Session; -class Source : public SessionObject +class LIBARDOUR_API Source : public SessionObject { public: enum Flag { diff --git a/libs/ardour/ardour/source_factory.h b/libs/ardour/ardour/source_factory.h index ce0f86bb6b..614fdce7b1 100644 --- a/libs/ardour/ardour/source_factory.h +++ b/libs/ardour/ardour/source_factory.h @@ -36,7 +36,7 @@ class Session; class AudioSource; class Playlist; -class SourceFactory { +class LIBARDOUR_API SourceFactory { public: static void init (); diff --git a/libs/ardour/ardour/speaker.h b/libs/ardour/ardour/speaker.h index 3deeb8b0d9..c643eb5d02 100644 --- a/libs/ardour/ardour/speaker.h +++ b/libs/ardour/ardour/speaker.h @@ -22,9 +22,11 @@ #include "pbd/cartesian.h" #include "pbd/signals.h" +#include "ardour/libardour_visibility.h" + namespace ARDOUR { -class Speaker { +class LIBARDOUR_API Speaker { public: Speaker (int, const PBD::AngularVector& position); Speaker (const Speaker &); diff --git a/libs/ardour/ardour/speakers.h b/libs/ardour/ardour/speakers.h index dbe4ef180e..cde2c40dbb 100644 --- a/libs/ardour/ardour/speakers.h +++ b/libs/ardour/ardour/speakers.h @@ -31,7 +31,7 @@ class XMLNode; namespace ARDOUR { -class Speakers : public PBD::Stateful { +class LIBARDOUR_API Speakers : public PBD::Stateful { public: Speakers (); Speakers (const Speakers&); diff --git a/libs/ardour/ardour/spline.h b/libs/ardour/ardour/spline.h index 6a12e96d52..475441fd44 100644 --- a/libs/ardour/ardour/spline.h +++ b/libs/ardour/ardour/spline.h @@ -28,7 +28,7 @@ extern "C" { typedef struct _spline Spline; typedef struct _spline_point SplinePoint; -struct _spline_point +struct LIBARDOUR_API _spline_point { float x; float y; @@ -45,7 +45,7 @@ void spline_fill (Spline *, float x0, float x1, float *vec, uint32_t veclen); float spline_get_max_x (Spline *); float spline_get_min_x (Spline *); -struct _spline +struct LIBARDOUR_API _spline { float *deriv2; float *x; diff --git a/libs/ardour/ardour/srcfilesource.h b/libs/ardour/ardour/srcfilesource.h index 0b0865acc6..78564c8b88 100644 --- a/libs/ardour/ardour/srcfilesource.h +++ b/libs/ardour/ardour/srcfilesource.h @@ -23,18 +23,21 @@ #include <cstring> #include <samplerate.h> + +#include "ardour/libardour_visibility.h" #include "ardour/audiofilesource.h" #include "ardour/session.h" namespace ARDOUR { -class SrcFileSource : public AudioFileSource { +class LIBARDOUR_API SrcFileSource : public AudioFileSource { public: SrcFileSource (Session&, boost::shared_ptr<AudioFileSource>, SrcQuality srcq = SrcQuality(SrcQuick)); ~SrcFileSource (); - int update_header (framepos_t /*when*/, struct tm&, time_t) { return 0; } - int flush_header () { return 0; } + int update_header (framepos_t /*when*/, struct tm&, time_t) { return 0; } + int flush_header () { return 0; } + void flush () { } void set_header_timeline_position () {}; void set_length (framecnt_t /*len*/) {}; diff --git a/libs/ardour/ardour/stretch.h b/libs/ardour/ardour/stretch.h index 066ed7861a..edca5fc44b 100644 --- a/libs/ardour/ardour/stretch.h +++ b/libs/ardour/ardour/stretch.h @@ -33,7 +33,7 @@ namespace ARDOUR { -class RBStretch : public RBEffect { +class LIBARDOUR_API RBStretch : public RBEffect { public: RBStretch (ARDOUR::Session&, TimeFXRequest&); ~RBStretch() {} @@ -47,7 +47,7 @@ class RBStretch : public RBEffect { namespace ARDOUR { -class STStretch : public Filter { +class LIBARDOUR_API STStretch : public Filter { public: STStretch (ARDOUR::Session&, TimeFXRequest&); ~STStretch (); diff --git a/libs/ardour/ardour/strip_silence.h b/libs/ardour/ardour/strip_silence.h index eed4320173..59f4ea0a57 100644 --- a/libs/ardour/ardour/strip_silence.h +++ b/libs/ardour/ardour/strip_silence.h @@ -22,7 +22,7 @@ namespace ARDOUR { /// A filter to strip silence from regions -class StripSilence : public Filter +class LIBARDOUR_API StripSilence : public Filter { public: StripSilence (Session &, const AudioIntervalMap&, framecnt_t fade_length); diff --git a/libs/ardour/midi_patch_search_path.cc b/libs/ardour/ardour/system_exec.h index ccad1de466..ae865c7bff 100644 --- a/libs/ardour/midi_patch_search_path.cc +++ b/libs/ardour/ardour/system_exec.h @@ -1,5 +1,6 @@ /* - Copyright (C) 2007 Tim Mayberry + Copyright (C) 2010 Paul Davis + Copyright (C) 2010-2014 Robin Gareus <robin@gareus.org> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -16,35 +17,35 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#ifndef _ardour_system_exec_h_ +#define _ardour_system_exec_h_ -#include <glibmm/miscutils.h> - -#include "ardour/midi_patch_search_path.h" -#include "ardour/directory_names.h" -#include "ardour/filesystem_paths.h" - -namespace { - const char * const midi_patch_env_variable_name = "ARDOUR_MIDI_PATCH_PATH"; -} // anonymous - -using namespace PBD; +#include "ardour/libardour_visibility.h" +#include "pbd/system_exec.h" namespace ARDOUR { -SearchPath -midi_patch_search_path () +class LIBARDOUR_API SystemExec + : public PBD::SystemExec { - SearchPath spath (ardour_data_search_path()); - spath.add_subdirectory_to_paths(midi_patch_dir_name); - bool midi_patch_path_defined = false; - SearchPath spath_env (Glib::getenv(midi_patch_env_variable_name, midi_patch_path_defined)); +public: + SystemExec (std::string c, std::string a = ""); + SystemExec (std::string c, char ** a); + SystemExec (std::string c, const std::map<char, std::string> subs); + ~SystemExec (); - if (midi_patch_path_defined) { - spath += spath_env; + int start (int stderr_mode = 1) { + return PBD::SystemExec::start(stderr_mode, _vfork_exec_wrapper); } - return spath; -} +private: + static char * _vfork_exec_wrapper; + +}; /* end class */ + +}; /* end namespace */ + +#endif /* _libpbd_system_exec_h_ */ + -} // namespace ARDOUR diff --git a/libs/ardour/ardour/tape_file_matcher.h b/libs/ardour/ardour/tape_file_matcher.h index 6c8392f46f..623bd406a8 100644 --- a/libs/ardour/ardour/tape_file_matcher.h +++ b/libs/ardour/ardour/tape_file_matcher.h @@ -23,9 +23,11 @@ #include <regex.h> +#include "ardour/libardour_visibility.h" + namespace ARDOUR { -class TapeFileMatcher +class LIBARDOUR_API TapeFileMatcher { public: diff --git a/libs/ardour/ardour/template_utils.h b/libs/ardour/ardour/template_utils.h index e01a62bbd1..dc56c53c44 100644 --- a/libs/ardour/ardour/template_utils.h +++ b/libs/ardour/ardour/template_utils.h @@ -24,23 +24,25 @@ #include <string> #include <vector> +#include "ardour/libardour_visibility.h" + namespace ARDOUR { - std::string system_template_directory (); - std::string system_route_template_directory (); + LIBARDOUR_API std::string system_template_directory (); + LIBARDOUR_API std::string system_route_template_directory (); - std::string user_template_directory (); - std::string user_route_template_directory (); + LIBARDOUR_API std::string user_template_directory (); + LIBARDOUR_API std::string user_route_template_directory (); - struct TemplateInfo { + struct LIBARDOUR_API TemplateInfo { std::string name; std::string path; }; - void find_route_templates (std::vector<TemplateInfo>& template_names); - void find_session_templates (std::vector<TemplateInfo>& template_names); + LIBARDOUR_API void find_route_templates (std::vector<TemplateInfo>& template_names); + LIBARDOUR_API void find_session_templates (std::vector<TemplateInfo>& template_names); - std::string session_template_dir_to_file (std::string const &); + LIBARDOUR_API std::string session_template_dir_to_file (std::string const &); } // namespace ARDOUR diff --git a/libs/ardour/ardour/tempo.h b/libs/ardour/ardour/tempo.h index bedc825288..8fa5ed45a0 100644 --- a/libs/ardour/ardour/tempo.h +++ b/libs/ardour/ardour/tempo.h @@ -45,7 +45,7 @@ class Meter; class TempoMap; /** Tempo, the speed at which musical time progresses (BPM). */ -class Tempo { +class LIBARDOUR_API Tempo { public: Tempo (double bpm, double type=4.0) // defaulting to quarter note : _beats_per_minute (bpm), _note_type(type) {} @@ -62,7 +62,7 @@ class Tempo { }; /** Meter, or time signature (beats per bar, and which note type is a beat). */ -class Meter { +class LIBARDOUR_API Meter { public: Meter (double dpb, double bt) : _divisions_per_bar (dpb), _note_type (bt) {} @@ -87,7 +87,7 @@ class Meter { }; /** A section of timeline with a certain Tempo or Meter. */ -class MetricSection { +class LIBARDOUR_API MetricSection { public: MetricSection (const Timecode::BBT_Time& start) : _start (start), _frame (0), _movable (true) {} @@ -123,7 +123,7 @@ class MetricSection { }; /** A section of timeline with a certain Meter. */ -class MeterSection : public MetricSection, public Meter { +class LIBARDOUR_API MeterSection : public MetricSection, public Meter { public: MeterSection (const Timecode::BBT_Time& start, double bpb, double note_type) : MetricSection (start), Meter (bpb, note_type) {} @@ -137,7 +137,7 @@ class MeterSection : public MetricSection, public Meter { }; /** A section of timeline with a certain Tempo. */ -class TempoSection : public MetricSection, public Tempo { +class LIBARDOUR_API TempoSection : public MetricSection, public Tempo { public: TempoSection (const Timecode::BBT_Time& start, double qpm, double note_type) : MetricSection (start), Tempo (qpm, note_type), _bar_offset (-1.0) {} @@ -170,7 +170,7 @@ typedef std::list<MetricSection*> Metrics; /** Helper class to keep track of the Meter *AND* Tempo in effect at a given point in time. */ -class TempoMetric { +class LIBARDOUR_API TempoMetric { public: TempoMetric (const Meter& m, const Tempo& t) : _meter (&m), _tempo (&t), _frame (0) {} @@ -205,7 +205,7 @@ class TempoMetric { Timecode::BBT_Time _start; }; -class TempoMap : public PBD::StatefulDestructible +class LIBARDOUR_API TempoMap : public PBD::StatefulDestructible { public: TempoMap (framecnt_t frame_rate); diff --git a/libs/ardour/ardour/tempo_map_importer.h b/libs/ardour/ardour/tempo_map_importer.h index 57c7402781..28a65218c7 100644 --- a/libs/ardour/ardour/tempo_map_importer.h +++ b/libs/ardour/ardour/tempo_map_importer.h @@ -32,14 +32,14 @@ namespace ARDOUR { class Session; -class TempoMapImportHandler : public ElementImportHandler +class LIBARDOUR_API TempoMapImportHandler : public ElementImportHandler { public: TempoMapImportHandler (XMLTree const & source, Session & session); std::string get_info () const; }; -class TempoMapImporter : public ElementImporter +class LIBARDOUR_API TempoMapImporter : public ElementImporter { private: typedef boost::shared_ptr<XMLNode> XMLNodePtr; diff --git a/libs/ardour/ardour/thread_buffers.h b/libs/ardour/ardour/thread_buffers.h index 9d92454887..bf686fd57e 100644 --- a/libs/ardour/ardour/thread_buffers.h +++ b/libs/ardour/ardour/thread_buffers.h @@ -23,18 +23,19 @@ #include <glibmm/threads.h> #include "ardour/chan_count.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" namespace ARDOUR { class BufferSet; -class ThreadBuffers { +class LIBARDOUR_API ThreadBuffers { public: ThreadBuffers (); ~ThreadBuffers (); - void ensure_buffers (ChanCount howmany = ChanCount::ZERO); + void ensure_buffers (ChanCount howmany = ChanCount::ZERO, size_t custom = 0); BufferSet* silent_buffers; BufferSet* scratch_buffers; diff --git a/libs/ardour/ardour/ticker.h b/libs/ardour/ardour/ticker.h index 7f0d1987fc..0e5c3c80f4 100644 --- a/libs/ardour/ardour/ticker.h +++ b/libs/ardour/ardour/ticker.h @@ -23,6 +23,7 @@ #include "pbd/signals.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "ardour/session_handle.h" @@ -35,7 +36,7 @@ namespace ARDOUR { class Session; class MidiPort; -class MidiClockTicker : public SessionHandlePtr, boost::noncopyable +class LIBARDOUR_API MidiClockTicker : public SessionHandlePtr, boost::noncopyable { public: MidiClockTicker (); diff --git a/libs/ardour/ardour/track.h b/libs/ardour/ardour/track.h index c763b440af..d33e24e4e6 100644 --- a/libs/ardour/ardour/track.h +++ b/libs/ardour/ardour/track.h @@ -35,7 +35,7 @@ class Region; class Diskstream; class IO; -class Track : public Route, public PublicDiskstream +class LIBARDOUR_API Track : public Route, public PublicDiskstream { public: Track (Session&, std::string name, Route::Flag f = Route::Flag (0), TrackMode m = Normal, DataType default_type = DataType::AUDIO); @@ -44,6 +44,7 @@ class Track : public Route, public PublicDiskstream int init (); bool set_name (const std::string& str); + void resync_track_name (); TrackMode mode () const { return _mode; } virtual int set_mode (TrackMode /*m*/) { return false; } @@ -96,7 +97,7 @@ class Track : public Route, public PublicDiskstream virtual boost::shared_ptr<Region> bounce_range (framepos_t start, framepos_t end, InterThreadInfo&, boost::shared_ptr<Processor> endpoint, bool include_endpoint) = 0; virtual int export_stuff (BufferSet& bufs, framepos_t start_frame, framecnt_t nframes, - boost::shared_ptr<Processor> endpoint, bool include_endpoint, bool for_export) = 0; + boost::shared_ptr<Processor> endpoint, bool include_endpoint, bool for_export, bool for_freeze) = 0; XMLNode& get_state(); XMLNode& get_template(); @@ -228,6 +229,9 @@ private: void diskstream_record_enable_changed (); void diskstream_speed_changed (); void diskstream_alignment_style_changed (); + void parameter_changed (std::string const & p); + + std::string _diskstream_name; }; }; /* namespace ARDOUR*/ diff --git a/libs/ardour/ardour/transient_detector.h b/libs/ardour/ardour/transient_detector.h index 322e4cbc75..0e07c5851a 100644 --- a/libs/ardour/ardour/transient_detector.h +++ b/libs/ardour/ardour/transient_detector.h @@ -28,7 +28,7 @@ class AudioSource; class Readable; class Session; -class TransientDetector : public AudioAnalyser +class LIBARDOUR_API TransientDetector : public AudioAnalyser { public: TransientDetector (float sample_rate); diff --git a/libs/ardour/ardour/trimmable.h b/libs/ardour/ardour/trimmable.h index 071e3d151a..07e2c809a3 100644 --- a/libs/ardour/ardour/trimmable.h +++ b/libs/ardour/ardour/trimmable.h @@ -22,7 +22,7 @@ namespace ARDOUR { -class Trimmable { +class LIBARDOUR_API Trimmable { public: Trimmable() {} virtual ~Trimmable() {} diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h index 50a96030b1..df7c40a669 100644 --- a/libs/ardour/ardour/types.h +++ b/libs/ardour/ardour/types.h @@ -38,6 +38,7 @@ #include "evoral/Range.hpp" #include "ardour/chan_count.h" +#include "ardour/plugin_types.h" #include <map> @@ -418,17 +419,6 @@ namespace ARDOUR { MixerOrdered }; - enum CrossfadeModel { - FullCrossfade, - ShortCrossfade - }; - - enum CrossfadeChoice { - RegionFades, - ConstantPowerMinus3dB, - ConstantPowerMinus6dB, - }; - enum ListenPosition { AfterFaderListen, PreFaderListen @@ -469,14 +459,6 @@ namespace ARDOUR { PeakDatum max; }; - enum PluginType { - AudioUnit, - LADSPA, - LV2, - Windows_VST, - LXVST, - }; - enum RunContext { ButlerContext = 0, TransportContext, @@ -629,8 +611,6 @@ std::istream& operator>>(std::istream& o, ARDOUR::AFLPosition& sf); std::istream& operator>>(std::istream& o, ARDOUR::RemoteModel& sf); std::istream& operator>>(std::istream& o, ARDOUR::ListenPosition& sf); std::istream& operator>>(std::istream& o, ARDOUR::InsertMergePolicy& sf); -std::istream& operator>>(std::istream& o, ARDOUR::CrossfadeModel& sf); -std::istream& operator>>(std::istream& o, ARDOUR::CrossfadeChoice& sf); std::istream& operator>>(std::istream& o, ARDOUR::SyncSource& sf); std::istream& operator>>(std::istream& o, ARDOUR::ShuttleBehaviour& sf); std::istream& operator>>(std::istream& o, ARDOUR::ShuttleUnits& sf); @@ -639,6 +619,7 @@ std::istream& operator>>(std::istream& o, ARDOUR::DenormalModel& sf); std::istream& operator>>(std::istream& o, ARDOUR::WaveformScale& sf); std::istream& operator>>(std::istream& o, ARDOUR::WaveformShape& sf); std::istream& operator>>(std::istream& o, ARDOUR::PositionLockStyle& sf); +std::istream& operator>>(std::istream& o, ARDOUR::FadeShape& sf); std::ostream& operator<<(std::ostream& o, const ARDOUR::SampleFormat& sf); std::ostream& operator<<(std::ostream& o, const ARDOUR::HeaderFormat& sf); @@ -652,8 +633,6 @@ std::ostream& operator<<(std::ostream& o, const ARDOUR::AFLPosition& sf); std::ostream& operator<<(std::ostream& o, const ARDOUR::RemoteModel& sf); std::ostream& operator<<(std::ostream& o, const ARDOUR::ListenPosition& sf); std::ostream& operator<<(std::ostream& o, const ARDOUR::InsertMergePolicy& sf); -std::ostream& operator<<(std::ostream& o, const ARDOUR::CrossfadeModel& sf); -std::ostream& operator<<(std::ostream& o, const ARDOUR::CrossfadeChoice& sf); std::ostream& operator<<(std::ostream& o, const ARDOUR::SyncSource& sf); std::ostream& operator<<(std::ostream& o, const ARDOUR::ShuttleBehaviour& sf); std::ostream& operator<<(std::ostream& o, const ARDOUR::ShuttleUnits& sf); @@ -662,6 +641,7 @@ std::ostream& operator<<(std::ostream& o, const ARDOUR::DenormalModel& sf); std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformScale& sf); std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformShape& sf); std::ostream& operator<<(std::ostream& o, const ARDOUR::PositionLockStyle& sf); +std::ostream& operator<<(std::ostream& o, const ARDOUR::FadeShape& sf); static inline ARDOUR::framepos_t session_frame_to_track_frame (ARDOUR::framepos_t session_frame, double speed) diff --git a/libs/ardour/ardour/unknown_processor.h b/libs/ardour/ardour/unknown_processor.h index 61a5734df2..50234e8294 100644 --- a/libs/ardour/ardour/unknown_processor.h +++ b/libs/ardour/ardour/unknown_processor.h @@ -39,7 +39,7 @@ namespace ARDOUR { * session on a machine without a particular plugin will not corrupt * the session. */ -class UnknownProcessor : public Processor +class LIBARDOUR_API UnknownProcessor : public Processor { public: UnknownProcessor (Session &, XMLNode const &); diff --git a/libs/ardour/ardour/uri_map.h b/libs/ardour/ardour/uri_map.h index 18008f0df2..a948ea4002 100644 --- a/libs/ardour/ardour/uri_map.h +++ b/libs/ardour/ardour/uri_map.h @@ -28,6 +28,8 @@ #include "lv2/lv2plug.in/ns/ext/uri-map/uri-map.h" #include "lv2/lv2plug.in/ns/ext/urid/urid.h" +#include "ardour/libardour_visibility.h" + namespace ARDOUR { /** Implementation of the LV2 uri-map and urid extensions. @@ -35,7 +37,7 @@ namespace ARDOUR { * This just uses a pair of std::map and is not so great in the space overhead * department, but it's fast enough and not really performance critical anyway. */ -class URIMap : public boost::noncopyable { +class LIBARDOUR_API URIMap : public boost::noncopyable { public: URIMap(); diff --git a/libs/ardour/ardour/user_bundle.h b/libs/ardour/ardour/user_bundle.h index 5ecfe521f5..4ff435ef35 100644 --- a/libs/ardour/ardour/user_bundle.h +++ b/libs/ardour/ardour/user_bundle.h @@ -29,7 +29,7 @@ namespace ARDOUR { class Session; -class UserBundle : public Bundle, public PBD::Stateful { +class LIBARDOUR_API UserBundle : public Bundle, public PBD::Stateful { public: UserBundle (std::string const &); diff --git a/libs/ardour/ardour/utils.h b/libs/ardour/ardour/utils.h index 4bf97fd2e5..4b71c1586e 100644 --- a/libs/ardour/ardour/utils.h +++ b/libs/ardour/ardour/utils.h @@ -32,18 +32,21 @@ #include <CoreFoundation/CoreFoundation.h> #endif /* __APPLE__ */ +#include "ardour/libardour_visibility.h" #include "ardour/ardour.h" #include "ardour/data_type.h" #include "ardour/dB.h" class XMLNode; -std::string legalize_for_path (const std::string& str); -std::string legalize_for_universal_path (const std::string& str); -std::string legalize_for_uri (const std::string& str); -std::string legalize_for_path_2X (const std::string& str); -XMLNode* find_named_node (const XMLNode& node, std::string name); -std::string bool_as_string (bool); +namespace ARDOUR { + +LIBARDOUR_API std::string legalize_for_path (const std::string& str); +LIBARDOUR_API std::string legalize_for_universal_path (const std::string& str); +LIBARDOUR_API std::string legalize_for_uri (const std::string& str); +LIBARDOUR_API std::string legalize_for_path_2X (const std::string& str); +LIBARDOUR_API XMLNode* find_named_node (const XMLNode& node, std::string name); +LIBARDOUR_API std::string bool_as_string (bool); static inline float f_max(float x, float a) { x -= a; @@ -54,23 +57,24 @@ static inline float f_max(float x, float a) { return (x); } -std::string bump_name_once(const std::string& s, char delimiter); +LIBARDOUR_API std::string bump_name_once(const std::string& s, char delimiter); +LIBARDOUR_API std::string bump_name_number(const std::string& s); -int cmp_nocase (const std::string& s, const std::string& s2); -int cmp_nocase_utf8 (const std::string& s1, const std::string& s2); +LIBARDOUR_API int cmp_nocase (const std::string& s, const std::string& s2); +LIBARDOUR_API int cmp_nocase_utf8 (const std::string& s1, const std::string& s2); -int touch_file(std::string path); +LIBARDOUR_API int touch_file(std::string path); -std::string region_name_from_path (std::string path, bool strip_channels, bool add_channel_suffix = false, uint32_t total = 0, uint32_t this_one = 0); -bool path_is_paired (std::string path, std::string& pair_base); +LIBARDOUR_API std::string region_name_from_path (std::string path, bool strip_channels, bool add_channel_suffix = false, uint32_t total = 0, uint32_t this_one = 0); +LIBARDOUR_API bool path_is_paired (std::string path, std::string& pair_base); -void compute_equal_power_fades (ARDOUR::framecnt_t nframes, float* in, float* out); +LIBARDOUR_API void compute_equal_power_fades (ARDOUR::framecnt_t nframes, float* in, float* out); -const char* sync_source_to_string (ARDOUR::SyncSource src, bool sh = false); -ARDOUR::SyncSource string_to_sync_source (std::string str); +LIBARDOUR_API const char* sync_source_to_string (ARDOUR::SyncSource src, bool sh = false); +LIBARDOUR_API ARDOUR::SyncSource string_to_sync_source (std::string str); -const char* edit_mode_to_string (ARDOUR::EditMode); -ARDOUR::EditMode string_to_edit_mode (std::string); +LIBARDOUR_API const char* edit_mode_to_string (ARDOUR::EditMode); +LIBARDOUR_API ARDOUR::EditMode string_to_edit_mode (std::string); #undef OLD_GAIN_MATH #define OLD_GAIN_MATH @@ -142,8 +146,8 @@ slider_position_to_gain (double pos) } #undef OLD_GAIN_MATH -double gain_to_slider_position_with_max (double g, double max_gain = 2.0); -double slider_position_to_gain_with_max (double g, double max_gain = 2.0); +LIBARDOUR_API double gain_to_slider_position_with_max (double g, double max_gain = 2.0); +LIBARDOUR_API double slider_position_to_gain_with_max (double g, double max_gain = 2.0); /* I don't really like hard-coding these falloff rates here * Probably should use a map of some kind that could be configured @@ -160,18 +164,20 @@ double slider_position_to_gain_with_max (double g, double max_gain = 2.0); #define METER_FALLOFF_FASTER 46.0f #define METER_FALLOFF_FASTEST 70.0f -float meter_falloff_to_float (ARDOUR::MeterFalloff); -ARDOUR::MeterFalloff meter_falloff_from_float (float); -float meter_falloff_to_db_per_sec (float); +LIBARDOUR_API float meter_falloff_to_float (ARDOUR::MeterFalloff); +LIBARDOUR_API ARDOUR::MeterFalloff meter_falloff_from_float (float); +LIBARDOUR_API float meter_falloff_to_db_per_sec (float); -const char* native_header_format_extension (ARDOUR::HeaderFormat, const ARDOUR::DataType& type); -bool matching_unsuffixed_filename_exists_in (const std::string& dir, const std::string& name); +LIBARDOUR_API const char* native_header_format_extension (ARDOUR::HeaderFormat, const ARDOUR::DataType& type); +LIBARDOUR_API bool matching_unsuffixed_filename_exists_in (const std::string& dir, const std::string& name); -uint32_t how_many_dsp_threads (); +LIBARDOUR_API uint32_t how_many_dsp_threads (); #if __APPLE__ -std::string CFStringRefToStdString(CFStringRef stringRef); +LIBARDOUR_API std::string CFStringRefToStdString(CFStringRef stringRef); #endif // __APPLE__ +} //namespave + #endif /* __ardour_utils_h__ */ diff --git a/libs/ardour/ardour/vestige/aeffectx.h b/libs/ardour/ardour/vestige/aeffectx.h index 4007ecf5ef..5b7d69c411 100644 --- a/libs/ardour/ardour/vestige/aeffectx.h +++ b/libs/ardour/ardour/vestige/aeffectx.h @@ -101,16 +101,35 @@ #define effEditIdle 19 #define effEditTop 20 #define effProcessEvents 25 +// the next one from http://asseca.com/vst-24-specs/index.html +#define effGetPlugCategory 35 #define effGetEffectName 45 #define effGetVendorString 47 #define effGetProductString 48 #define effGetVendorVersion 49 #define effCanDo 51 // currently unused +/* from http://asseca.com/vst-24-specs/efIdle.html */ +#define effIdle 53 /* from http://asseca.com/vst-24-specs/efGetParameterProperties.html */ #define effGetParameterProperties 56 #define effGetVstVersion 58 // currently unused +/* http://asseca.com/vst-24-specs/efShellGetNextPlugin.html */ +#define effShellGetNextPlugin 70 +/* The next two were gleaned from http://www.kvraudio.com/forum/printview.php?t=143587&start=0 */ +#define effStartProcess 71 +#define effStopProcess 72 + +#define effBeginSetProgram 67 +#define effEndSetProgram 68 + +#ifdef WORDS_BIGENDIAN +// "VstP" +#define kEffectMagic 0x50747356 +#else +// "PtsV" +#define kEffectMagic 0x56737450 +#endif -#define kEffectMagic (CCONST( 'V', 's', 't', 'P' )) #define kVstLangEnglish 1 #define kVstMidiType 1 @@ -174,21 +193,58 @@ struct _VstEvents VstEvent * events[]; }; +/* constants from http://www.rawmaterialsoftware.com/juceforum/viewtopic.php?t=3740&sid=183f74631fee71a493316735e2b9f28b */ + +enum Vestige2StringConstants +{ + VestigeMaxNameLen = 64, + VestigeMaxLabelLen = 64, + VestigeMaxShortLabelLen = 8, + VestigeMaxCategLabelLen = 24, + VestigeMaxFileNameLen = 100 +}; + + +/* constants from http://asseca.com/vst-24-specs/efGetPlugCategory.html */ + +enum VstPlugCategory +{ + kPlugCategUnknown = 0, + kPlugCategEffect, + kPlugCategSynth, + kPlugCategAnalysis, + kPlugCategMastering, + kPlugCategSpacializer, + kPlugCategRoomFx, + kPlugSurroundFx, + kPlugCategRestoration, + kPlugCategOfflineProcess, + kPlugCategShell, + kPlugCategGenerator, + kPlugCategMaxCount +}; + typedef struct _VstEvents VstEvents; /* this struct taken from http://asseca.com/vst-24-specs/efGetParameterProperties.html */ struct _VstParameterProperties { - float stepFloat; - float smallStepFloat; - float largeStepFloat; - char label[64]; - int32_t flags; - int32_t minInteger; - int32_t maxInteger; - int32_t stepInteger; - int32_t largeStepInteger; - char shortLabel[8]; + float stepFloat; /* float step */ + float smallStepFloat; /* small float step */ + float largeStepFloat; /* large float step */ + char label[VestigeMaxLabelLen]; /* parameter label */ + int32_t flags; /* @see VstParameterFlags */ + int32_t minInteger; /* integer minimum */ + int32_t maxInteger; /* integer maximum */ + int32_t stepInteger; /* integer step */ + int32_t largeStepInteger; /* large integer step */ + char shortLabel[VestigeMaxShortLabelLen]; /* short label, recommended: 6 + delimiter */ + int16_t displayIndex; /* index where this parameter should be displayed (starting with 0) */ + int16_t category; /* 0: no category, else group index + 1 */ + int16_t numParametersInCategory; /* number of parameters in category */ + int16_t reserved; /* zero */ + char categoryLabel[VestigeMaxCategLabelLen]; /* category label, e.g. "Osc 1" */ + char future[16]; /* reserved for future use */ }; typedef struct _VstParameterProperties VstParameterProperties; diff --git a/libs/ardour/ardour/visibility.h b/libs/ardour/ardour/visibility.h deleted file mode 100644 index 09287b877d..0000000000 --- a/libs/ardour/ardour/visibility.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - Copyright (C) 2013 Paul Davis - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -*/ - -#ifndef __libardour_visibility_h__ -#define __libardour_visibility_h__ - -/* _WIN32 is defined by most compilers targetting Windows, but within the - * ardour source tree, we also define COMPILER_MSVC or COMPILER_MINGW depending - * on how a Windows build is built. - */ - -#if defined _WIN32 || defined __CYGWIN__ || defined(COMPILER_MSVC) || defined(COMPILER_MINGW) - #define LIBARDOUR_HELPER_DLL_IMPORT __declspec(dllimport) - #define LIBARDOUR_HELPER_DLL_EXPORT __declspec(dllexport) - #define LIBARDOUR_HELPER_DLL_LOCAL -#else - #if __GNUC__ >= 4 - #define LIBARDOUR_HELPER_DLL_IMPORT __attribute__ ((visibility ("default"))) - #define LIBARDOUR_HELPER_DLL_EXPORT __attribute__ ((visibility ("default"))) - #define LIBARDOUR_HELPER_DLL_LOCAL __attribute__ ((visibility ("hidden"))) - #else - #define LIBARDOUR_HELPER_DLL_IMPORT - #define LIBARDOUR_HELPER_DLL_EXPORT - #define LIBARDOUR_HELPER_DLL_LOCAL - #endif -#endif - -#endif /* __libardour_visibility_h__ */ diff --git a/libs/ardour/ardour/vst_info_file.h b/libs/ardour/ardour/vst_info_file.h new file mode 100644 index 0000000000..5e613801a6 --- /dev/null +++ b/libs/ardour/ardour/vst_info_file.h @@ -0,0 +1,55 @@ +/* + Copyright (C) 2012-2014 Paul Davis + Author: Robin Gareus <robin@gareus.org> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#ifndef __vst_info_file_h__ +#define __vst_info_file_h__ + +#include "ardour/libardour_visibility.h" +#include "ardour/vst_types.h" +#include <vector> + +#ifndef VST_SCANNER_APP +namespace ARDOUR { +#endif + +enum VSTScanMode { + VST_SCAN_CACHE_ONLY, + VST_SCAN_USE_APP, + VST_SCAN_INTERNAL +}; + +LIBARDOUR_API extern std::string get_personal_vst_info_cache_dir (); +LIBARDOUR_API extern std::string get_personal_vst_blacklist_dir (); +LIBARDOUR_API extern void vstfx_free_info_list (std::vector<VSTInfo *> *infos); + +#ifdef LXVST_SUPPORT +LIBARDOUR_API extern std::vector<VSTInfo*> * vstfx_get_info_lx (char *, enum VSTScanMode mode = VST_SCAN_USE_APP); +#endif + +#ifdef WINDOWS_VST_SUPPORT +LIBARDOUR_API extern std::vector<VSTInfo*> * vstfx_get_info_fst (char *, enum VSTScanMode mode = VST_SCAN_USE_APP); +#endif + +#ifndef VST_SCANNER_APP +} // namespace +#endif + +#endif /* __vstfx_h__ */ + diff --git a/libs/ardour/ardour/vst_plugin.h b/libs/ardour/ardour/vst_plugin.h index 7ca973cbb7..3450e2a480 100644 --- a/libs/ardour/ardour/vst_plugin.h +++ b/libs/ardour/ardour/vst_plugin.h @@ -32,7 +32,7 @@ typedef struct _VSTState VSTState; namespace ARDOUR { /** Parent class for VST plugins of both Windows and Linux varieties */ -class VSTPlugin : public Plugin +class LIBARDOUR_API VSTPlugin : public Plugin { public: VSTPlugin (AudioEngine &, Session &, VSTHandle *); @@ -73,6 +73,7 @@ public: AEffect * plugin () const { return _plugin; } VSTState * state () const { return _state; } + MidiBuffer * midi_buffer () const { return _midi_out_buf; } int set_state (XMLNode const &, int); @@ -94,6 +95,8 @@ protected: VSTHandle* _handle; VSTState* _state; AEffect* _plugin; + + MidiBuffer* _midi_out_buf; }; } diff --git a/libs/ardour/ardour/vst_types.h b/libs/ardour/ardour/vst_types.h index d185d62606..35b52435ab 100644 --- a/libs/ardour/ardour/vst_types.h +++ b/libs/ardour/ardour/vst_types.h @@ -20,9 +20,11 @@ #ifndef __ardour_vst_types_h__ #define __ardour_vst_types_h__ +#include <pthread.h> +#include "ardour/libardour_visibility.h" #include "ardour/vestige/aeffectx.h" -struct _VSTKey +struct LIBARDOUR_API _VSTKey { /** virtual-key code, or 0 if this _VSTFXKey is a `character' key */ int special; @@ -32,7 +34,7 @@ struct _VSTKey typedef struct _VSTKey VSTKey; -struct _VSTInfo +struct LIBARDOUR_API _VSTInfo { char *name; char *creator; @@ -56,11 +58,11 @@ typedef struct _VSTInfo VSTInfo; typedef AEffect * (* main_entry_t) (audioMasterCallback); -struct _VSTHandle +struct LIBARDOUR_API _VSTHandle { void* dll; char* name; - char* nameptr; + char* path; main_entry_t main_entry; @@ -69,7 +71,7 @@ struct _VSTHandle typedef struct _VSTHandle VSTHandle; -struct _VSTState +struct LIBARDOUR_API _VSTState { AEffect* plugin; @@ -89,13 +91,17 @@ struct _VSTState void (* eventProc) (void * event); VSTHandle* handle; - - int width; - int height; - int wantIdle; - int destroy; - int vst_version; - int has_editor; + + int width; + int height; + int wantIdle; + + int voffset; + int hoffset; + int gui_shown; + int destroy; + int vst_version; + int has_editor; int program_set_without_editor; diff --git a/libs/ardour/ardour/vumeterdsp.h b/libs/ardour/ardour/vumeterdsp.h index 3169dca12e..1271276d68 100644 --- a/libs/ardour/ardour/vumeterdsp.h +++ b/libs/ardour/ardour/vumeterdsp.h @@ -20,8 +20,9 @@ #ifndef __VUMETERDSP_H #define __VUMETERDSP_H +#include "ardour/libardour_visibility.h" -class Vumeterdsp +class LIBARDOUR_API Vumeterdsp { public: diff --git a/libs/ardour/ardour/windows_vst_plugin.h b/libs/ardour/ardour/windows_vst_plugin.h index 83bc113a00..17b72ac8da 100644 --- a/libs/ardour/ardour/windows_vst_plugin.h +++ b/libs/ardour/ardour/windows_vst_plugin.h @@ -22,7 +22,7 @@ #include "ardour/vst_plugin.h" -struct _VSTHandle; +struct LIBARDOUR_API _VSTHandle; typedef struct _VSTHandle VSTHandle; namespace ARDOUR { @@ -30,17 +30,17 @@ namespace ARDOUR { class AudioEngine; class Session; -class WindowsVSTPlugin : public VSTPlugin +class LIBARDOUR_API WindowsVSTPlugin : public VSTPlugin { public: - WindowsVSTPlugin (AudioEngine &, Session &, VSTHandle *); + WindowsVSTPlugin (AudioEngine &, Session &, VSTHandle *, int unique_id); WindowsVSTPlugin (const WindowsVSTPlugin &); ~WindowsVSTPlugin (); std::string state_node_name () const { return "windows-vst"; } }; -class WindowsVSTPluginInfo : public PluginInfo +class LIBARDOUR_API WindowsVSTPluginInfo : public PluginInfo { public: WindowsVSTPluginInfo (); diff --git a/libs/ardour/ardour/worker.h b/libs/ardour/ardour/worker.h index 4f3ff54bc1..c9ff2f2d7f 100644 --- a/libs/ardour/ardour/worker.h +++ b/libs/ardour/ardour/worker.h @@ -27,12 +27,14 @@ #include "pbd/ringbuffer.h" #include "pbd/semaphore.h" +#include "ardour/libardour_visibility.h" + namespace ARDOUR { /** An object that needs to schedule non-RT work in the audio thread. */ -class Workee { +class LIBARDOUR_API Workee { public: virtual ~Workee() {} @@ -50,7 +52,7 @@ public: /** A worker thread for non-realtime tasks scheduled in the audio thread. */ -class Worker +class LIBARDOUR_API Worker { public: Worker(Workee* workee, uint32_t ring_size); diff --git a/libs/ardour/async_midi_port.cc b/libs/ardour/async_midi_port.cc index 5bc8e22833..ce32fe2ccc 100644 --- a/libs/ardour/async_midi_port.cc +++ b/libs/ardour/async_midi_port.cc @@ -19,6 +19,9 @@ */ #include <iostream> +#include <vector> + +#include <glibmm/timer.h> #include "pbd/error.h" #include "pbd/stacktrace.h" @@ -35,7 +38,7 @@ using namespace std; using namespace PBD; namespace Evoral { - template class EventRingBuffer<timestamp_t>; + template class EventRingBuffer<MIDI::timestamp_t>; } pthread_t AsyncMIDIPort::_process_thread; @@ -47,9 +50,12 @@ AsyncMIDIPort::AsyncMIDIPort (string const & name, PortFlags flags) , MIDI::Port (name, MIDI::Port::Flags (0)) , _currently_in_cycle (false) , _last_write_timestamp (0) + , have_timer (false) , output_fifo (512) , input_fifo (1024) +#ifndef PLATFORM_WINDOWS , xthread (true) +#endif { } @@ -58,7 +64,14 @@ AsyncMIDIPort::~AsyncMIDIPort () } void -AsyncMIDIPort::flush_output_fifo (pframes_t nframes) +AsyncMIDIPort::set_timer (boost::function<MIDI::framecnt_t (void)>& f) +{ + timer = f; + have_timer = true; +} + +void +AsyncMIDIPort::flush_output_fifo (MIDI::pframes_t nframes) { RingBuffer< Evoral::Event<double> >::rw_vector vec = { { 0, 0 }, { 0, 0 } }; size_t written; @@ -89,7 +102,7 @@ AsyncMIDIPort::flush_output_fifo (pframes_t nframes) } void -AsyncMIDIPort::cycle_start (pframes_t nframes) +AsyncMIDIPort::cycle_start (MIDI::pframes_t nframes) { _currently_in_cycle = true; MidiPort::cycle_start (nframes); @@ -108,21 +121,31 @@ AsyncMIDIPort::cycle_start (pframes_t nframes) if (ARDOUR::Port::receives_input()) { MidiBuffer& mb (get_midi_buffer (nframes)); - pframes_t when = AudioEngine::instance()->sample_time_at_cycle_start(); + framecnt_t when; + + if (have_timer) { + when = timer (); + } else { + when = AudioEngine::instance()->sample_time_at_cycle_start(); + } for (MidiBuffer::iterator b = mb.begin(); b != mb.end(); ++b) { + if (!have_timer) { + when += (*b).time(); + } input_fifo.write (when, (Evoral::EventType) 0, (*b).size(), (*b).buffer()); } - + +#ifndef PLATFORM_WINDOWS if (!mb.empty()) { xthread.wakeup (); } +#endif } - } void -AsyncMIDIPort::cycle_end (pframes_t nframes) +AsyncMIDIPort::cycle_end (MIDI::pframes_t nframes) { if (ARDOUR::Port::sends_output()) { /* move any additional data from output FIFO into the port @@ -161,12 +184,12 @@ AsyncMIDIPort::drain (int check_interval_usecs) if (vec.len[0] + vec.len[1] >= output_fifo.bufsize() - 1) { break; } - usleep (check_interval_usecs); + Glib::usleep (check_interval_usecs); } } int -AsyncMIDIPort::write (const byte * msg, size_t msglen, timestamp_t timestamp) +AsyncMIDIPort::write (const MIDI::byte * msg, size_t msglen, MIDI::timestamp_t timestamp) { int ret = 0; @@ -219,7 +242,7 @@ AsyncMIDIPort::write (const byte * msg, size_t msglen, timestamp_t timestamp) } if (timestamp >= _cycle_nframes) { - std::cerr << "attempting to write MIDI event of " << msglen << " bytes at time " + std::cerr << "attempting to write MIDI event of " << msglen << " MIDI::bytes at time " << timestamp << " of " << _cycle_nframes << " (this will not work - needs a code fix)" << std::endl; @@ -268,9 +291,9 @@ AsyncMIDIPort::read (MIDI::byte *, size_t) timestamp_t time; Evoral::EventType type; uint32_t size; - byte buffer[input_fifo.capacity()]; + vector<MIDI::byte> buffer(input_fifo.capacity()); - while (input_fifo.read (&time, &type, &size, buffer)) { + while (input_fifo.read (&time, &type, &size, &buffer[0])) { _parser->set_timestamp (time); for (uint32_t i = 0; i < size; ++i) { _parser->scanner (buffer[i]); @@ -281,7 +304,7 @@ AsyncMIDIPort::read (MIDI::byte *, size_t) } void -AsyncMIDIPort::parse (framecnt_t) +AsyncMIDIPort::parse (MIDI::framecnt_t) { MIDI::byte buf[1]; diff --git a/libs/ardour/audio_diskstream.cc b/libs/ardour/audio_diskstream.cc index 7785284dac..0d2c664e48 100644 --- a/libs/ardour/audio_diskstream.cc +++ b/libs/ardour/audio_diskstream.cc @@ -27,8 +27,6 @@ #include <fcntl.h> #include <cstdlib> #include <ctime> -#include <sys/stat.h> -#include <sys/mman.h> #include "pbd/error.h" #include "pbd/xml++.h" @@ -925,7 +923,7 @@ AudioDiskstream::internal_playback_seek (framecnt_t distance) boost::shared_ptr<ChannelList> c = channels.reader(); for (chan = c->begin(); chan != c->end(); ++chan) { - (*chan)->playback_buf->increment_read_ptr (std::llabs(distance)); + (*chan)->playback_buf->increment_read_ptr (llabs(distance)); } if (first_recordable_frame < max_framepos) { @@ -1791,7 +1789,7 @@ AudioDiskstream::get_state () LocaleGuard lg (X_("POSIX")); boost::shared_ptr<ChannelList> c = channels.reader(); - snprintf (buf, sizeof(buf), "%zd", c->size()); + snprintf (buf, sizeof(buf), "%u", (unsigned int) c->size()); node.add_property ("channels", buf); if (!capturing_sources.empty() && _session.get_record_enabled()) { @@ -1910,7 +1908,7 @@ AudioDiskstream::use_new_write_source (uint32_t n) try { if ((chan->write_source = _session.create_audio_source_for_session ( - n_channels().n_audio(), name(), n, destructive())) == 0) { + n_channels().n_audio(), write_source_name(), n, destructive())) == 0) { throw failed_constructor(); } } @@ -2453,6 +2451,9 @@ AudioDiskstream::ChannelInfo::~ChannelInfo () bool AudioDiskstream::set_name (string const & name) { + if (_name == name) { + return true; + } Diskstream::set_name (name); /* get a new write source so that its name reflects the new diskstream name */ @@ -2467,3 +2468,24 @@ AudioDiskstream::set_name (string const & name) return true; } + +bool +AudioDiskstream::set_write_source_name (const std::string& str) { + if (_write_source_name == str) { + return true; + } + + Diskstream::set_write_source_name (str); + + if (_write_source_name == name()) { + return true; + } + boost::shared_ptr<ChannelList> c = channels.reader(); + ChannelList::iterator i; + int n = 0; + + for (n = 0, i = c->begin(); i != c->end(); ++i, ++n) { + use_new_write_source (n); + } + return true; +} diff --git a/libs/ardour/audio_library.cc b/libs/ardour/audio_library.cc index c2b2f1bff7..35c0972847 100644 --- a/libs/ardour/audio_library.cc +++ b/libs/ardour/audio_library.cc @@ -17,11 +17,18 @@ */ +#ifdef WAF_BUILD +#include "libardour-config.h" +#endif + #include <sstream> #include <libxml/uri.h> +#ifdef HAVE_LRDF #include <lrdf.h> +#endif + #include <glibmm/miscutils.h> #include <glibmm/convert.h> @@ -57,7 +64,9 @@ AudioLibrary::AudioLibrary () touch_file(sfdb_file_path); +#ifdef HAVE_LRDF lrdf_read_file(src.c_str()); +#endif } AudioLibrary::~AudioLibrary () @@ -67,14 +76,17 @@ AudioLibrary::~AudioLibrary () void AudioLibrary::save_changes () { +#ifdef HAVE_LRDF if (lrdf_export_by_source(src.c_str(), src.substr(5).c_str())) { PBD::warning << string_compose(_("Could not open %1. Audio Library not saved"), src) << endmsg; } +#endif } void AudioLibrary::set_tags (string member, vector<string> tags) { +#ifdef HAVE_LRDF sort (tags.begin(), tags.end()); tags.erase (unique(tags.begin(), tags.end()), tags.end()); @@ -85,21 +97,23 @@ AudioLibrary::set_tags (string member, vector<string> tags) for (vector<string>::iterator i = tags.begin(); i != tags.end(); ++i) { lrdf_add_triple (src.c_str(), file_uri.c_str(), TAG, (*i).c_str(), lrdf_literal); } +#endif } vector<string> AudioLibrary::get_tags (string member) { vector<string> tags; +#ifdef HAVE_LRDF + char * uri = strdup(Glib::filename_to_uri(member).c_str()); lrdf_statement pattern; - pattern.subject = strdup(Glib::filename_to_uri(member).c_str()); + pattern.subject = uri; pattern.predicate = const_cast<char*>(TAG); pattern.object = 0; pattern.object_type = lrdf_literal; lrdf_statement* matches = lrdf_matches (&pattern); - free (pattern.subject); lrdf_statement* current = matches; while (current != 0) { @@ -111,13 +125,15 @@ AudioLibrary::get_tags (string member) lrdf_free_statements (matches); sort (tags.begin(), tags.end()); - + free (uri); +#endif return tags; } void AudioLibrary::search_members_and (vector<string>& members, const vector<string>& tags) { +#ifdef HAVE_LRDF lrdf_statement **head; lrdf_statement* pattern = 0; lrdf_statement* old = 0; @@ -153,4 +169,5 @@ AudioLibrary::search_members_and (vector<string>& members, const vector<string>& pattern = pattern->next; delete old; } +#endif } diff --git a/libs/ardour/audio_track.cc b/libs/ardour/audio_track.cc index f6874e6157..13d5c43dda 100644 --- a/libs/ardour/audio_track.cc +++ b/libs/ardour/audio_track.cc @@ -309,7 +309,7 @@ AudioTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_fram if (!lm.locked()) { boost::shared_ptr<AudioDiskstream> diskstream = audio_diskstream(); framecnt_t playback_distance = diskstream->calculate_playback_distance(nframes); - if (can_internal_playback_seek(std::llabs(playback_distance))) { + if (can_internal_playback_seek(llabs(playback_distance))) { /* TODO should declick */ internal_playback_seek(playback_distance); } @@ -369,6 +369,13 @@ AudioTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_fram process_output_buffers (bufs, start_frame, end_frame, nframes, declick, (!diskstream->record_enabled() && _session.transport_rolling())); + for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) { + boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery> (*i); + if (d) { + d->flush_buffers (nframes); + } + } + need_butler = diskstream->commit (playback_distance); return 0; @@ -376,7 +383,7 @@ AudioTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_fram int AudioTrack::export_stuff (BufferSet& buffers, framepos_t start, framecnt_t nframes, - boost::shared_ptr<Processor> endpoint, bool include_endpoint, bool for_export) + boost::shared_ptr<Processor> endpoint, bool include_endpoint, bool for_export, bool for_freeze) { boost::scoped_array<gain_t> gain_buffer (new gain_t[nframes]); boost::scoped_array<Sample> mix_buffer (new Sample[nframes]); @@ -410,38 +417,7 @@ AudioTrack::export_stuff (BufferSet& buffers, framepos_t start, framecnt_t nfram } } - // If no processing is required, there's no need to go any further. - - if (!endpoint && !include_endpoint) { - return 0; - } - - for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) { - - if (!include_endpoint && (*i) == endpoint) { - break; - } - - /* if we're not exporting, stop processing if we come across a routing processor. - */ - - if (!for_export && (*i)->does_routing()) { - break; - } - - /* even for export, don't run any processor that does routing. - - oh, and don't bother with the peak meter either. - */ - - if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) { - (*i)->run (buffers, start, start+nframes, nframes, true); - } - - if ((*i) == endpoint) { - break; - } - } + bounce_process (buffers, start, nframes, endpoint, include_endpoint, for_export, for_freeze); return 0; } @@ -514,7 +490,7 @@ AudioTrack::bounce_range (framepos_t start, framepos_t end, InterThreadInfo& itt boost::shared_ptr<Processor> endpoint, bool include_endpoint) { vector<boost::shared_ptr<Source> > srcs; - return _session.write_one_track (*this, start, end, false, srcs, itt, endpoint, include_endpoint, false); + return _session.write_one_track (*this, start, end, false, srcs, itt, endpoint, include_endpoint, false, false); } void @@ -557,8 +533,8 @@ AudioTrack::freeze_me (InterThreadInfo& itt) boost::shared_ptr<Region> res; - if ((res = _session.write_one_track (*this, _session.current_start_frame(), _session.current_end_frame(), true, srcs, itt, - main_outs(), false, false)) == 0) { + if ((res = _session.write_one_track (*this, _session.current_start_frame(), _session.current_end_frame(), + true, srcs, itt, main_outs(), false, false, true)) == 0) { return; } @@ -569,7 +545,10 @@ AudioTrack::freeze_me (InterThreadInfo& itt) for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) { - if (!(*r)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*r)) { + if ((*r)->does_routing() && (*r)->active()) { + break; + } + if (!boost::dynamic_pointer_cast<PeakMeter>(*r)) { FreezeRecordProcessorInfo* frii = new FreezeRecordProcessorInfo ((*r)->get_state(), (*r)); @@ -577,9 +556,10 @@ AudioTrack::freeze_me (InterThreadInfo& itt) _freeze_record.processor_info.push_back (frii); - /* now deactivate the processor */ - - (*r)->deactivate (); + /* now deactivate the processor, */ + if (!boost::dynamic_pointer_cast<Amp>(*r)) { + (*r)->deactivate (); + } } _session.set_dirty (); diff --git a/libs/ardour/audio_unit.cc b/libs/ardour/audio_unit.cc index 538a905ca2..add2407f84 100644 --- a/libs/ardour/audio_unit.cc +++ b/libs/ardour/audio_unit.cc @@ -28,12 +28,13 @@ #include "pbd/xml++.h" #include "pbd/convert.h" #include "pbd/whitespace.h" -#include "pbd/pathscanner.h" +#include "pbd/file_utils.h" #include "pbd/locale_guard.h" #include <glibmm/threads.h> #include <glibmm/fileutils.h> #include <glibmm/miscutils.h> +#include <glib/gstdio.h> #include "ardour/ardour.h" #include "ardour/audioengine.h" @@ -2048,20 +2049,19 @@ AUPlugin::current_preset() const void AUPlugin::find_presets () { - vector<string*>* preset_files; - PathScanner scanner; + vector<string> preset_files; user_preset_map.clear (); - preset_files = scanner (preset_search_path, au_preset_filter, this, true, true, -1, true); + find_files_matching_filter (preset_files, preset_search_path, au_preset_filter, this, true, true, true); - if (!preset_files) { + if (preset_files.empty()) { return; } - for (vector<string*>::iterator x = preset_files->begin(); x != preset_files->end(); ++x) { + for (vector<string>::iterator x = preset_files.begin(); x != preset_files.end(); ++x) { - string path = *(*x); + string path = *x; string preset_name; /* make an initial guess at the preset name using the path */ @@ -2078,11 +2078,8 @@ AUPlugin::find_presets () user_preset_map[preset_name] = path; } - delete *x; } - delete preset_files; - /* now fill the vector<string> with the names we have */ for (UserPresetMap::iterator i = user_preset_map.begin(); i != user_preset_map.end(); ++i) { @@ -2277,6 +2274,7 @@ AUPluginInfo::discover_by_description (PluginInfoList& plugs, CAComponentDescrip } AUPluginInfo::get_names (temp, info->name, info->creator); + ARDOUR::PluginScanMessage(_("AU"), info->name, false); info->type = ARDOUR::AudioUnit; info->unique_id = stringify_descriptor (*info->descriptor); @@ -2453,7 +2451,7 @@ AUPluginInfo::save_cached_info () if (!tree.write (path)) { error << string_compose (_("could not save AU cache to %1"), path) << endmsg; - unlink (path.c_str()); + g_unlink (path.c_str()); } } diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc index 82564ebaf2..6c9fd442fb 100644 --- a/libs/ardour/audioengine.cc +++ b/libs/ardour/audioengine.cc @@ -34,8 +34,6 @@ #include "pbd/stacktrace.h" #include "pbd/unknown_type.h" -#include <jack/weakjack.h> - #include "midi++/port.h" #include "midi++/mmc.h" @@ -43,13 +41,14 @@ #include "ardour/audio_port.h" #include "ardour/audio_backend.h" #include "ardour/audioengine.h" -#include "ardour/backend_search_path.h" +#include "ardour/search_paths.h" #include "ardour/buffer.h" #include "ardour/cycle_timer.h" #include "ardour/internal_send.h" #include "ardour/meter.h" #include "ardour/midi_port.h" #include "ardour/midiport_manager.h" +#include "ardour/mididm.h" #include "ardour/mtdm.h" #include "ardour/port.h" #include "ardour/process_thread.h" @@ -75,7 +74,8 @@ AudioEngine::AudioEngine () , m_meter_thread (0) , _main_thread (0) , _mtdm (0) - , _measuring_latency (false) + , _mididm (0) + , _measuring_latency (MeasureNone) , _latency_input_port (0) , _latency_output_port (0) , _latency_flush_frames (0) @@ -197,7 +197,7 @@ AudioEngine::process_callback (pframes_t nframes) bool return_after_remove_check = false; - if (_measuring_latency && _mtdm) { + if (_measuring_latency == MeasureAudio && _mtdm) { /* run a normal cycle from the perspective of the PortManager so that we get silence on all registered ports. @@ -220,6 +220,28 @@ AudioEngine::process_callback (pframes_t nframes) PortManager::cycle_end (nframes); return_after_remove_check = true; + } else if (_measuring_latency == MeasureMIDI && _mididm) { + /* run a normal cycle from the perspective of the PortManager + so that we get silence on all registered ports. + + we overwrite the silence on the two ports used for latency + measurement. + */ + + PortManager::cycle_start (nframes); + PortManager::silence (nframes); + + if (_latency_input_port && _latency_output_port) { + PortEngine& pe (port_engine()); + + _mididm->process (nframes, pe, + pe.get_buffer (_latency_input_port, nframes), + pe.get_buffer (_latency_output_port, nframes)); + } + + PortManager::cycle_end (nframes); + return_after_remove_check = true; + } else if (_latency_flush_frames) { /* wait for the appropriate duration for the MTDM signal to @@ -474,28 +496,41 @@ AudioEngine::discover_backends () Glib::PatternSpec so_extension_pattern("*backend.so"); Glib::PatternSpec dylib_extension_pattern("*backend.dylib"); + +#if defined(PLATFORM_WINDOWS) && defined(DEBUGGABLE_BACKENDS) + #if defined(DEBUG) || defined(_DEBUG) + Glib::PatternSpec dll_extension_pattern("*backendD.dll"); + #else + Glib::PatternSpec dll_extension_pattern("*backendRDC.dll"); + #endif +#else Glib::PatternSpec dll_extension_pattern("*backend.dll"); +#endif - find_matching_files_in_search_path (backend_search_path (), - so_extension_pattern, backend_modules); + find_files_matching_pattern (backend_modules, backend_search_path (), + so_extension_pattern); - find_matching_files_in_search_path (backend_search_path (), - dylib_extension_pattern, backend_modules); + find_files_matching_pattern (backend_modules, backend_search_path (), + dylib_extension_pattern); - find_matching_files_in_search_path (backend_search_path (), - dll_extension_pattern, backend_modules); + find_files_matching_pattern (backend_modules, backend_search_path (), + dll_extension_pattern); - DEBUG_TRACE (DEBUG::Panning, string_compose (_("looking for backends in %1\n"), backend_search_path().to_string())); + DEBUG_TRACE (DEBUG::AudioEngine, string_compose ("looking for backends in %1\n", backend_search_path().to_string())); for (vector<std::string>::iterator i = backend_modules.begin(); i != backend_modules.end(); ++i) { AudioBackendInfo* info; + DEBUG_TRACE (DEBUG::AudioEngine, string_compose ("Checking possible backend in %1\n", *i)); + if ((info = backend_discover (*i)) != 0) { _backends.insert (make_pair (info->name, info)); } } + DEBUG_TRACE (DEBUG::AudioEngine, string_compose ("Found %1 backends\n", _backends.size())); + return _backends.size(); } @@ -553,7 +588,9 @@ AudioEngine::drop_backend () { if (_backend) { _backend->stop (); + _backend->drop_device(); _backend.reset (); + _running = false; } } @@ -582,7 +619,7 @@ AudioEngine::set_backend (const std::string& name, const std::string& arg1, cons if (b->second->instantiate (arg1, arg2)) { throw failed_constructor (); } - + _backend = b->second->factory (*this); } catch (exception& e) { @@ -647,7 +684,7 @@ AudioEngine::stop (bool for_latency) _running = false; _processed_frames = 0; - _measuring_latency = false; + _measuring_latency = MeasureNone; _latency_output_port = 0; _latency_input_port = 0; _started_for_latency = false; @@ -884,15 +921,6 @@ AudioEngine::set_buffer_size (uint32_t bufsiz) } int -AudioEngine::set_sample_format (SampleFormat sf) -{ - if (!_backend) { - return -1; - } - return _backend->set_sample_format (sf); -} - -int AudioEngine::set_interleaved (bool yn) { if (!_backend) { @@ -1013,26 +1041,18 @@ AudioEngine::halted_callback (const char* why) bool AudioEngine::setup_required () const { - /* If there is only a single backend and it claims to be configured - * already there is no setup to be done. - * - * Primarily for a case where there is only a JACK backend and - * JACK is already running. - */ - - if (_backends.size() == 1 && _backends.begin()->second->already_configured()) { - return false; + if (_backend) { + if (_backend->info().already_configured()) + return false; + } else { + if (_backends.size() == 1 && _backends.begin()->second->already_configured()) { + return false; + } } - + return true; } -MTDM* -AudioEngine::mtdm() -{ - return _mtdm; -} - int AudioEngine::prepare_for_latency_measurement () { @@ -1050,7 +1070,7 @@ AudioEngine::prepare_for_latency_measurement () } int -AudioEngine::start_latency_detection () +AudioEngine::start_latency_detection (bool for_midi) { if (!running()) { if (prepare_for_latency_measurement ()) { @@ -1063,6 +1083,9 @@ AudioEngine::start_latency_detection () delete _mtdm; _mtdm = 0; + delete _mididm; + _mididm = 0; + /* find the ports we will connect to */ PortEngine::PortHandle out = pe.get_port_by_name (_latency_output_name); @@ -1074,27 +1097,61 @@ AudioEngine::start_latency_detection () } /* create the ports we will use to read/write data */ - - if ((_latency_output_port = pe.register_port ("latency_out", DataType::AUDIO, IsOutput)) == 0) { - stop (true); - return -1; - } - if (pe.connect (_latency_output_port, _latency_output_name)) { - pe.unregister_port (_latency_output_port); - stop (true); - return -1; - } + if (for_midi) { + if ((_latency_output_port = pe.register_port ("latency_out", DataType::MIDI, IsOutput)) == 0) { + stop (true); + return -1; + } + if (pe.connect (_latency_output_port, _latency_output_name)) { + pe.unregister_port (_latency_output_port); + stop (true); + return -1; + } + + const string portname ("latency_in"); + if ((_latency_input_port = pe.register_port (portname, DataType::MIDI, IsInput)) == 0) { + pe.unregister_port (_latency_input_port); + pe.unregister_port (_latency_output_port); + stop (true); + return -1; + } + if (pe.connect (_latency_input_name, make_port_name_non_relative (portname))) { + pe.unregister_port (_latency_input_port); + pe.unregister_port (_latency_output_port); + stop (true); + return -1; + } + + _mididm = new MIDIDM (sample_rate()); + + } else { + + if ((_latency_output_port = pe.register_port ("latency_out", DataType::AUDIO, IsOutput)) == 0) { + stop (true); + return -1; + } + if (pe.connect (_latency_output_port, _latency_output_name)) { + pe.unregister_port (_latency_output_port); + stop (true); + return -1; + } + + const string portname ("latency_in"); + if ((_latency_input_port = pe.register_port (portname, DataType::AUDIO, IsInput)) == 0) { + pe.unregister_port (_latency_input_port); + pe.unregister_port (_latency_output_port); + stop (true); + return -1; + } + if (pe.connect (_latency_input_name, make_port_name_non_relative (portname))) { + pe.unregister_port (_latency_input_port); + pe.unregister_port (_latency_output_port); + stop (true); + return -1; + } + + _mtdm = new MTDM (sample_rate()); - const string portname ("latency_in"); - if ((_latency_input_port = pe.register_port (portname, DataType::AUDIO, IsInput)) == 0) { - pe.unregister_port (_latency_output_port); - stop (true); - return -1; - } - if (pe.connect (_latency_input_name, make_port_name_non_relative (portname))) { - pe.unregister_port (_latency_output_port); - stop (true); - return -1; } LatencyRange lr; @@ -1105,10 +1162,8 @@ AudioEngine::start_latency_detection () _latency_signal_latency += lr.max; /* all created and connected, lets go */ - - _mtdm = new MTDM (sample_rate()); - _measuring_latency = true; - _latency_flush_frames = samples_per_cycle(); + _latency_flush_frames = samples_per_cycle(); + _measuring_latency = for_midi ? MeasureMIDI : MeasureAudio; return 0; } @@ -1116,7 +1171,7 @@ AudioEngine::start_latency_detection () void AudioEngine::stop_latency_detection () { - _measuring_latency = false; + _measuring_latency = MeasureNone; if (_latency_output_port) { port_engine().unregister_port (_latency_output_port); diff --git a/libs/ardour/audiofilesource.cc b/libs/ardour/audiofilesource.cc index 8c3bf00176..7d34b9d9a5 100644 --- a/libs/ardour/audiofilesource.cc +++ b/libs/ardour/audiofilesource.cc @@ -41,6 +41,7 @@ #include <sndfile.h> +#include <glib/gstdio.h> #include <glibmm/miscutils.h> #include <glibmm/fileutils.h> #include <glibmm/threads.h> @@ -150,8 +151,8 @@ AudioFileSource::~AudioFileSource () { DEBUG_TRACE (DEBUG::Destruction, string_compose ("AudioFileSource destructor %1, removable? %2\n", _path, removable())); if (removable()) { - unlink (_path.c_str()); - unlink (peakpath.c_str()); + ::g_unlink (_path.c_str()); + ::g_unlink (peakpath.c_str()); } } @@ -309,7 +310,7 @@ AudioFileSource::mark_streaming_write_completed () int AudioFileSource::move_dependents_to_trash() { - return ::unlink (peakpath.c_str()); + return ::g_unlink (peakpath.c_str()); } void diff --git a/libs/ardour/audioregion.cc b/libs/ardour/audioregion.cc index e9b0b1fc07..2eb09ae192 100644 --- a/libs/ardour/audioregion.cc +++ b/libs/ardour/audioregion.cc @@ -409,14 +409,22 @@ AudioRegion::set_envelope_active (bool yn) } } +/** @param buf Buffer to put peak data in. + * @param npeaks Number of peaks to read (ie the number of PeakDatas in buf) + * @param offset Start position, as an offset from the start of this region's source. + * @param cnt Number of samples to read. + * @param chan_n Channel. + * @param frames_per_pixel Number of samples to use to generate one peak value. + */ + ARDOUR::framecnt_t -AudioRegion::read_peaks (PeakData *buf, framecnt_t npeaks, framecnt_t offset, framecnt_t cnt, uint32_t chan_n, double samples_per_unit) const +AudioRegion::read_peaks (PeakData *buf, framecnt_t npeaks, framecnt_t offset, framecnt_t cnt, uint32_t chan_n, double frames_per_pixel) const { if (chan_n >= _sources.size()) { return 0; } - if (audio_source(chan_n)->read_peaks (buf, npeaks, offset, cnt, samples_per_unit)) { + if (audio_source(chan_n)->read_peaks (buf, npeaks, offset, cnt, frames_per_pixel)) { return 0; } else { if (_scale_amplitude != 1.0f) { @@ -532,21 +540,21 @@ AudioRegion::read_at (Sample *buf, Sample *mixdown_buffer, float *gain_buffer, /* see if some part of this read is within the fade out */ /* ................. >| REGION - _length - - { } FADE - fade_out_length - ^ - _length - fade_out_length - |--------------| - ^internal_offset - ^internal_offset + to_read - - we need the intersection of [internal_offset,internal_offset+to_read] with - [_length - fade_out_length, _length] - - */ - + * _length + * + * { } FADE + * fade_out_length + * ^ + * _length - fade_out_length + * + * |--------------| + * ^internal_offset + * ^internal_offset + to_read + * + * we need the intersection of [internal_offset,internal_offset+to_read] with + * [_length - fade_out_length, _length] + * + */ fade_interval_start = max (internal_offset, _length - framecnt_t (_fade_out->back()->when)); framecnt_t fade_interval_end = min(internal_offset + to_read, _length.val()); @@ -983,23 +991,25 @@ AudioRegion::set_fade_in (FadeShape shape, framecnt_t len) _fade_in->clear (); _inverse_fade_in->clear (); + const int num_steps = 32; + switch (shape) { case FadeLinear: - _fade_in->fast_simple_add (0.0, 0.0); + _fade_in->fast_simple_add (0.0, VERY_SMALL_SIGNAL); _fade_in->fast_simple_add (len, 1.0); reverse_curve (_inverse_fade_in.val(), _fade_in.val()); break; case FadeFast: - generate_db_fade (_fade_in.val(), len, 10, -60); + generate_db_fade (_fade_in.val(), len, num_steps, -60); reverse_curve (c1, _fade_in.val()); _fade_in->copy_events (*c1); generate_inverse_power_curve (_inverse_fade_in.val(), _fade_in.val()); break; case FadeSlow: - generate_db_fade (c1, len, 10, -1); // start off with a slow fade - generate_db_fade (c2, len, 10, -80); // end with a fast fade + generate_db_fade (c1, len, num_steps, -1); // start off with a slow fade + generate_db_fade (c2, len, num_steps, -80); // end with a fast fade merge_curves (_fade_in.val(), c1, c2); reverse_curve (c3, _fade_in.val()); _fade_in->copy_events (*c3); @@ -1007,9 +1017,10 @@ AudioRegion::set_fade_in (FadeShape shape, framecnt_t len) break; case FadeConstantPower: - for (int i = 0; i < 9; ++i) { - float dist = (float) i / 10.0f; - _fade_in->fast_simple_add (len*dist, sin (dist*M_PI/2)); + _fade_in->fast_simple_add (0.0, VERY_SMALL_SIGNAL); + for (int i = 1; i < num_steps; ++i) { + const float dist = i / (num_steps + 1.f); + _fade_in->fast_simple_add (len * dist, sin (dist * M_PI / 2.0)); } _fade_in->fast_simple_add (len, 1.0); reverse_curve (_inverse_fade_in.val(), _fade_in.val()); @@ -1018,16 +1029,12 @@ AudioRegion::set_fade_in (FadeShape shape, framecnt_t len) case FadeSymmetric: //start with a nearly linear cuve _fade_in->fast_simple_add (0, 1); - _fade_in->fast_simple_add (0.5*len, 0.6); + _fade_in->fast_simple_add (0.5 * len, 0.6); //now generate a fade-out curve by successively applying a gain drop - const float breakpoint = 0.7; //linear for first 70% - const int num_steps = 9; - for (int i = 2; i < num_steps; i++) { - float coeff = (1.0-breakpoint); - for (int j = 0; j < i; j++) { - coeff *= 0.5; //6dB drop per step - } - _fade_in->fast_simple_add (len* (breakpoint+((1.0-breakpoint)*(double)i/(double)num_steps)), coeff); + const double breakpoint = 0.7; //linear for first 70% + for (int i = 2; i < 9; ++i) { + const float coeff = (1.f - breakpoint) * powf (0.5, i); + _fade_in->fast_simple_add (len * (breakpoint + ((1.0 - breakpoint) * (double)i / 9.0)), coeff); } _fade_in->fast_simple_add (len, VERY_SMALL_SIGNAL); reverse_curve (c3, _fade_in.val()); @@ -1036,6 +1043,9 @@ AudioRegion::set_fade_in (FadeShape shape, framecnt_t len) break; } + _fade_in->set_interpolation(Evoral::ControlList::Curved); + _inverse_fade_in->set_interpolation(Evoral::ControlList::Curved); + _default_fade_in = false; _fade_in->thaw (); send_change (PropertyChange (Properties::fade_in)); @@ -1062,6 +1072,8 @@ AudioRegion::set_fade_out (FadeShape shape, framecnt_t len) _fade_out->clear (); _inverse_fade_out->clear (); + const int num_steps = 32; + switch (shape) { case FadeLinear: _fade_out->fast_simple_add (0.0, 1.0); @@ -1070,13 +1082,13 @@ AudioRegion::set_fade_out (FadeShape shape, framecnt_t len) break; case FadeFast: - generate_db_fade (_fade_out.val(), len, 10, -60); + generate_db_fade (_fade_out.val(), len, num_steps, -60); generate_inverse_power_curve (_inverse_fade_out.val(), _fade_out.val()); break; case FadeSlow: - generate_db_fade (c1, len, 10, -1); //start off with a slow fade - generate_db_fade (c2, len, 10, -80); //end with a fast fade + generate_db_fade (c1, len, num_steps, -1); //start off with a slow fade + generate_db_fade (c2, len, num_steps, -80); //end with a fast fade merge_curves (_fade_out.val(), c1, c2); generate_inverse_power_curve (_inverse_fade_out.val(), _fade_out.val()); break; @@ -1085,9 +1097,9 @@ AudioRegion::set_fade_out (FadeShape shape, framecnt_t len) //constant-power fades use a sin/cos relationship //the cutoff is abrupt but it has the benefit of being symmetrical _fade_out->fast_simple_add (0.0, 1.0); - for (int i = 1; i < 9; i++ ) { - float dist = (float)i/10.0; - _fade_out->fast_simple_add ((len * dist), cos(dist*M_PI/2)); + for (int i = 1; i < num_steps; ++i) { + const float dist = i / (num_steps + 1.f); + _fade_out->fast_simple_add (len * dist, cos (dist * M_PI / 2.0)); } _fade_out->fast_simple_add (len, VERY_SMALL_SIGNAL); reverse_curve (_inverse_fade_out.val(), _fade_out.val()); @@ -1096,23 +1108,21 @@ AudioRegion::set_fade_out (FadeShape shape, framecnt_t len) case FadeSymmetric: //start with a nearly linear cuve _fade_out->fast_simple_add (0, 1); - _fade_out->fast_simple_add (0.5*len, 0.6); - + _fade_out->fast_simple_add (0.5 * len, 0.6); //now generate a fade-out curve by successively applying a gain drop - const float breakpoint = 0.7; //linear for first 70% - const int num_steps = 9; - for (int i = 2; i < num_steps; i++) { - float coeff = (1.0-breakpoint); - for (int j = 0; j < i; j++) { - coeff *= 0.5; //6dB drop per step - } - _fade_out->fast_simple_add (len* (breakpoint+((1.0-breakpoint)*(double)i/(double)num_steps)), coeff); + const double breakpoint = 0.7; //linear for first 70% + for (int i = 2; i < 9; ++i) { + const float coeff = (1.f - breakpoint) * powf (0.5, i); + _fade_out->fast_simple_add (len * (breakpoint + ((1.0 - breakpoint) * (double)i / 9.0)), coeff); } _fade_out->fast_simple_add (len, VERY_SMALL_SIGNAL); reverse_curve (_inverse_fade_out.val(), _fade_out.val()); break; } + _fade_out->set_interpolation(Evoral::ControlList::Curved); + _inverse_fade_out->set_interpolation(Evoral::ControlList::Curved); + _default_fade_out = false; _fade_out->thaw (); send_change (PropertyChange (Properties::fade_out)); @@ -1202,14 +1212,14 @@ void AudioRegion::set_default_fade_in () { _fade_in_suspended = 0; - set_fade_in (FadeLinear, 64); + set_fade_in (Config->get_default_fade_shape(), 64); } void AudioRegion::set_default_fade_out () { _fade_out_suspended = 0; - set_fade_out (FadeLinear, 64); + set_fade_out (Config->get_default_fade_shape(), 64); } void @@ -1852,22 +1862,3 @@ AudioRegion::verify_xfade_bounds (framecnt_t len, bool start) } -extern "C" { - - int region_read_peaks_from_c (void *arg, uint32_t npeaks, uint32_t start, uint32_t cnt, intptr_t data, uint32_t n_chan, double samples_per_unit) -{ - return ((AudioRegion *) arg)->read_peaks ((PeakData *) data, (framecnt_t) npeaks, (framepos_t) start, (framecnt_t) cnt, n_chan,samples_per_unit); -} - -uint32_t region_length_from_c (void *arg) -{ - - return ((AudioRegion *) arg)->length(); -} - -uint32_t sourcefile_length_from_c (void *arg, double zoom_factor) -{ - return ( (AudioRegion *) arg)->audio_source()->available_peaks (zoom_factor) ; -} - -} /* extern "C" */ diff --git a/libs/ardour/audiosource.cc b/libs/ardour/audiosource.cc index 84a5b687f9..c08cea962b 100644 --- a/libs/ardour/audiosource.cc +++ b/libs/ardour/audiosource.cc @@ -17,12 +17,15 @@ */ -#include <sys/stat.h> +#ifdef COMPILER_MSVC +#include <sys/utime.h> +#else #include <unistd.h> +#include <utime.h> +#endif +#include <sys/stat.h> #include <fcntl.h> -#include <poll.h> #include <float.h> -#include <utime.h> #include <cerrno> #include <ctime> #include <cmath> @@ -31,6 +34,12 @@ #include <algorithm> #include <vector> +#include <glib.h> +#include <glib/gstdio.h> + +#include <boost/scoped_array.hpp> +#include <boost/scoped_ptr.hpp> + #include <glibmm/fileutils.h> #include <glibmm/miscutils.h> @@ -42,6 +51,8 @@ #include "i18n.h" +#include "ardour/debug.h" + using namespace std; using namespace ARDOUR; using namespace PBD; @@ -173,9 +184,9 @@ AudioSource::peaks_ready (boost::function<void()> doThisWhenReady, ScopedConnect void AudioSource::touch_peakfile () { - struct stat statbuf; + GStatBuf statbuf; - if (stat (peakpath.c_str(), &statbuf) != 0 || statbuf.st_size == 0) { + if (g_stat (peakpath.c_str(), &statbuf) != 0 || statbuf.st_size == 0) { return; } @@ -184,7 +195,7 @@ AudioSource::touch_peakfile () tbuf.actime = statbuf.st_atime; tbuf.modtime = time ((time_t*) 0); - utime (peakpath.c_str(), &tbuf); + g_utime (peakpath.c_str(), &tbuf); } int @@ -195,7 +206,7 @@ AudioSource::rename_peakfile (string newpath) string oldpath = peakpath; if (Glib::file_test (oldpath, Glib::FILE_TEST_EXISTS)) { - if (rename (oldpath.c_str(), newpath.c_str()) != 0) { + if (g_rename (oldpath.c_str(), newpath.c_str()) != 0) { error << string_compose (_("cannot rename peakfile for %1 from %2 to %3 (%4)"), _name, oldpath, newpath, strerror (errno)) << endmsg; return -1; } @@ -209,17 +220,19 @@ AudioSource::rename_peakfile (string newpath) int AudioSource::initialize_peakfile (string audio_path) { - struct stat statbuf; + GStatBuf statbuf; peakpath = peak_path (audio_path); + DEBUG_TRACE(DEBUG::Peaks, string_compose ("Initialize Peakfile %1 for Audio file %2\n", peakpath, audio_path)); + /* if the peak file should be there, but isn't .... */ if (!empty() && !Glib::file_test (peakpath.c_str(), Glib::FILE_TEST_EXISTS)) { peakpath = find_broken_peakfile (peakpath, audio_path); } - if (stat (peakpath.c_str(), &statbuf)) { + if (g_stat (peakpath.c_str(), &statbuf)) { if (errno != ENOENT) { /* it exists in the peaks dir, but there is some kind of error */ @@ -227,7 +240,7 @@ AudioSource::initialize_peakfile (string audio_path) return -1; } - /* peakfile does not exist */ + DEBUG_TRACE(DEBUG::Peaks, string_compose("Peakfile %1 does not exist\n", peakpath)); _peaks_built = false; @@ -236,7 +249,7 @@ AudioSource::initialize_peakfile (string audio_path) /* we found it in the peaks dir, so check it out */ if (statbuf.st_size == 0 || (statbuf.st_size < (off_t) ((length(_timeline_position) / _FPP) * sizeof (PeakData)))) { - // empty + DEBUG_TRACE(DEBUG::Peaks, string_compose("Peakfile %1 is empty\n", peakpath)); _peaks_built = false; } else { // Check if the audio file has changed since the peakfile was built. @@ -248,6 +261,7 @@ AudioSource::initialize_peakfile (string audio_path) /* no audio path - nested source or we can't read it or ... whatever, use the peakfile as-is. */ + DEBUG_TRACE(DEBUG::Peaks, string_compose("Error when calling stat on Peakfile %1\n", peakpath)); _peaks_built = true; _peak_byte_max = statbuf.st_size; @@ -289,7 +303,7 @@ framecnt_t AudioSource::write (Sample *dst, framecnt_t cnt) { Glib::Threads::Mutex::Lock lm (_lock); - /* any write makes the fill not removable */ + /* any write makes the file not removable */ _flags = Flag (_flags & ~Removable); return write_unlocked (dst, cnt); } @@ -316,33 +330,20 @@ AudioSource::read_peaks_with_fpp (PeakData *peaks, framecnt_t npeaks, framepos_t int32_t to_read; uint32_t nread; framecnt_t zero_fill = 0; - int ret = -1; - PeakData* staging = 0; - Sample* raw_staging = 0; - FdFileDescriptor* peakfile_descriptor = new FdFileDescriptor (peakpath, false, 0664); + boost::scoped_ptr<FdFileDescriptor> peakfile_descriptor(new FdFileDescriptor (peakpath, false, 0664)); int peakfile_fd = -1; expected_peaks = (cnt / (double) samples_per_file_peak); scale = npeaks/expected_peaks; -#undef DEBUG_READ_PEAKS -#ifdef DEBUG_READ_PEAKS - cerr << "======>RP: npeaks = " << npeaks - << " start = " << start - << " cnt = " << cnt - << " len = " << _length - << " samples_per_visual_peak =" << samples_per_visual_peak - << " expected was " << expected_peaks << " ... scale = " << scale - << " PD ptr = " << peaks - <<endl; - -#endif + DEBUG_TRACE (DEBUG::Peaks, string_compose (" ======>RP: npeaks = %1 start = %2 cnt = %3 len = %4 samples_per_visual_peak = %5 expected was %6 ... scale = %7 PD ptr = %8\n" + , npeaks, start, cnt, _length, samples_per_visual_peak, expected_peaks, scale, peaks)); /* fix for near-end-of-file conditions */ if (cnt > _length - start) { - // cerr << "too close to end @ " << _length << " given " << start << " + " << cnt << endl; + // cerr << "too close to end @ " << _length << " given " << start << " + " << cnt << " (" << _length - start << ")" << endl; cnt = _length - start; framecnt_t old = npeaks; npeaks = min ((framecnt_t) floor (cnt / samples_per_visual_peak), npeaks); @@ -353,16 +354,15 @@ AudioSource::read_peaks_with_fpp (PeakData *peaks, framecnt_t npeaks, framepos_t if (npeaks == cnt) { -#ifdef DEBUG_READ_PEAKS - cerr << "RAW DATA\n"; -#endif + DEBUG_TRACE (DEBUG::Peaks, "RAW DATA\n"); + /* no scaling at all, just get the sample data and duplicate it for both max and min peak values. */ - Sample* raw_staging = new Sample[cnt]; + boost::scoped_array<Sample> raw_staging(new Sample[cnt]); - if (read_unlocked (raw_staging, start, cnt) != cnt) { + if (read_unlocked (raw_staging.get(), start, cnt) != cnt) { error << _("cannot read sample data for unscaled peak computation") << endmsg; return -1; } @@ -372,43 +372,35 @@ AudioSource::read_peaks_with_fpp (PeakData *peaks, framecnt_t npeaks, framepos_t peaks[i].min = raw_staging[i]; } - delete peakfile_descriptor; - delete [] raw_staging; return 0; } if (scale == 1.0) { + off_t offset = 0; off_t first_peak_byte = (start / samples_per_file_peak) * sizeof (PeakData); - + ssize_t bytes_to_read = sizeof (PeakData)* npeaks; /* open, read, close */ if ((peakfile_fd = peakfile_descriptor->allocate ()) < 0) { error << string_compose(_("AudioSource: cannot open peakpath (a) \"%1\" (%2)"), peakpath, strerror (errno)) << endmsg; - delete peakfile_descriptor; return -1; } -#ifdef DEBUG_READ_PEAKS - cerr << "DIRECT PEAKS\n"; -#endif + DEBUG_TRACE (DEBUG::Peaks, "DIRECT PEAKS\n"); - nread = ::pread (peakfile_fd, peaks, sizeof (PeakData)* npeaks, first_peak_byte); - - if (nread != sizeof (PeakData) * npeaks) { - cerr << "AudioSource[" - << _name - << "]: cannot read peaks from peakfile! (read only " - << nread - << " not " - << npeaks - << "at sample " - << start - << " = byte " - << first_peak_byte - << ')' - << endl; - delete peakfile_descriptor; + offset = lseek (peakfile_fd, first_peak_byte, SEEK_SET); + + if (offset != first_peak_byte) { + error << string_compose(_("AudioSource: could not seek to correct location in peak file \"%1\" (%2)"), peakpath, strerror (errno)) << endmsg; + return -1; + } + + nread = ::read (peakfile_fd, peaks, bytes_to_read); + + if (nread != bytes_to_read) { + DEBUG_TRACE (DEBUG::Peaks, string_compose ("[%1]: Cannot read peaks from peakfile! (read only %2 not %3 at sample %4 = byte %5 )\n" + , _name, nread, npeaks, start, first_peak_byte)); return -1; } @@ -416,7 +408,6 @@ AudioSource::read_peaks_with_fpp (PeakData *peaks, framecnt_t npeaks, framepos_t memset (&peaks[npeaks], 0, sizeof (PeakData) * zero_fill); } - delete peakfile_descriptor; return 0; } @@ -425,9 +416,8 @@ AudioSource::read_peaks_with_fpp (PeakData *peaks, framecnt_t npeaks, framepos_t if (scale < 1.0) { -#ifdef DEBUG_READ_PEAKS - cerr << "DOWNSAMPLE\n"; -#endif + DEBUG_TRACE (DEBUG::Peaks, "DOWNSAMPLE\n"); + /* the caller wants: - more frames-per-peak (lower resolution) than the peakfile, or to put it another way, @@ -440,7 +430,7 @@ AudioSource::read_peaks_with_fpp (PeakData *peaks, framecnt_t npeaks, framepos_t const framecnt_t chunksize = (framecnt_t) min (expected_peaks, 65536.0); - staging = new PeakData[chunksize]; + boost::scoped_array<PeakData> staging(new PeakData[chunksize]); /* compute the rounded up frame position */ @@ -461,8 +451,6 @@ AudioSource::read_peaks_with_fpp (PeakData *peaks, framecnt_t npeaks, framepos_t if ((peakfile_fd = peakfile_descriptor->allocate ()) < 0) { error << string_compose(_("AudioSource: cannot open peakpath (b) \"%1\" (%2)"), peakpath, strerror (errno)) << endmsg; - delete peakfile_descriptor; - delete [] staging; return 0; } @@ -473,33 +461,27 @@ AudioSource::read_peaks_with_fpp (PeakData *peaks, framecnt_t npeaks, framepos_t uint32_t start_byte = current_stored_peak * sizeof(PeakData); tnp = min ((framecnt_t)(_length/samples_per_file_peak - current_stored_peak), (framecnt_t) expected_peaks); to_read = min (chunksize, tnp); + ssize_t bytes_to_read = sizeof (PeakData) * to_read; -#ifdef DEBUG_READ_PEAKS - cerr << "read " << sizeof (PeakData) * to_read << " from peakfile @ " << start_byte << endl; -#endif + DEBUG_TRACE (DEBUG::Peaks, string_compose ("reading %1 bytes from peakfile @ %2\n" + , bytes_to_read, start_byte)); - if ((nread = ::pread (peakfile_fd, staging, sizeof (PeakData) * to_read, start_byte)) - != sizeof (PeakData) * to_read) { - off_t fend = lseek (peakfile_fd, 0, SEEK_END); + off_t offset = lseek (peakfile_fd, start_byte, SEEK_SET); - cerr << "AudioSource[" - << _name - << "]: cannot read peak data from peakfile (" - << (nread / sizeof(PeakData)) - << " peaks instead of " - << to_read - << ") (" - << strerror (errno) - << ')' - << " at start_byte = " << start_byte - << " _length = " << _length << " versus len = " << fend - << " expected maxpeaks = " << (_length - current_frame)/samples_per_file_peak - << " npeaks was " << npeaks - << endl; - goto out; + if (offset != start_byte) { + error << string_compose(_("AudioSource: could not seek to correct location in peak file \"%1\" (%2)"), peakpath, strerror (errno)) << endmsg; + return -1; } + if ((nread = ::read (peakfile_fd, staging.get(), bytes_to_read)) != bytes_to_read) { + + off_t fend = lseek (peakfile_fd, 0, SEEK_END); + + DEBUG_TRACE (DEBUG::Peaks, string_compose ("[%1]: cannot read peak data from peakfile (%2 peaks instead of %3) (%4) at start_byte = %5 _length = %6 versus len = %7 expected maxpeaks = %8 npeaks was %9" + , _name, (nread / sizeof(PeakData)), to_read, g_strerror (errno), start_byte, _length, fend, ((_length - current_frame)/samples_per_file_peak), npeaks)); + return -1; + } i = 0; stored_peaks_read = nread / sizeof(PeakData); } @@ -527,16 +509,14 @@ AudioSource::read_peaks_with_fpp (PeakData *peaks, framecnt_t npeaks, framepos_t } if (zero_fill) { + cerr << "Zero fill end of peaks (@ " << npeaks << " with " << zero_fill << endl; memset (&peaks[npeaks], 0, sizeof (PeakData) * zero_fill); } - ret = 0; - } else { -#ifdef DEBUG_READ_PEAKS - cerr << "UPSAMPLE\n"; -#endif + DEBUG_TRACE (DEBUG::Peaks, "UPSAMPLE\n"); + /* the caller wants - less frames-per-peak (more resolution) @@ -551,7 +531,7 @@ AudioSource::read_peaks_with_fpp (PeakData *peaks, framecnt_t npeaks, framepos_t framecnt_t i = 0; framecnt_t nvisual_peaks = 0; framecnt_t chunksize = (framecnt_t) min (cnt, (framecnt_t) 4096); - raw_staging = new Sample[chunksize]; + boost::scoped_array<Sample> raw_staging(new Sample[chunksize]); framepos_t frame_pos = start; double pixel_pos = floor (frame_pos / samples_per_visual_peak); @@ -576,18 +556,18 @@ AudioSource::read_peaks_with_fpp (PeakData *peaks, framecnt_t npeaks, framepos_t this loop early */ - memset (raw_staging, 0, sizeof (Sample) * chunksize); + memset (raw_staging.get(), 0, sizeof (Sample) * chunksize); } else { to_read = min (chunksize, (_length - current_frame)); - if ((frames_read = read_unlocked (raw_staging, current_frame, to_read)) == 0) { + if ((frames_read = read_unlocked (raw_staging.get(), current_frame, to_read)) == 0) { error << string_compose(_("AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"), _name, to_read, current_frame, _length, strerror (errno)) << endmsg; - goto out; + return -1; } } @@ -615,32 +595,19 @@ AudioSource::read_peaks_with_fpp (PeakData *peaks, framecnt_t npeaks, framepos_t if (zero_fill) { memset (&peaks[npeaks], 0, sizeof (PeakData) * zero_fill); } - - ret = 0; } - out: - delete peakfile_descriptor; - - delete [] staging; - delete [] raw_staging; - -#ifdef DEBUG_READ_PEAKS - cerr << "RP DONE\n"; -#endif - - return ret; + DEBUG_TRACE (DEBUG::Peaks, "READPEAKS DONE\n"); + return 0; } -#undef DEBUG_PEAK_BUILD - int AudioSource::build_peaks_from_scratch () { - Sample* buf = 0; - const framecnt_t bufsize = 65536; // 256kB per disk read for mono data is about ideal + DEBUG_TRACE (DEBUG::Peaks, "Building peaks from scratch\n"); + int ret = -1; { @@ -656,20 +623,20 @@ AudioSource::build_peaks_from_scratch () framecnt_t cnt = _length; _peaks_built = false; - buf = new Sample[bufsize]; + boost::scoped_array<Sample> buf(new Sample[bufsize]); while (cnt) { framecnt_t frames_to_read = min (bufsize, cnt); framecnt_t frames_read; - if ((frames_read = read_unlocked (buf, current_frame, frames_to_read)) != frames_to_read) { + if ((frames_read = read_unlocked (buf.get(), current_frame, frames_to_read)) != frames_to_read) { error << string_compose(_("%1: could not write read raw data for peak computation (%2)"), _name, strerror (errno)) << endmsg; done_with_peakfile_writes (false); goto out; } - if (compute_and_write_peaks (buf, current_frame, frames_read, true, false, _FPP)) { + if (compute_and_write_peaks (buf.get(), current_frame, frames_read, true, false, _FPP)) { break; } @@ -690,11 +657,10 @@ AudioSource::build_peaks_from_scratch () out: if (ret) { - unlink (peakpath.c_str()); + DEBUG_TRACE (DEBUG::Peaks, string_compose("Could not write peak data, attempting to remove peakfile %1\n", peakpath)); + ::g_unlink (peakpath.c_str()); } - delete [] buf; - return ret; } @@ -738,15 +704,13 @@ int AudioSource::compute_and_write_peaks (Sample* buf, framecnt_t first_frame, framecnt_t cnt, bool force, bool intermediate_peaks_ready, framecnt_t fpp) { - Sample* buf2 = 0; framecnt_t to_do; uint32_t peaks_computed; - PeakData* peakbuf = 0; - int ret = -1; framepos_t current_frame; framecnt_t frames_done; const size_t blocksize = (128 * 1024); off_t first_peak_byte; + boost::scoped_array<Sample> buf2; if (_peakfile_descriptor == 0) { prepare_for_peakfile_writes (); @@ -769,9 +733,16 @@ AudioSource::compute_and_write_peaks (Sample* buf, framecnt_t first_frame, frame off_t byte = (peak_leftover_frame / fpp) * sizeof (PeakData); - if (::pwrite (_peakfile_fd, &x, sizeof (PeakData), byte) != sizeof (PeakData)) { + off_t offset = lseek (_peakfile_fd, byte, SEEK_SET); + + if (offset != byte) { + error << string_compose(_("%1: could not seek in peak file data (%2)"), _name, strerror (errno)) << endmsg; + return -1; + } + + if (::write (_peakfile_fd, &x, sizeof (PeakData)) != sizeof (PeakData)) { error << string_compose(_("%1: could not write peak file data (%2)"), _name, strerror (errno)) << endmsg; - goto out; + return -1; } _peak_byte_max = max (_peak_byte_max, (off_t) (byte + sizeof(PeakData))); @@ -797,19 +768,19 @@ AudioSource::compute_and_write_peaks (Sample* buf, framecnt_t first_frame, frame /* make a new contiguous buffer containing leftovers and the new stuff */ to_do = cnt + peak_leftover_cnt; - buf2 = new Sample[to_do]; + buf2.reset(new Sample[to_do]); /* the remnants */ - memcpy (buf2, peak_leftovers, peak_leftover_cnt * sizeof (Sample)); + memcpy (buf2.get(), peak_leftovers, peak_leftover_cnt * sizeof (Sample)); /* the new stuff */ - memcpy (buf2+peak_leftover_cnt, buf, cnt * sizeof (Sample)); + memcpy (buf2.get()+peak_leftover_cnt, buf, cnt * sizeof (Sample)); /* no more leftovers */ peak_leftover_cnt = 0; /* use the temporary buffer */ - buf = buf2; + buf = buf2.get(); /* make sure that when we write into the peakfile, we startup where we left off */ @@ -819,7 +790,7 @@ AudioSource::compute_and_write_peaks (Sample* buf, framecnt_t first_frame, frame to_do = cnt; } - peakbuf = new PeakData[(to_do/fpp)+1]; + boost::scoped_array<PeakData> peakbuf(new PeakData[(to_do/fpp)+1]); peaks_computed = 0; current_frame = first_frame; frames_done = 0; @@ -876,18 +847,31 @@ AudioSource::compute_and_write_peaks (Sample* buf, framecnt_t first_frame, frame off_t target_length = blocksize * ((first_peak_byte + blocksize + 1) / blocksize); if (endpos < target_length) { + DEBUG_TRACE(DEBUG::Peaks, string_compose ("Truncating Peakfile %1\n", peakpath)); if (ftruncate (_peakfile_fd, target_length)) { /* error doesn't actually matter so continue on without testing */ } } } - if (::pwrite (_peakfile_fd, peakbuf, sizeof (PeakData) * peaks_computed, first_peak_byte) != (ssize_t) (sizeof (PeakData) * peaks_computed)) { + + off_t offset = lseek(_peakfile_fd, first_peak_byte, SEEK_SET); + + if (offset != first_peak_byte) { + error << string_compose(_("%1: could not seek in peak file data (%2)"), _name, strerror (errno)) << endmsg; + return -1; + } + + ssize_t bytes_to_write = sizeof (PeakData) * peaks_computed; + + ssize_t bytes_written = ::write (_peakfile_fd, peakbuf.get(), bytes_to_write); + + if (bytes_written != bytes_to_write) { error << string_compose(_("%1: could not write peak file data (%2)"), _name, strerror (errno)) << endmsg; - goto out; + return -1; } - _peak_byte_max = max (_peak_byte_max, (off_t) (first_peak_byte + sizeof(PeakData)*peaks_computed)); + _peak_byte_max = max (_peak_byte_max, (off_t) (first_peak_byte + bytes_to_write)); if (frames_done) { Glib::Threads::Mutex::Lock lm (_peaks_ready_lock); @@ -897,13 +881,7 @@ AudioSource::compute_and_write_peaks (Sample* buf, framecnt_t first_frame, frame } } - ret = 0; - - out: - delete [] peakbuf; - delete [] buf2; - - return ret; + return 0; } void @@ -920,6 +898,7 @@ AudioSource::truncate_peakfile () off_t end = lseek (_peakfile_fd, 0, SEEK_END); if (end > _peak_byte_max) { + DEBUG_TRACE(DEBUG::Peaks, string_compose ("Truncating Peakfile %1\n", peakpath)); if (ftruncate (_peakfile_fd, _peak_byte_max)) { error << string_compose (_("could not truncate peakfile %1 to %2 (error: %3)"), peakpath, _peak_byte_max, errno) << endmsg; diff --git a/libs/ardour/auditioner.cc b/libs/ardour/auditioner.cc index d682dc3617..d412a17d6a 100644 --- a/libs/ardour/auditioner.cc +++ b/libs/ardour/auditioner.cc @@ -53,6 +53,7 @@ Auditioner::Auditioner (Session& s) , _synth_added (false) , _synth_changed (false) , _queue_panic (false) + , _import_position (0) { } @@ -370,6 +371,7 @@ Auditioner::audition_region (boost::shared_ptr<Region> region) _synth_added = false; } midi_region.reset(); + _import_position = 0; /* copy it */ the_region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (region)); @@ -399,13 +401,14 @@ Auditioner::audition_region (boost::shared_ptr<Region> region) _midi_audition = true; set_diskstream(_diskstream_midi); the_region.reset(); + _import_position = region->position(); /* copy it */ midi_region = (boost::dynamic_pointer_cast<MidiRegion> (RegionFactory::create (region))); - midi_region->set_position (0); + midi_region->set_position (_import_position); _diskstream->playlist()->drop_regions (); - _diskstream->playlist()->add_region (midi_region, 0, 1); + _diskstream->playlist()->add_region (midi_region, _import_position, 1); midi_diskstream()->reset_tracker(); ProcessorStreams ps; @@ -457,7 +460,7 @@ Auditioner::audition_region (boost::shared_ptr<Region> region) if (_midi_audition) { length = midi_region->length(); - offset = midi_region->sync_offset (dir); + offset = _import_position + midi_region->sync_offset (dir); } else { length = the_region->length(); offset = the_region->sync_offset (dir); @@ -527,7 +530,7 @@ Auditioner::play_audition (framecnt_t nframes) } if (!_seeking) { - AuditionProgress(current_frame, length); /* emit */ + AuditionProgress(current_frame - _import_position, length); /* emit */ } if (current_frame >= length) { diff --git a/libs/ardour/automation_list.cc b/libs/ardour/automation_list.cc index 83df92488b..32e69af7ae 100644 --- a/libs/ardour/automation_list.cc +++ b/libs/ardour/automation_list.cc @@ -346,8 +346,6 @@ AutomationList::deserialize_events (const XMLNode& node) fast_simple_add (x, y); } - thin (); - if (!ok) { clear (); error << _("automation list: cannot load coordinates from XML, all points ignored") << endmsg; @@ -410,9 +408,7 @@ AutomationList::set_state (const XMLNode& node, int version) fast_simple_add (x, y); } - thin (); - - thaw (); + thaw (); return 0; } diff --git a/libs/ardour/automation_watch.cc b/libs/ardour/automation_watch.cc index 87ac08abc2..5fa7285c67 100644 --- a/libs/ardour/automation_watch.cc +++ b/libs/ardour/automation_watch.cc @@ -19,6 +19,8 @@ #include <iostream> +#include <glibmm/timer.h> + #include "pbd/compose.h" #include "ardour/automation_control.h" @@ -134,7 +136,7 @@ void AutomationWatch::thread () { while (_run_thread) { - usleep ((useconds_t) floor (Config->get_automation_interval_msecs() * 1000)); + Glib::usleep ((gulong) floor (Config->get_automation_interval_msecs() * 1000)); timer (); } } diff --git a/libs/ardour/broadcast_info.cc b/libs/ardour/broadcast_info.cc index a7fa41aaf9..a08d2c7991 100644 --- a/libs/ardour/broadcast_info.cc +++ b/libs/ardour/broadcast_info.cc @@ -22,6 +22,7 @@ #include <iostream> #include <sstream> #include <iomanip> +#include <vector> #include <glibmm.h> @@ -37,15 +38,15 @@ namespace ARDOUR static void snprintf_bounded_null_filled (char* target, size_t target_size, char const * fmt, ...) { - char buf[target_size+1]; + std::vector<char> buf(target_size+1); va_list ap; va_start (ap, fmt); - vsnprintf (buf, target_size+1, fmt, ap); + vsnprintf (&buf[0], target_size+1, fmt, ap); va_end (ap); memset (target, 0, target_size); - memcpy (target, buf, target_size); + memcpy (target, &buf[0], target_size); } @@ -84,7 +85,7 @@ BroadcastInfo::set_originator_ref_from_session (Session const & /*session*/) /* random code is 9 digits */ - int random_code = random() % 999999999; + int random_code = g_random_int() % 999999999; /* Serial number is 12 chars */ diff --git a/libs/ardour/buffer_manager.cc b/libs/ardour/buffer_manager.cc index c8819e41cb..c221837af8 100644 --- a/libs/ardour/buffer_manager.cc +++ b/libs/ardour/buffer_manager.cc @@ -75,11 +75,11 @@ BufferManager::put_thread_buffers (ThreadBuffers* tbp) } void -BufferManager::ensure_buffers (ChanCount howmany) +BufferManager::ensure_buffers (ChanCount howmany, size_t custom) { /* this is protected by the audioengine's process lock: we do not */ for (ThreadBufferList::iterator i = thread_buffers_list->begin(); i != thread_buffers_list->end(); ++i) { - (*i)->ensure_buffers (howmany); + (*i)->ensure_buffers (howmany, custom); } } diff --git a/libs/ardour/butler.cc b/libs/ardour/butler.cc index 03ae7867db..327665441e 100644 --- a/libs/ardour/butler.cc +++ b/libs/ardour/butler.cc @@ -20,7 +20,11 @@ #include <errno.h> #include <fcntl.h> #include <unistd.h> + +#ifndef PLATFORM_WINDOWS #include <poll.h> +#endif + #include "pbd/error.h" #include "pbd/pthread_utils.h" #include "ardour/butler.h" @@ -38,7 +42,8 @@ namespace ARDOUR { Butler::Butler(Session& s) : SessionHandleRef (s) - , thread(0) + , thread() + , have_thread (false) , audio_dstream_capture_buffer_size(0) , audio_dstream_playback_buffer_size(0) , midi_dstream_buffer_size(0) @@ -68,25 +73,10 @@ Butler::config_changed (std::string p) } } +#ifndef PLATFORM_WINDOWS int -Butler::start_thread() +Butler::setup_request_pipe () { - const float rate = (float)_session.frame_rate(); - - /* size is in Samples, not bytes */ - audio_dstream_capture_buffer_size = (uint32_t) floor (Config->get_audio_capture_buffer_seconds() * rate); - audio_dstream_playback_buffer_size = (uint32_t) floor (Config->get_audio_playback_buffer_seconds() * rate); - - /* size is in bytes - * XXX: Jack needs to tell us the MIDI buffer size - * (i.e. how many MIDI bytes we might see in a cycle) - */ - midi_dstream_buffer_size = (uint32_t) floor (Config->get_midi_track_buffer_seconds() * rate); - - MidiDiskstream::set_readahead_frames ((framecnt_t) (Config->get_midi_readahead() * rate)); - - should_run = false; - if (pipe (request_pipe)) { error << string_compose(_("Cannot create transport request signal pipe (%1)"), strerror (errno)) << endmsg; @@ -104,6 +94,32 @@ Butler::start_thread() strerror (errno)) << endmsg; return -1; } + return 0; +} +#endif + +int +Butler::start_thread() +{ + const float rate = (float)_session.frame_rate(); + + /* size is in Samples, not bytes */ + audio_dstream_capture_buffer_size = (uint32_t) floor (Config->get_audio_capture_buffer_seconds() * rate); + audio_dstream_playback_buffer_size = (uint32_t) floor (Config->get_audio_playback_buffer_seconds() * rate); + + /* size is in bytes + * XXX: Jack needs to tell us the MIDI buffer size + * (i.e. how many MIDI bytes we might see in a cycle) + */ + midi_dstream_buffer_size = (uint32_t) floor (Config->get_midi_track_buffer_seconds() * rate); + + MidiDiskstream::set_readahead_frames ((framecnt_t) (Config->get_midi_readahead() * rate)); + + should_run = false; + +#ifndef PLATFORM_WINDOWS + if (setup_request_pipe() != 0) return -1; +#endif if (pthread_create_and_store ("disk butler", &thread, _thread_work, this)) { error << _("Session: could not create butler thread") << endmsg; @@ -111,17 +127,16 @@ Butler::start_thread() } //pthread_detach (thread); - + have_thread = true; return 0; } void Butler::terminate_thread () { - if (thread) { + if (have_thread) { void* status; - const char c = Request::Quit; - (void) ::write (request_pipe[1], &c, 1); + queue_request (Request::Quit); pthread_join (thread, &status); } } @@ -134,28 +149,25 @@ Butler::_thread_work (void* arg) return ((Butler *) arg)->thread_work (); } -void * -Butler::thread_work () +bool +Butler::wait_for_requests () { - uint32_t err = 0; - +#ifndef PLATFORM_WINDOWS struct pollfd pfd[1]; - bool disk_work_outstanding = false; - RouteList::iterator i; - while (true) { - pfd[0].fd = request_pipe[0]; - pfd[0].events = POLLIN|POLLERR|POLLHUP; + pfd[0].fd = request_pipe[0]; + pfd[0].events = POLLIN|POLLERR|POLLHUP; - if (poll (pfd, 1, (disk_work_outstanding ? 0 : -1)) < 0) { + while(true) { + if (poll (pfd, 1, -1) < 0) { if (errno == EINTR) { continue; } error << string_compose (_("poll on butler request pipe failed (%1)"), - strerror (errno)) - << endmsg; + strerror (errno)) + << endmsg; break; } @@ -165,16 +177,60 @@ Butler::thread_work () } if (pfd[0].revents & POLLIN) { + return true; + } + } + return false; +#else + m_request_sem.wait (); + return true; +#endif +} - char req; +bool +Butler::dequeue_request (Request::Type& r) +{ +#ifndef PLATFORM_WINDOWS + char req; + size_t nread = ::read (request_pipe[0], &req, sizeof (req)); + if (nread == 1) { + r = (Request::Type) req; + return true; + } else if (nread == 0) { + return false; + } else if (errno == EAGAIN) { + return false; + } else { + fatal << _("Error reading from butler request pipe") << endmsg; + /*NOTREACHED*/ + } +#else + r = (Request::Type) m_request_state.get(); +#endif + return false; +} - /* empty the pipe of all current requests */ + void * +Butler::thread_work () +{ + uint32_t err = 0; - while (1) { - size_t nread = ::read (request_pipe[0], &req, sizeof (req)); - if (nread == 1) { + bool disk_work_outstanding = false; + RouteList::iterator i; - switch ((Request::Type) req) { + while (true) { + if(!disk_work_outstanding) { + if (wait_for_requests ()) { + Request::Type req; + + /* empty the pipe of all current requests */ +#ifdef PLATFORM_WINDOWS + dequeue_request (req); + { +#else + while(dequeue_request(req)) { +#endif + switch (req) { case Request::Run: should_run = true; @@ -192,14 +248,6 @@ Butler::thread_work () default: break; } - - } else if (nread == 0) { - break; - } else if (errno == EAGAIN) { - break; - } else { - fatal << _("Error reading from butler request pipe") << endmsg; - /*NOTREACHED*/ } } } @@ -346,18 +394,28 @@ Butler::schedule_transport_work () } void -Butler::summon () +Butler::queue_request (Request::Type r) { - char c = Request::Run; +#ifndef PLATFORM_WINDOWS + char c = r; (void) ::write (request_pipe[1], &c, 1); +#else + m_request_state.set (r); + m_request_sem.post (); +#endif +} + +void +Butler::summon () +{ + queue_request (Request::Run); } void Butler::stop () { Glib::Threads::Mutex::Lock lm (request_lock); - char c = Request::Pause; - (void) ::write (request_pipe[1], &c, 1); + queue_request (Request::Pause); paused.wait(request_lock); } @@ -365,8 +423,7 @@ void Butler::wait_until_finished () { Glib::Threads::Mutex::Lock lm (request_lock); - char c = Request::Pause; - (void) ::write (request_pipe[1], &c, 1); + queue_request (Request::Pause); paused.wait(request_lock); } diff --git a/libs/ardour/control_protocol_manager.cc b/libs/ardour/control_protocol_manager.cc index 974258a5c2..fdac48e731 100644 --- a/libs/ardour/control_protocol_manager.cc +++ b/libs/ardour/control_protocol_manager.cc @@ -17,7 +17,7 @@ */ -#include <dlfcn.h> +#include <glibmm/module.h> #include <glibmm/fileutils.h> @@ -29,7 +29,9 @@ #include "ardour/debug.h" #include "ardour/control_protocol_manager.h" -#include "ardour/control_protocol_search_path.h" + +#include "ardour/search_paths.h" + using namespace ARDOUR; using namespace std; @@ -211,7 +213,9 @@ ControlProtocolManager::teardown (ControlProtocolInfo& cpi) } cpi.protocol = 0; - dlclose (cpi.descriptor->module); + delete cpi.state; + cpi.state = 0; + delete (Glib::Module*)cpi.descriptor->module; ProtocolStatusChange (&cpi); @@ -241,14 +245,37 @@ ControlProtocolManager::discover_control_protocols () { vector<std::string> cp_modules; +#ifdef COMPILER_MSVC + /** + * Different build targets (Debug / Release etc) use different versions + * of the 'C' runtime (which can't be 'mixed & matched'). Therefore, in + * case the supplied search path contains multiple version(s) of a given + * module, only select the one(s) which match the current build target + */ + #if defined (_DEBUG) + Glib::PatternSpec dll_extension_pattern("*D.dll"); + #elif defined (RDC_BUILD) + Glib::PatternSpec dll_extension_pattern("*RDC.dll"); + #elif defined (_WIN64) + Glib::PatternSpec dll_extension_pattern("*64.dll"); + #else + Glib::PatternSpec dll_extension_pattern("*32.dll"); + #endif +#else + Glib::PatternSpec dll_extension_pattern("*.dll"); +#endif + Glib::PatternSpec so_extension_pattern("*.so"); Glib::PatternSpec dylib_extension_pattern("*.dylib"); - find_matching_files_in_search_path (control_protocol_search_path (), - so_extension_pattern, cp_modules); + find_files_matching_pattern (cp_modules, control_protocol_search_path (), + dll_extension_pattern); - find_matching_files_in_search_path (control_protocol_search_path (), - dylib_extension_pattern, cp_modules); + find_files_matching_pattern (cp_modules, control_protocol_search_path (), + so_extension_pattern); + + find_files_matching_pattern (cp_modules, control_protocol_search_path (), + dylib_extension_pattern); DEBUG_TRACE (DEBUG::ControlProtocols, string_compose (_("looking for control protocols in %1\n"), control_protocol_search_path().to_string())); @@ -296,7 +323,7 @@ ControlProtocolManager::control_protocol_discover (string path) string_compose(_("Control surface protocol discovered: \"%1\"\n"), cpi->name)); } - dlclose (descriptor->module); + delete (Glib::Module*)descriptor->module; } return 0; @@ -305,31 +332,31 @@ ControlProtocolManager::control_protocol_discover (string path) ControlProtocolDescriptor* ControlProtocolManager::get_descriptor (string path) { - void *module; + Glib::Module* module = new Glib::Module(path); ControlProtocolDescriptor *descriptor = 0; ControlProtocolDescriptor* (*dfunc)(void); - const char *errstr; + void* func = 0; - if ((module = dlopen (path.c_str(), RTLD_NOW)) == 0) { - error << string_compose(_("ControlProtocolManager: cannot load module \"%1\" (%2)"), path, dlerror()) << endmsg; + if (!(*module)) { + error << string_compose(_("ControlProtocolManager: cannot load module \"%1\" (%2)"), path, Glib::Module::get_last_error()) << endmsg; + delete module; return 0; } - - dfunc = (ControlProtocolDescriptor* (*)(void)) dlsym (module, "protocol_descriptor"); - - if ((errstr = dlerror()) != 0) { + if (!module->get_symbol("protocol_descriptor", func)) { error << string_compose(_("ControlProtocolManager: module \"%1\" has no descriptor function."), path) << endmsg; - error << errstr << endmsg; - dlclose (module); + error << Glib::Module::get_last_error() << endmsg; + delete module; return 0; } + dfunc = (ControlProtocolDescriptor* (*)(void))func; descriptor = dfunc(); + if (descriptor) { - descriptor->module = module; + descriptor->module = (void*)module; } else { - dlclose (module); + delete module; } return descriptor; diff --git a/libs/ardour/cycle_timer.cc b/libs/ardour/cycle_timer.cc index 02d1abb930..bb4f3181e0 100644 --- a/libs/ardour/cycle_timer.cc +++ b/libs/ardour/cycle_timer.cc @@ -22,6 +22,8 @@ #include "pbd/error.h" #include "ardour/cycle_timer.h" +#include "ardour/libardour_visibility.h" + #include "i18n.h" using namespace std; diff --git a/libs/ardour/debug.cc b/libs/ardour/debug.cc index fb122dd83c..69f2663aa8 100644 --- a/libs/ardour/debug.cc +++ b/libs/ardour/debug.cc @@ -31,6 +31,8 @@ uint64_t PBD::DEBUG::MidiDiskstreamIO = PBD::new_debug_bit ("mididiskstreamio"); uint64_t PBD::DEBUG::SnapBBT = PBD::new_debug_bit ("snapbbt"); uint64_t PBD::DEBUG::Configuration = PBD::new_debug_bit ("configuration"); uint64_t PBD::DEBUG::Latency = PBD::new_debug_bit ("latency"); +uint64_t PBD::DEBUG::LatencyCompensation = PBD::new_debug_bit ("latencycompensation"); +uint64_t PBD::DEBUG::Peaks = PBD::new_debug_bit ("peaks"); uint64_t PBD::DEBUG::Processors = PBD::new_debug_bit ("processors"); uint64_t PBD::DEBUG::ProcessThreads = PBD::new_debug_bit ("processthreads"); uint64_t PBD::DEBUG::Graph = PBD::new_debug_bit ("graph"); @@ -61,5 +63,7 @@ uint64_t PBD::DEBUG::OrderKeys = PBD::new_debug_bit ("orderkeys"); uint64_t PBD::DEBUG::Automation = PBD::new_debug_bit ("automation"); uint64_t PBD::DEBUG::WiimoteControl = PBD::new_debug_bit ("wiimotecontrol"); uint64_t PBD::DEBUG::Ports = PBD::new_debug_bit ("Ports"); +uint64_t PBD::DEBUG::AudioEngine = PBD::new_debug_bit ("AudioEngine"); +uint64_t PBD::DEBUG::Soundcloud = PBD::new_debug_bit ("Soundcloud"); diff --git a/libs/ardour/default_click.cc b/libs/ardour/default_click.cc index fd23f0166d..7e8eca8fd2 100644 --- a/libs/ardour/default_click.cc +++ b/libs/ardour/default_click.cc @@ -21,6 +21,10 @@ #include "ardour/session.h" #include "ardour/types.h" +#ifdef COMPILER_MSVC +#pragma warning(disable:4305) +#endif + using namespace ARDOUR; const Sample Session::default_click_emphasis[] = { diff --git a/libs/ardour/delayline.cc b/libs/ardour/delayline.cc new file mode 100644 index 0000000000..0bd7793366 --- /dev/null +++ b/libs/ardour/delayline.cc @@ -0,0 +1,351 @@ +/* + Copyright (C) 2006, 2013 Paul Davis + Copyright (C) 2013, 2014 Robin Gareus <robin@gareus.org> + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include <assert.h> +#include <cmath> + +#include "pbd/compose.h" + +#include "ardour/debug.h" +#include "ardour/audio_buffer.h" +#include "ardour/midi_buffer.h" +#include "ardour/buffer_set.h" +#include "ardour/delayline.h" + +using namespace std; +using namespace PBD; +using namespace ARDOUR; + +DelayLine::DelayLine (Session& s, const std::string& name) + : Processor (s, string_compose ("latency-compensation-%1", name)) + , _delay(0) + , _pending_delay(0) + , _bsiz(0) + , _pending_bsiz(0) + , _roff(0) + , _woff(0) + , _pending_flush(false) +{ +} + +DelayLine::~DelayLine () +{ +} + +#define FADE_LEN (16) +void +DelayLine::run (BufferSet& bufs, framepos_t /* start_frame */, framepos_t /* end_frame */, pframes_t nsamples, bool) +{ + const uint32_t chn = _configured_output.n_audio(); + pframes_t p0 = 0; + uint32_t c; + + const frameoffset_t pending_delay = _pending_delay; + const frameoffset_t delay_diff = _delay - pending_delay; + const bool pending_flush = _pending_flush; + _pending_flush = false; + + /* run() and set_delay() may be called in parallel by + * different threads. + * if a larger buffer is needed, it is allocated in + * set_delay(), here it is just swap'ed in place + */ + if (_pending_bsiz) { + assert(_pending_bsiz >= _bsiz); + + const size_t boff = _pending_bsiz - _bsiz; + if (_bsiz > 0) { + /* write offset is retained. copy existing data to new buffer */ + frameoffset_t wl = _bsiz - _woff; + memcpy(_pending_buf.get(), _buf.get(), sizeof(Sample) * _woff * chn); + memcpy(_pending_buf.get() + (_pending_bsiz - wl) * chn, _buf.get() + _woff * chn, sizeof(Sample) * wl * chn); + + /* new buffer is all zero by default, fade into the existing data copied above */ + frameoffset_t wo = _pending_bsiz - wl; + for (pframes_t pos = 0; pos < FADE_LEN; ++pos) { + const gain_t gain = (gain_t)pos / (gain_t)FADE_LEN; + for (c = 0; c < _configured_input.n_audio(); ++c) { + _pending_buf.get()[ wo * chn + c ] *= gain; + wo = (wo + 1) % (_pending_bsiz + 1); + } + } + + /* read-pointer will be moved and may up anywhere.. + * copy current data for smooth fade-out below + */ + frameoffset_t roold = _roff; + frameoffset_t ro = _roff; + if (ro > _woff) { + ro += boff; + } + ro += delay_diff; + if (ro < 0) { + ro -= (_pending_bsiz +1) * floor(ro / (float)(_pending_bsiz +1)); + } + ro = ro % (_pending_bsiz + 1); + for (pframes_t pos = 0; pos < FADE_LEN; ++pos) { + for (c = 0; c < _configured_input.n_audio(); ++c) { + _pending_buf.get()[ ro * chn + c ] = _buf.get()[ roold * chn + c ]; + ro = (ro + 1) % (_pending_bsiz + 1); + roold = (roold + 1) % (_bsiz + 1); + } + } + } + + if (_roff > _woff) { + _roff += boff; + } + + _buf = _pending_buf; + _bsiz = _pending_bsiz; + _pending_bsiz = 0; + _pending_buf.reset(); + } + + /* there may be no buffer when delay == 0. + * we also need to check audio-channels in case all audio-channels + * were removed in which case no new buffer was allocated. */ + Sample *buf = _buf.get(); + if (buf && _configured_output.n_audio() > 0) { + + assert (_bsiz >= pending_delay); + const framecnt_t rbs = _bsiz + 1; + + if (pending_delay != _delay || pending_flush) { + const pframes_t fade_len = (nsamples >= FADE_LEN) ? FADE_LEN : nsamples / 2; + + DEBUG_TRACE (DEBUG::LatencyCompensation, + string_compose ("Old %1 delay: %2 bufsiz: %3 offset-diff: %4 write-offset: %5 read-offset: %6\n", + name(), _delay, _bsiz, ((_woff - _roff + rbs) % rbs), _woff, _roff)); + + // fade out at old position + c = 0; + for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++c) { + Sample * const data = i->data(); + for (pframes_t pos = 0; pos < fade_len; ++pos) { + const gain_t gain = (gain_t)(fade_len - pos) / (gain_t)fade_len; + buf[ _woff * chn + c ] = data[ pos ]; + data[ pos ] = buf[ _roff * chn + c ] * gain; + _roff = (_roff + 1) % rbs; + _woff = (_woff + 1) % rbs; + } + } + + if (pending_flush) { + DEBUG_TRACE (DEBUG::LatencyCompensation, + string_compose ("Flush buffer: %1\n", name())); + memset(buf, 0, _configured_output.n_audio() * rbs * sizeof (Sample)); + } + + // adjust read pointer + _roff += _delay - pending_delay; + + if (_roff < 0) { + _roff -= rbs * floor(_roff / (float)rbs); + } + _roff = _roff % rbs; + + // fade in at new position + c = 0; + for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++c) { + Sample * const data = i->data(); + for (pframes_t pos = fade_len; pos < 2 * fade_len; ++pos) { + const gain_t gain = (gain_t)(pos - fade_len) / (gain_t)fade_len; + buf[ _woff * chn + c ] = data[ pos ]; + data[ pos ] = buf[ _roff * chn + c ] * gain; + _roff = (_roff + 1) % rbs; + _woff = (_woff + 1) % rbs; + } + } + p0 = 2 * fade_len; + + _delay = pending_delay; + + DEBUG_TRACE (DEBUG::LatencyCompensation, + string_compose ("New %1 delay: %2 bufsiz: %3 offset-diff: %4 write-offset: %5 read-offset: %6\n", + name(), _delay, _bsiz, ((_woff - _roff + rbs) % rbs), _woff, _roff)); + } + + assert(_delay == ((_woff - _roff + rbs) % rbs)); + + c = 0; + for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++c) { + Sample * const data = i->data(); + for (pframes_t pos = p0; pos < nsamples; ++pos) { + buf[ _woff * chn + c ] = data[ pos ]; + data[ pos ] = buf[ _roff * chn + c ]; + _roff = (_roff + 1) % rbs; + _woff = (_woff + 1) % rbs; + } + } + } + + if (_midi_buf.get()) { + _delay = pending_delay; + + for (BufferSet::midi_iterator i = bufs.midi_begin(); i != bufs.midi_end(); ++i) { + if (i != bufs.midi_begin()) { break; } // XXX only one buffer for now + + MidiBuffer* dly = _midi_buf.get(); + MidiBuffer& mb (*i); + if (pending_flush) { + dly->silence(nsamples); + } + + // If the delay time changes, iterate over all events in the dly-buffer + // and adjust the time in-place. <= 0 becomes 0. + // + // iterate over all events in dly-buffer and subtract one cycle + // (nsamples) from the timestamp, bringing them closer to de-queue. + for (MidiBuffer::iterator m = dly->begin(); m != dly->end(); ++m) { + MidiBuffer::TimeType *t = m.timeptr(); + if (*t > nsamples + delay_diff) { + *t -= nsamples + delay_diff; + } else { + *t = 0; + } + } + + if (_delay != 0) { + // delay events in current-buffer, in place. + for (MidiBuffer::iterator m = mb.begin(); m != mb.end(); ++m) { + MidiBuffer::TimeType *t = m.timeptr(); + *t += _delay; + } + } + + // move events from dly-buffer into current-buffer until nsamples + // and remove them from the dly-buffer + for (MidiBuffer::iterator m = dly->begin(); m != dly->end();) { + const Evoral::MIDIEvent<MidiBuffer::TimeType> ev (*m, false); + if (ev.time() >= nsamples) { + break; + } + mb.insert_event(ev); + m = dly->erase(m); + } + + /* For now, this is only relevant if there is there's a positive delay. + * In the future this could also be used to delay 'too early' events + * (ie '_global_port_buffer_offset + _port_buffer_offset' - midi_port.cc) + */ + if (_delay != 0) { + // move events after nsamples from current-buffer into dly-buffer + // and trim current-buffer after nsamples + for (MidiBuffer::iterator m = mb.begin(); m != mb.end();) { + const Evoral::MIDIEvent<MidiBuffer::TimeType> ev (*m, false); + if (ev.time() < nsamples) { + ++m; + continue; + } + dly->insert_event(ev); + m = mb.erase(m); + } + } + } + } + + _delay = pending_delay; +} + +void +DelayLine::set_delay(framecnt_t signal_delay) +{ + if (signal_delay < 0) { + signal_delay = 0; + cerr << "WARNING: latency compensation is not possible.\n"; + } + + const framecnt_t rbs = signal_delay + 1; + + DEBUG_TRACE (DEBUG::LatencyCompensation, + string_compose ("%1 set_delay to %2 samples for %3 channels\n", + name(), signal_delay, _configured_output.n_audio())); + + if (signal_delay <= _bsiz) { + _pending_delay = signal_delay; + return; + } + + if (_pending_bsiz) { + if (_pending_bsiz < signal_delay) { + cerr << "LatComp: buffer resize in progress. "<< name() << "pending: "<< _pending_bsiz <<" want: " << signal_delay <<"\n"; // XXX + } else { + _pending_delay = signal_delay; + } + return; + } + + if (_configured_output.n_audio() > 0 ) { + _pending_buf.reset(new Sample[_configured_output.n_audio() * rbs]); + memset(_pending_buf.get(), 0, _configured_output.n_audio() * rbs * sizeof (Sample)); + _pending_bsiz = signal_delay; + } else { + _pending_buf.reset(); + _pending_bsiz = 0; + } + + _pending_delay = signal_delay; + + DEBUG_TRACE (DEBUG::LatencyCompensation, + string_compose ("allocated buffer for %1 of size %2\n", + name(), signal_delay)); +} + +bool +DelayLine::can_support_io_configuration (const ChanCount& in, ChanCount& out) +{ + out = in; + return true; +} + +bool +DelayLine::configure_io (ChanCount in, ChanCount out) +{ + if (out != in) { // always 1:1 + return false; + } + + // TODO realloc buffers if channel count changes.. + // TODO support multiple midi buffers + + DEBUG_TRACE (DEBUG::LatencyCompensation, + string_compose ("configure IO: %1 Ain: %2 Aout: %3 Min: %4 Mout: %5\n", + name(), in.n_audio(), out.n_audio(), in.n_midi(), out.n_midi())); + + if (in.n_midi() > 0 && !_midi_buf) { + _midi_buf.reset(new MidiBuffer(16384)); + } + + return Processor::configure_io (in, out); +} + +void +DelayLine::flush() +{ + _pending_flush = true; +} + +XMLNode& +DelayLine::state (bool full_state) +{ + XMLNode& node (Processor::state (full_state)); + node.add_property("type", "delay"); + return node; +} diff --git a/libs/ardour/delivery.cc b/libs/ardour/delivery.cc index 8c12d44e51..30f7ef63fa 100644 --- a/libs/ardour/delivery.cc +++ b/libs/ardour/delivery.cc @@ -249,6 +249,7 @@ Delivery::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pf processing pathway that wants to use this->output_buffers() for some reason. */ + // TODO delayline -- latency-compensation output_buffers().get_backend_port_addresses (ports, nframes); // this Delivery processor is not a derived type, and thus we assume @@ -556,7 +557,7 @@ Delivery::set_name (const std::string& name) { bool ret = IOProcessor::set_name (name); - if (ret) { + if (ret && _panshell) { ret = _panshell->set_name (name); } diff --git a/libs/ardour/directory_names.cc b/libs/ardour/directory_names.cc index af7f7f550c..c368f8eaaf 100644 --- a/libs/ardour/directory_names.cc +++ b/libs/ardour/directory_names.cc @@ -36,14 +36,16 @@ const char* const export_formats_dir_name = X_("export"); const char* const templates_dir_name = X_("templates"); const char* const route_templates_dir_name = X_("route_templates"); const char* const surfaces_dir_name = X_("surfaces"); +const char* const ladspa_dir_name = X_("ladspa"); const char* const panner_dir_name = X_("panners"); const char* const backend_dir_name = X_("backends"); -/* these should end up using variants of PROGRAM_NAME */ -#ifdef __APPLE__ -const char* const user_config_dir_name = X_("Ardour" "3"); +char config_dir_name[] = X_(PROGRAM_NAME "3"); +#if defined (__APPLE__) || defined (PLATFORM_WINDOWS) +const char* const user_config_dir_name = config_dir_name; #else -const char* const user_config_dir_name = X_("ardour" "3"); +#include "pbd/convert.h" +const char* const user_config_dir_name = PBD::downcase (config_dir_name); #endif } diff --git a/libs/ardour/diskstream.cc b/libs/ardour/diskstream.cc index 94b68478d1..0e05ffabf4 100644 --- a/libs/ardour/diskstream.cc +++ b/libs/ardour/diskstream.cc @@ -29,7 +29,6 @@ #include <cstdlib> #include <ctime> #include <sys/stat.h> -#include <sys/mman.h> #include <glibmm/threads.h> @@ -281,17 +280,17 @@ Diskstream::set_align_choice (AlignChoice a, bool force) if ((a != _alignment_choice) || force) { _alignment_choice = a; - switch (_alignment_choice) { - case Automatic: - set_align_style_from_io (); - break; - case UseExistingMaterial: - set_align_style (ExistingMaterial); - break; - case UseCaptureTime: - set_align_style (CaptureTime); - break; - } + switch (_alignment_choice) { + case Automatic: + set_align_style_from_io (); + break; + case UseExistingMaterial: + set_align_style (ExistingMaterial); + break; + case UseCaptureTime: + set_align_style (CaptureTime); + break; + } } } @@ -438,7 +437,13 @@ Diskstream::set_name (const string& str) playlist()->set_name (str); SessionObject::set_name(str); } - return true; + return true; +} + +bool +Diskstream::set_write_source_name (const std::string& str) { + _write_source_name = str; + return true; } XMLNode& @@ -571,7 +576,7 @@ Diskstream::move_processor_automation (boost::weak_ptr<Processor> p, list< Evora set<Evoral::Parameter> const a = processor->what_can_be_automated (); - for (set<Evoral::Parameter>::iterator i = a.begin (); i != a.end (); ++i) { + for (set<Evoral::Parameter>::const_iterator i = a.begin (); i != a.end (); ++i) { boost::shared_ptr<AutomationList> al = processor->automation_control(*i)->alist(); XMLNode & before = al->get_state (); bool const things_moved = al->move_ranges (movements); @@ -594,27 +599,27 @@ Diskstream::check_record_status (framepos_t transport_frame, bool can_record) const int transport_rolling = 0x4; const int track_rec_enabled = 0x2; const int global_rec_enabled = 0x1; - const int fully_rec_enabled = (transport_rolling|track_rec_enabled|global_rec_enabled); + const int fully_rec_enabled = (transport_rolling|track_rec_enabled|global_rec_enabled); /* merge together the 3 factors that affect record status, and compute - what has changed. - */ + * what has changed. + */ rolling = _session.transport_speed() != 0.0f; - possibly_recording = (rolling << 2) | (record_enabled() << 1) | can_record; + possibly_recording = (rolling << 2) | ((int)record_enabled() << 1) | (int)can_record; change = possibly_recording ^ last_possibly_recording; if (possibly_recording == last_possibly_recording) { return; } - framecnt_t existing_material_offset = _session.worst_playback_latency(); + framecnt_t existing_material_offset = _session.worst_playback_latency(); - if (possibly_recording == fully_rec_enabled) { + if (possibly_recording == fully_rec_enabled) { - if (last_possibly_recording == fully_rec_enabled) { - return; - } + if (last_possibly_recording == fully_rec_enabled) { + return; + } capture_start_frame = _session.transport_frame(); first_recordable_frame = capture_start_frame + _capture_offset; @@ -637,32 +642,32 @@ Diskstream::check_record_status (framepos_t transport_frame, bool can_record) first_recordable_frame)); } - prepare_record_status (capture_start_frame); + prepare_record_status (capture_start_frame); - } else { + } else { - if (last_possibly_recording == fully_rec_enabled) { + if (last_possibly_recording == fully_rec_enabled) { - /* we were recording last time */ + /* we were recording last time */ - if (change & transport_rolling) { + if (change & transport_rolling) { - /* transport-change (stopped rolling): last_recordable_frame was set in ::prepare_to_stop(). We - had to set it there because we likely rolled past the stopping point to declick out, - and then backed up. - */ + /* transport-change (stopped rolling): last_recordable_frame was set in ::prepare_to_stop(). We + * had to set it there because we likely rolled past the stopping point to declick out, + * and then backed up. + */ - } else { - /* punch out */ + } else { + /* punch out */ - last_recordable_frame = _session.transport_frame() + _capture_offset; + last_recordable_frame = _session.transport_frame() + _capture_offset; - if (_alignment_style == ExistingMaterial) { - last_recordable_frame += existing_material_offset; - } - } - } - } + if (_alignment_style == ExistingMaterial) { + last_recordable_frame += existing_material_offset; + } + } + } + } last_possibly_recording = possibly_recording; } diff --git a/libs/ardour/element_import_handler.cc b/libs/ardour/element_import_handler.cc index c360e82206..8f6483b145 100644 --- a/libs/ardour/element_import_handler.cc +++ b/libs/ardour/element_import_handler.cc @@ -18,6 +18,7 @@ */ +#include "ardour/libardour_visibility.h" #include "ardour/element_import_handler.h" #include <algorithm> diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc index e32fe329af..7a200ee0a0 100644 --- a/libs/ardour/enums.cc +++ b/libs/ardour/enums.cc @@ -74,8 +74,6 @@ setup_enum_writer () AFLPosition _AFLPosition; RemoteModel _RemoteModel; DenormalModel _DenormalModel; - CrossfadeModel _CrossfadeModel; - CrossfadeChoice _CrossfadeChoice; InsertMergePolicy _InsertMergePolicy; ListenPosition _ListenPosition; SampleFormat _SampleFormat; @@ -289,15 +287,6 @@ setup_enum_writer () */ enum_writer.add_to_hack_table ("EditorOrdered", "MixerOrdered"); - REGISTER_ENUM (FullCrossfade); - REGISTER_ENUM (ShortCrossfade); - REGISTER (_CrossfadeModel); - - REGISTER_ENUM (RegionFades); - REGISTER_ENUM (ConstantPowerMinus3dB); - REGISTER_ENUM (ConstantPowerMinus6dB); - REGISTER (_CrossfadeChoice); - REGISTER_ENUM (InsertMergeReject); REGISTER_ENUM (InsertMergeRelax); REGISTER_ENUM (InsertMergeReplace); @@ -794,34 +783,6 @@ std::ostream& operator<<(std::ostream& o, const InsertMergePolicy& var) return o << s; } -std::istream& operator>>(std::istream& o, CrossfadeModel& var) -{ - std::string s; - o >> s; - var = (CrossfadeModel) string_2_enum (s, var); - return o; -} - -std::ostream& operator<<(std::ostream& o, const CrossfadeModel& var) -{ - std::string s = enum_2_string (var); - return o << s; -} - -std::istream& operator>>(std::istream& o, CrossfadeChoice& var) -{ - std::string s; - o >> s; - var = (CrossfadeChoice) string_2_enum (s, var); - return o; -} - -std::ostream& operator<<(std::ostream& o, const CrossfadeChoice& var) -{ - std::string s = enum_2_string (var); - return o << s; -} - std::istream& operator>>(std::istream& o, SyncSource& var) { std::string s; @@ -941,3 +902,16 @@ std::ostream& operator<<(std::ostream& o, const Evoral::OverlapType& var) std::string s = enum_2_string (var); return o << s; } +std::istream& operator>>(std::istream& o, FadeShape& var) +{ + std::string s; + o >> s; + var = (FadeShape) string_2_enum (s, var); + return o; +} + +std::ostream& operator<<(std::ostream& o, const FadeShape& var) +{ + std::string s = enum_2_string (var); + return o << s; +} diff --git a/libs/ardour/export_channel.cc b/libs/ardour/export_channel.cc index 0e029a01f7..9362171738 100644 --- a/libs/ardour/export_channel.cc +++ b/libs/ardour/export_channel.cc @@ -187,11 +187,12 @@ RegionExportChannelFactory::update_buffers (framecnt_t frames) assert (mixdown_buffer && gain_buffer); for (size_t channel = 0; channel < n_channels; ++channel) { memset (mixdown_buffer.get(), 0, sizeof (Sample) * frames); + buffers.get_audio (channel).silence(frames); region.read_at (buffers.get_audio (channel).data(), mixdown_buffer.get(), gain_buffer.get(), position, frames, channel); } break; case Processed: - track.export_stuff (buffers, position, frames, track.main_outs(), true, true); + track.export_stuff (buffers, position, frames, track.main_outs(), true, true, false); break; default: throw ExportFailed ("Unhandled type in ExportChannelFactory::update_buffers"); @@ -239,7 +240,11 @@ RouteExportChannel::read (Sample const *& data, framecnt_t frames) const { assert(processor); AudioBuffer const & buffer = processor->get_capture_buffers().get_audio (channel); +#ifndef NDEBUG + (void) frames; +#else assert (frames <= (framecnt_t) buffer.capacity()); +#endif data = buffer.data(); } diff --git a/libs/ardour/export_filename.cc b/libs/ardour/export_filename.cc index 9e126ed087..f7fe22c3b4 100644 --- a/libs/ardour/export_filename.cc +++ b/libs/ardour/export_filename.cc @@ -19,7 +19,6 @@ */ #include <string> -#include "ardour/export_filename.h" #include <glibmm/miscutils.h> #include <glibmm/fileutils.h> @@ -28,11 +27,13 @@ #include "pbd/convert.h" #include "pbd/enumwriter.h" +#include "ardour/libardour_visibility.h" #include "ardour/session.h" #include "ardour/session_directory.h" -#include "ardour/export_timespan.h" +#include "ardour/export_filename.h" #include "ardour/export_format_specification.h" #include "ardour/export_channel_configuration.h" +#include "ardour/export_timespan.h" #include "ardour/utils.h" #include "i18n.h" diff --git a/libs/ardour/export_format_base.cc b/libs/ardour/export_format_base.cc index ed8bb9d5f8..1eda449915 100644 --- a/libs/ardour/export_format_base.cc +++ b/libs/ardour/export_format_base.cc @@ -185,7 +185,7 @@ ExportFormatBase::nearest_sample_rate (framecnt_t sample_rate) SampleRate best_match = SR_None; #define DO_SR_COMPARISON(rate) \ - diff = std::fabs((rate) - sample_rate); \ + diff = std::fabs((double)((rate) - sample_rate)); \ if(diff < smallest_diff) { \ smallest_diff = diff; \ best_match = (rate); \ diff --git a/libs/ardour/export_format_manager.cc b/libs/ardour/export_format_manager.cc index 890623c114..04cfa76677 100644 --- a/libs/ardour/export_format_manager.cc +++ b/libs/ardour/export_format_manager.cc @@ -293,6 +293,14 @@ ExportFormatManager::select_with_toc (bool value) check_for_description_change (); } + +void +ExportFormatManager::set_command (std::string command) +{ + current_selection->set_command (command); + check_for_description_change (); +} + void ExportFormatManager::select_trim_beginning (bool value) { diff --git a/libs/ardour/export_format_specification.cc b/libs/ardour/export_format_specification.cc index b139faeee2..d8a45ba533 100644 --- a/libs/ardour/export_format_specification.cc +++ b/libs/ardour/export_format_specification.cc @@ -170,6 +170,8 @@ ExportFormatSpecification::ExportFormatSpecification (Session & s) , _normalize_target (1.0) , _with_toc (false) , _with_cue (false) + , _soundcloud_upload (false) + , _command ("") { format_ids.insert (F_None); endiannesses.insert (E_FileDefault); @@ -244,6 +246,7 @@ ExportFormatSpecification::get_state () root->add_property ("id", _id.to_s()); root->add_property ("with-cue", _with_cue ? "true" : "false"); root->add_property ("with-toc", _with_toc ? "true" : "false"); + root->add_property ("command", _command); node = root->add_child ("Encoding"); node->add_property ("id", enum_2_string (format_id())); @@ -321,6 +324,13 @@ ExportFormatSpecification::set_state (const XMLNode & root) _with_toc = false; } + + if ((prop = root.property ("command"))) { + _command = prop->value(); + } else { + _command = ""; + } + /* Encoding and SRC */ if ((child = root.child ("Encoding"))) { @@ -590,6 +600,10 @@ ExportFormatSpecification::description (bool include_name) components.push_back ("CUE"); } + if (!_command.empty()) { + components.push_back ("+"); + } + string desc; if (include_name) { desc = _name + ": "; diff --git a/libs/ardour/export_formats_search_path.cc b/libs/ardour/export_formats_search_path.cc deleted file mode 100644 index cf18b14a18..0000000000 --- a/libs/ardour/export_formats_search_path.cc +++ /dev/null @@ -1,51 +0,0 @@ -/* - Copyright (C) 2007 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 <iostream> -#include <glibmm/miscutils.h> - -#include "ardour/export_formats_search_path.h" -#include "ardour/directory_names.h" -#include "ardour/filesystem_paths.h" - -namespace { - const char * const export_env_variable_name = "ARDOUR_EXPORT_FORMATS_PATH"; -} // anonymous - -using namespace PBD; - -namespace ARDOUR { - -SearchPath -export_formats_search_path () -{ - SearchPath spath (ardour_data_search_path()); - spath.add_subdirectory_to_paths (export_formats_dir_name); - - bool export_formats_path_defined = false; - SearchPath spath_env (Glib::getenv(export_env_variable_name, export_formats_path_defined)); - - if (export_formats_path_defined) { - spath += spath_env; - } - - return spath; -} - -} // namespace ARDOUR diff --git a/libs/ardour/export_graph_builder.cc b/libs/ardour/export_graph_builder.cc index 301914b0ae..2c0c44033d 100644 --- a/libs/ardour/export_graph_builder.cc +++ b/libs/ardour/export_graph_builder.cc @@ -20,6 +20,8 @@ #include "ardour/export_graph_builder.h" +#include <vector> + #include <glibmm/miscutils.h> #include "audiographer/process_context.h" @@ -317,8 +319,8 @@ ExportGraphBuilder::Normalizer::Normalizer (ExportGraphBuilder & parent, FileSpe { std::string tmpfile_path = parent.session.session_directory().export_path(); tmpfile_path = Glib::build_filename(tmpfile_path, "XXXXXX"); - char tmpfile_path_buf[tmpfile_path.size() + 1]; - std::copy(tmpfile_path.begin(), tmpfile_path.end(), tmpfile_path_buf); + std::vector<char> tmpfile_path_buf(tmpfile_path.size() + 1); + std::copy(tmpfile_path.begin(), tmpfile_path.end(), tmpfile_path_buf.begin()); tmpfile_path_buf[tmpfile_path.size()] = '\0'; config = new_config; @@ -334,7 +336,7 @@ ExportGraphBuilder::Normalizer::Normalizer (ExportGraphBuilder & parent, FileSpe normalizer->add_output (threader); int format = ExportFormatBase::F_RAW | ExportFormatBase::SF_Float; - tmp_file.reset (new TmpFile<float> (tmpfile_path_buf, format, channels, config.format->sample_rate())); + tmp_file.reset (new TmpFile<float> (&tmpfile_path_buf[0], format, channels, config.format->sample_rate())); tmp_file->FileWritten.connect_same_thread (post_processing_connection, boost::bind (&Normalizer::start_post_processing, this)); diff --git a/libs/ardour/export_handler.cc b/libs/ardour/export_handler.cc index 93f43f33a6..e706522aa9 100644 --- a/libs/ardour/export_handler.cc +++ b/libs/ardour/export_handler.cc @@ -20,18 +20,24 @@ #include "ardour/export_handler.h" +#include <glib/gstdio.h> #include <glibmm.h> #include <glibmm/convert.h> #include "pbd/convert.h" #include "ardour/audiofile_tagger.h" +#include "ardour/debug.h" #include "ardour/export_graph_builder.h" #include "ardour/export_timespan.h" #include "ardour/export_channel_configuration.h" #include "ardour/export_status.h" #include "ardour/export_format_specification.h" #include "ardour/export_filename.h" +#include "ardour/soundcloud_upload.h" +#include "ardour/system_exec.h" +#include "pbd/openuri.h" +#include "pbd/basename.h" #include "ardour/session_metadata.h" #include "i18n.h" @@ -277,6 +283,13 @@ ExportHandler::process_normalize () } void +ExportHandler::command_output(std::string output, size_t size) +{ + std::cerr << "command: " << size << ", " << output << std::endl; + info << output << endmsg; +} + +void ExportHandler::finish_timespan () { while (config_map.begin() != timespan_bounds.second) { @@ -296,13 +309,69 @@ ExportHandler::finish_timespan () AudiofileTagger::tag_file(filename, *SessionMetadata::Metadata()); } + if (!fmt->command().empty()) { + +#if 0 // would be nicer with C++11 initialiser... + std::map<char, std::string> subs { + { 'f', filename }, + { 'd', Glib::path_get_dirname(filename) + G_DIR_SEPARATOR }, + { 'b', PBD::basename_nosuffix(filename) }, + ... + }; +#endif + + PBD::ScopedConnection command_connection; + std::map<char, std::string> subs; + subs.insert (std::pair<char, std::string> ('f', filename)); + subs.insert (std::pair<char, std::string> ('d', Glib::path_get_dirname (filename) + G_DIR_SEPARATOR)); + subs.insert (std::pair<char, std::string> ('b', PBD::basename_nosuffix (filename))); + subs.insert (std::pair<char, std::string> ('s', session.path ())); + subs.insert (std::pair<char, std::string> ('n', session.name ())); + + ARDOUR::SystemExec *se = new ARDOUR::SystemExec(fmt->command(), subs); + se->ReadStdout.connect_same_thread(command_connection, boost::bind(&ExportHandler::command_output, this, _1, _2)); + if (se->start (2) == 0) { + // successfully started + while (se->is_running ()) { + // wait for system exec to terminate + Glib::usleep (1000); + } + } + delete (se); + } + + if (fmt->soundcloud_upload()) { + SoundcloudUploader *soundcloud_uploader = new SoundcloudUploader; + std::string token = soundcloud_uploader->Get_Auth_Token(soundcloud_username, soundcloud_password); + DEBUG_TRACE (DEBUG::Soundcloud, string_compose( + "uploading %1 - username=%2, password=%3, token=%4", + filename, soundcloud_username, soundcloud_password, token) ); + std::string path = soundcloud_uploader->Upload ( + filename, + PBD::basename_nosuffix(filename), // title + token, + soundcloud_make_public, + soundcloud_downloadable, + this); + + if (path.length() != 0) { + info << string_compose ( _("File %1 uploaded to %2"), filename, path) << endmsg; + if (soundcloud_open_page) { + DEBUG_TRACE (DEBUG::Soundcloud, string_compose ("opening %1", path) ); + open_uri(path.c_str()); // open the soundcloud website to the new file + } + } else { + error << _("upload to Soundcloud failed. Perhaps your email or password are incorrect?\n") << endmsg; + } + delete soundcloud_uploader; + } config_map.erase (config_map.begin()); } start_timespan (); } -/*** CD Marker sutff ***/ +/*** CD Marker stuff ***/ struct LocationSortByStart { bool operator() (Location *a, Location *b) { @@ -422,10 +491,10 @@ ExportHandler::export_cd_marker_file (ExportTimespanPtr timespan, ExportFormatSp } catch (std::exception& e) { error << string_compose (_("an error occured while writing a TOC/CUE file: %1"), e.what()) << endmsg; - ::unlink (filepath.c_str()); + ::g_unlink (filepath.c_str()); } catch (Glib::Exception& e) { error << string_compose (_("an error occured while writing a TOC/CUE file: %1"), e.what()) << endmsg; - ::unlink (filepath.c_str()); + ::g_unlink (filepath.c_str()); } } diff --git a/libs/ardour/export_profile_manager.cc b/libs/ardour/export_profile_manager.cc index 42e494c0cb..4a10d3dfa8 100644 --- a/libs/ardour/export_profile_manager.cc +++ b/libs/ardour/export_profile_manager.cc @@ -34,7 +34,7 @@ #include "ardour/export_profile_manager.h" #include "ardour/export_format_specification.h" -#include "ardour/export_formats_search_path.h" +#include "ardour/search_paths.h" #include "ardour/export_timespan.h" #include "ardour/export_channel_configuration.h" #include "ardour/export_filename.h" @@ -332,8 +332,7 @@ ExportProfileManager::find_file (std::string const & pattern) { vector<std::string> found; - Glib::PatternSpec pattern_spec (pattern); - find_matching_files_in_search_path (search_path, pattern_spec, found); + find_files_matching_pattern (found, search_path, pattern); return found; } @@ -644,6 +643,7 @@ ExportProfileManager::get_new_format (ExportFormatSpecPtr original) ExportFormatSpecPtr format; if (original) { format.reset (new ExportFormatSpecification (*original)); + std::cerr << "After new format created from original, format has id [" << format->id().to_s() << ']' << std::endl; } else { format = handler->add_format(); format->set_name (_("empty format")); @@ -685,7 +685,7 @@ ExportProfileManager::FormatStatePtr ExportProfileManager::deserialize_format (XMLNode & root) { XMLProperty * prop; - UUID id; + PBD::UUID id; if ((prop = root.property ("id"))) { id = prop->value(); @@ -724,8 +724,20 @@ ExportProfileManager::load_formats () void ExportProfileManager::load_format_from_disk (std::string const & path) { - XMLTree const tree (path); - ExportFormatSpecPtr format = handler->add_format (*tree.root()); + XMLTree tree; + + if (!tree.read (path)) { + error << string_compose (_("Cannot load export format from %1"), path) << endmsg; + return; + } + + XMLNode* root = tree.root(); + if (!root) { + error << string_compose (_("Cannot export format read from %1"), path) << endmsg; + return; + } + + ExportFormatSpecPtr format = handler->add_format (*root); /* Handle id to filename mapping and don't add duplicates to list */ diff --git a/libs/ardour/file_source.cc b/libs/ardour/file_source.cc index 30ae2178fe..8c41f981b9 100644 --- a/libs/ardour/file_source.cc +++ b/libs/ardour/file_source.cc @@ -51,7 +51,7 @@ using namespace ARDOUR; using namespace PBD; using namespace Glib; -PBD::Signal3<int,std::string,std::string,std::vector<std::string> > FileSource::AmbiguousFileName; +PBD::Signal2<int,std::string,std::vector<std::string> > FileSource::AmbiguousFileName; FileSource::FileSource (Session& session, DataType type, const string& path, const string& origin, Source::Flag flag) : Source(session, type, path, flag) @@ -243,19 +243,15 @@ FileSource::find (Session& s, DataType type, const string& path, bool must_exist isnew = false; if (!Glib::path_is_absolute (path)) { - vector<string> dirs; vector<string> hits; string fullpath; + std::vector<std::string> dirs = s.source_search_path (type); - string search_path = s.source_search_path (type); - - if (search_path.length() == 0) { + if (dirs.size() == 0) { error << _("FileSource: search path not set") << endmsg; goto out; } - split (search_path, dirs, ':'); - hits.clear (); for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) { @@ -299,7 +295,7 @@ FileSource::find (Session& s, DataType type, const string& path, bool must_exist /* more than one match: ask the user */ - int which = FileSource::AmbiguousFileName (path, search_path, de_duped_hits).get_value_or (-1); + int which = FileSource::AmbiguousFileName (path, de_duped_hits).get_value_or (-1); if (which < 0) { goto out; @@ -313,8 +309,7 @@ FileSource::find (Session& s, DataType type, const string& path, bool must_exist if (must_exist) { error << string_compose( - _("Filesource: cannot find required file (%1): while searching %2"), - path, search_path) << endmsg; + _("Filesource: cannot find required file (%1)"), path) << endmsg; goto out; } else { isnew = true; @@ -360,8 +355,6 @@ bool FileSource::find_2X (Session& s, DataType type, const string& path, bool must_exist, bool& isnew, uint16_t& chan, string& found_path) { - string search_path = s.source_search_path (type); - string pathstr = path; string::size_type pos; bool ret = false; @@ -372,18 +365,17 @@ FileSource::find_2X (Session& s, DataType type, const string& path, bool must_ex /* non-absolute pathname: find pathstr in search path */ - vector<string> dirs; + vector<string> dirs = s.source_search_path (type); + int cnt; string fullpath; string keeppath; - if (search_path.length() == 0) { + if (dirs.size() == 0) { error << _("FileSource: search path not set") << endmsg; goto out; } - split (search_path, dirs, ':'); - cnt = 0; for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) { @@ -440,16 +432,14 @@ FileSource::find_2X (Session& s, DataType type, const string& path, bool must_ex if (cnt > 1) { error << string_compose ( - _("FileSource: \"%1\" is ambigous when searching %2\n\t"), - pathstr, search_path) << endmsg; + _("FileSource: \"%1\" is ambigous when searching\n\t"), pathstr) << endmsg; goto out; } else if (cnt == 0) { if (must_exist) { error << string_compose( - _("Filesource: cannot find required file (%1): while searching %2"), - pathstr, search_path) << endmsg; + _("Filesource: cannot find required file (%1)"), pathstr) << endmsg; goto out; } else { isnew = true; @@ -499,13 +489,14 @@ FileSource::find_2X (Session& s, DataType type, const string& path, bool must_ex goto out; } +#ifndef PLATFORM_WINDOWS if (errno != ENOENT) { error << string_compose( _("Filesource: cannot check for existing file (%1): %2"), path, strerror (errno)) << endmsg; goto out; } - +#endif /* a new file */ isnew = true; ret = true; diff --git a/libs/ardour/filesystem_paths.cc b/libs/ardour/filesystem_paths.cc index 73bfaff137..1b4bd0476d 100644 --- a/libs/ardour/filesystem_paths.cc +++ b/libs/ardour/filesystem_paths.cc @@ -30,6 +30,11 @@ #include "i18n.h" +#ifdef PLATFORM_WINDOWS +#include "shlobj.h" +#include "pbd/windows_special_dirs.h" +#endif + using namespace PBD; namespace ARDOUR { @@ -54,8 +59,12 @@ user_config_directory () if ((c = getenv ("XDG_CONFIG_HOME")) != 0) { p = c; } else { +#ifdef PLATFORM_WINDOWS + // Not technically the home dir (since it needs to be a writable folder) + const string home_dir = Glib::build_filename (Glib::get_user_config_dir(), user_config_dir_name); +#else const string home_dir = Glib::get_home_dir(); - +#endif if (home_dir.empty ()) { error << "Unable to determine home directory" << endmsg; exit (1); @@ -66,7 +75,9 @@ user_config_directory () } #endif +#ifndef PLATFORM_WINDOWS p = Glib::build_filename (p, user_config_dir_name); +#endif if (!Glib::file_test (p, Glib::FILE_TEST_EXISTS)) { if (g_mkdir_with_parents (p.c_str(), 0755)) { @@ -84,51 +95,122 @@ user_config_directory () } std::string +user_cache_directory () +{ + static std::string p; + + if (!p.empty()) return p; + +#ifdef __APPLE__ + p = Glib::build_filename (Glib::get_home_dir(), "Library/Caches"); +#else + const char* c = 0; + + /* adopt freedesktop standards, and put .ardour3 into $XDG_CACHE_HOME + * defaulting to or ~/.config + */ + if ((c = getenv ("XDG_CACHE_HOME")) != 0) { + p = c; + } else { +#ifdef PLATFORM_WINDOWS + // Not technically the home dir (since it needs to be a writable folder) + const string home_dir = Glib::build_filename (Glib::get_user_data_dir(), user_config_dir_name); +#else + const string home_dir = Glib::get_home_dir(); +#endif + if (home_dir.empty ()) { + error << "Unable to determine home directory" << endmsg; + exit (1); + } + + p = home_dir; + p = Glib::build_filename (p, ".cache"); + } +#endif + +#ifndef PLATFORM_WINDOWS + p = Glib::build_filename (p, user_config_dir_name); +#endif + + if (!Glib::file_test (p, Glib::FILE_TEST_EXISTS)) { + if (g_mkdir_with_parents (p.c_str(), 0755)) { + error << string_compose (_("Cannot create cache directory %1 - cannot run"), + p) << endmsg; + exit (1); + } + } else if (!Glib::file_test (p, Glib::FILE_TEST_IS_DIR)) { + error << string_compose (_("Cache directory %1 already exists and is not a directory/folder - cannot run"), + p) << endmsg; + exit (1); + } + + return p; +} + +std::string ardour_dll_directory () { +#ifdef PLATFORM_WINDOWS + std::string dll_dir_path(g_win32_get_package_installation_directory_of_module(NULL)); + dll_dir_path = Glib::build_filename (dll_dir_path, "lib"); + return Glib::build_filename (dll_dir_path, "ardour3"); +#else std::string s = Glib::getenv("ARDOUR_DLL_PATH"); if (s.empty()) { std::cerr << _("ARDOUR_DLL_PATH not set in environment - exiting\n"); ::exit (1); } return s; +#endif } -SearchPath +#ifdef PLATFORM_WINDOWS +Searchpath +windows_search_path () +{ + std::string dll_dir_path(g_win32_get_package_installation_directory_of_module(NULL)); + dll_dir_path = Glib::build_filename (dll_dir_path, "share"); + return Glib::build_filename (dll_dir_path, "ardour3"); +} +#endif + +Searchpath ardour_config_search_path () { - static SearchPath search_path; + static Searchpath search_path; if (search_path.empty()) { search_path += user_config_directory(); - +#ifdef PLATFORM_WINDOWS + search_path += windows_search_path (); +#endif std::string s = Glib::getenv("ARDOUR_CONFIG_PATH"); if (s.empty()) { - std::cerr << _("ARDOUR_CONFIG_PATH not set in environment - exiting\n"); - ::exit (1); + std::cerr << _("ARDOUR_CONFIG_PATH not set in environment\n"); + } else { + search_path += Searchpath (s); } - - search_path += SearchPath (s); } return search_path; } -SearchPath +Searchpath ardour_data_search_path () { - static SearchPath search_path; + static Searchpath search_path; if (search_path.empty()) { search_path += user_config_directory(); - +#ifdef PLATFORM_WINDOWS + search_path += windows_search_path (); +#endif std::string s = Glib::getenv("ARDOUR_DATA_PATH"); if (s.empty()) { - std::cerr << _("ARDOUR_DATA_PATH not set in environment - exiting\n"); - ::exit (1); + std::cerr << _("ARDOUR_DATA_PATH not set in environment\n"); + } else { + search_path += Searchpath (s); } - - search_path += SearchPath (s); } return search_path; diff --git a/libs/ardour/find_session.cc b/libs/ardour/find_session.cc index f0a034d8d4..501927c42c 100644 --- a/libs/ardour/find_session.cc +++ b/libs/ardour/find_session.cc @@ -27,10 +27,12 @@ #include <glibmm/miscutils.h> #include "pbd/compose.h" +#include "pbd/pathexpand.h" #include "pbd/error.h" #include "ardour/filename_extensions.h" #include "ardour/utils.h" +#include "ardour/session_utils.h" #include "i18n.h" @@ -43,16 +45,10 @@ int find_session (string str, string& path, string& snapshot, bool& isnew) { struct stat statbuf; - char buf[PATH_MAX+1]; isnew = false; - if (!realpath (str.c_str(), buf) && (errno != ENOENT && errno != ENOTDIR)) { - error << string_compose (_("Could not resolve path: %1 (%2)"), buf, strerror(errno)) << endmsg; - return -1; - } - - str = buf; + str = canonical_path (str); /* check to see if it exists, and what it is */ diff --git a/libs/ardour/globals.cc b/libs/ardour/globals.cc index 9850d82d31..ed62420ff0 100644 --- a/libs/ardour/globals.cc +++ b/libs/ardour/globals.cc @@ -20,12 +20,18 @@ #include "libardour-config.h" #endif +#ifdef interface +#undef interface +#endif + #include <cstdio> // Needed so that libraptor (included in lrdf) won't complain #include <cstdlib> #include <sys/stat.h> #include <sys/types.h> #include <sys/time.h> +#ifndef PLATFORM_WINDOWS #include <sys/resource.h> +#endif #include <unistd.h> #include <fcntl.h> #include <errno.h> @@ -43,7 +49,7 @@ #include "ardour/audio_unit.h" #endif -#ifdef __SSE__ +#if defined(__SSE__) || defined(USE_XMMINTRIN) #include <xmmintrin.h> #endif @@ -54,7 +60,9 @@ #include <glibmm/fileutils.h> #include <glibmm/miscutils.h> +#ifdef HAVE_LRDF #include <lrdf.h> +#endif #include "pbd/cpus.h" #include "pbd/error.h" @@ -117,6 +125,8 @@ mix_buffers_with_gain_t ARDOUR::mix_buffers_with_gain = 0; mix_buffers_no_gain_t ARDOUR::mix_buffers_no_gain = 0; PBD::Signal1<void,std::string> ARDOUR::BootMessage; +PBD::Signal3<void,std::string,std::string,bool> ARDOUR::PluginScanMessage; +PBD::Signal1<void,int> ARDOUR::PluginScanTimeout; PBD::Signal0<void> ARDOUR::GUIIdle; namespace ARDOUR { @@ -196,6 +206,7 @@ setup_hardware_optimization (bool try_optimization) static void lotsa_files_please () { +#ifndef PLATFORM_WINDOWS struct rlimit rl; if (getrlimit (RLIMIT_NOFILE, &rl) == 0) { @@ -216,6 +227,7 @@ lotsa_files_please () } else { error << string_compose (_("Could not get system open files limit (%1)"), strerror (errno)) << endmsg; } +#endif } bool @@ -229,6 +241,7 @@ ARDOUR::init (bool use_windows_vst, bool try_optimization, const char* localedir #ifdef ENABLE_NLS (void) bindtextdomain(PACKAGE, localedir); + (void) bind_textdomain_codeset (PACKAGE, "UTF-8"); #endif SessionEvent::init_event_pool (); @@ -262,7 +275,9 @@ ARDOUR::init (bool use_windows_vst, bool try_optimization, const char* localedir // allow ardour the absolute maximum number of open files lotsa_files_please (); +#ifdef HAVE_LRDF lrdf_init(); +#endif Library = new AudioLibrary; BootMessage (_("Loading configuration")); @@ -351,7 +366,7 @@ ARDOUR::init_post_engine () /* find plugins */ - ARDOUR::PluginManager::instance().refresh (); + ARDOUR::PluginManager::instance().refresh (!Config->get_discover_vst_on_start()); } void @@ -364,7 +379,9 @@ ARDOUR::cleanup () ARDOUR::AudioEngine::destroy (); delete Library; +#ifdef HAVE_LRDF lrdf_cleanup (); +#endif delete &ControlProtocolManager::instance(); #ifdef WINDOWS_VST_SUPPORT fst_exit (); @@ -373,6 +390,8 @@ ARDOUR::cleanup () #ifdef LXVST_SUPPORT vstfx_exit(); #endif + delete &PluginManager::instance(); + delete Config; PBD::cleanup (); return; @@ -382,14 +401,12 @@ void ARDOUR::find_bindings_files (map<string,string>& files) { vector<std::string> found; - SearchPath spath = ardour_config_search_path(); + Searchpath spath = ardour_config_search_path(); if (getenv ("ARDOUR_SAE")) { - Glib::PatternSpec pattern("*SAE-*.bindings"); - find_matching_files_in_search_path (spath, pattern, found); + find_files_matching_pattern (found, spath, "*SAE-*.bindings"); } else { - Glib::PatternSpec pattern("*.bindings"); - find_matching_files_in_search_path (spath, pattern, found); + find_files_matching_pattern (found, spath, "*.bindings"); } if (found.empty()) { @@ -525,8 +542,8 @@ ARDOUR::set_translations_enabled (bool yn) c = '0'; } - ::write (fd, &c, 1); - ::close (fd); + (void) ::write (fd, &c, 1); + (void) ::close (fd); return true; } @@ -581,10 +598,21 @@ clock_gettime (int /*clk_id*/, struct timespec *t) microseconds_t ARDOUR::get_microseconds () { +#ifdef PLATFORM_WINDOWS + microseconds_t ret = 0; + LARGE_INTEGER freq, time; + + if (QueryPerformanceFrequency(&freq)) + if (QueryPerformanceCounter(&time)) + ret = (microseconds_t)((time.QuadPart * 1000000) / freq.QuadPart); + + return ret; +#else struct timespec ts; if (clock_gettime (CLOCK_MONOTONIC, &ts) != 0) { /* EEEK! */ return 0; } return (microseconds_t) ts.tv_sec * 1000000 + (ts.tv_nsec/1000); +#endif } diff --git a/libs/ardour/graph.cc b/libs/ardour/graph.cc index 71eeee41ea..3e87853319 100644 --- a/libs/ardour/graph.cc +++ b/libs/ardour/graph.cc @@ -22,6 +22,7 @@ #include "pbd/compose.h" #include "pbd/debug_rt_alloc.h" +#include "pbd/pthread_utils.h" #include "ardour/debug.h" #include "ardour/graph.h" @@ -31,8 +32,6 @@ #include "ardour/process_thread.h" #include "ardour/audioengine.h" -#include <jack/thread.h> - #include "i18n.h" using namespace ARDOUR; @@ -223,7 +222,7 @@ Graph::trigger (GraphNode* n) void Graph::dec_ref() { - if (g_atomic_int_dec_and_test (&_finished_refcount)) { + if (g_atomic_int_dec_and_test (const_cast<gint*> (&_finished_refcount))) { /* We have run all the nodes that are at the `output' end of the graph, so there is nothing more to do this time around. @@ -358,7 +357,7 @@ Graph::run_one() /* update the number of threads that will still be sleeping */ _execution_tokens -= wakeup; - DEBUG_TRACE(DEBUG::ProcessThreads, string_compose ("%1 signals %2\n", pthread_self(), wakeup)); + DEBUG_TRACE(DEBUG::ProcessThreads, string_compose ("%1 signals %2\n", pthread_name(), wakeup)); for (int i = 0; i < wakeup; i++) { _execution_sem.signal (); @@ -367,12 +366,12 @@ Graph::run_one() while (to_run == 0) { _execution_tokens += 1; pthread_mutex_unlock (&_trigger_mutex); - DEBUG_TRACE (DEBUG::ProcessThreads, string_compose ("%1 goes to sleep\n", pthread_self())); + DEBUG_TRACE (DEBUG::ProcessThreads, string_compose ("%1 goes to sleep\n", pthread_name())); _execution_sem.wait (); if (_quit_threads) { return true; } - DEBUG_TRACE (DEBUG::ProcessThreads, string_compose ("%1 is awake\n", pthread_self())); + DEBUG_TRACE (DEBUG::ProcessThreads, string_compose ("%1 is awake\n", pthread_name())); pthread_mutex_lock (&_trigger_mutex); if (_trigger_queue.size()) { to_run = _trigger_queue.back(); @@ -384,7 +383,7 @@ Graph::run_one() to_run->process(); to_run->finish (_current_chain); - DEBUG_TRACE(DEBUG::ProcessThreads, string_compose ("%1 has finished run_one()\n", pthread_self())); + DEBUG_TRACE(DEBUG::ProcessThreads, string_compose ("%1 has finished run_one()\n", pthread_name())); return false; } @@ -552,7 +551,7 @@ Graph::process_one_route (Route* route) assert (route); - DEBUG_TRACE (DEBUG::ProcessThreads, string_compose ("%1 runs route %2\n", pthread_self(), route->name())); + DEBUG_TRACE (DEBUG::ProcessThreads, string_compose ("%1 runs route %2\n", pthread_name(), route->name())); if (_process_silent) { retval = route->silent_roll (_process_nframes, _process_start_frame, _process_end_frame, need_butler); diff --git a/libs/ardour/import.cc b/libs/ardour/import.cc index 6f7b3d0616..e86e500ed9 100644 --- a/libs/ardour/import.cc +++ b/libs/ardour/import.cc @@ -34,6 +34,7 @@ #include <sndfile.h> #include <samplerate.h> +#include <glib/gstdio.h> #include <glibmm.h> #include <boost/scoped_array.hpp> @@ -122,7 +123,7 @@ Session::get_paths_for_new_sources (bool /*allow_replacing*/, const string& impo vector<string> new_paths; const string basename = basename_nosuffix (import_file_path); - for (uint n = 0; n < channels; ++n) { + for (uint32_t n = 0; n < channels; ++n) { const DataType type = SMFSource::safe_midi_file_extension (import_file_path) ? DataType::MIDI : DataType::AUDIO; string filepath; @@ -149,7 +150,7 @@ Session::get_paths_for_new_sources (bool /*allow_replacing*/, const string& impo static bool map_existing_mono_sources (const vector<string>& new_paths, Session& /*sess*/, - uint /*samplerate*/, vector<boost::shared_ptr<Source> >& newfiles, Session *session) + uint32_t /*samplerate*/, vector<boost::shared_ptr<Source> >& newfiles, Session *session) { for (vector<string>::const_iterator i = new_paths.begin(); i != new_paths.end(); ++i) @@ -168,7 +169,7 @@ map_existing_mono_sources (const vector<string>& new_paths, Session& /*sess*/, static bool create_mono_sources_for_writing (const vector<string>& new_paths, - Session& sess, uint samplerate, + Session& sess, uint32_t samplerate, vector<boost::shared_ptr<Source> >& newfiles, framepos_t timeline_position) { @@ -206,10 +207,10 @@ create_mono_sources_for_writing (const vector<string>& new_paths, static string compose_status_message (const string& path, - uint file_samplerate, - uint session_samplerate, - uint /* current_file */, - uint /* total_files */) + uint32_t file_samplerate, + uint32_t session_samplerate, + uint32_t /* current_file */, + uint32_t /* total_files */) { if (file_samplerate != session_samplerate) { return string_compose (_("Resampling %1 from %2kHz to %3kHz"), @@ -253,7 +254,7 @@ write_audio_data_to_new_files (ImportableSource* source, ImportStatus& status, */ float peak = 0; - uint read_count = 0; + uint32_t read_count = 0; while (!status.cancel) { framecnt_t const nread = source->read (data.get(), nframes); @@ -276,7 +277,7 @@ write_audio_data_to_new_files (ImportableSource* source, ImportStatus& status, progress_multiplier = 0.5; progress_base = 0.5; } - + framecnt_t read_count = 0; while (!status.cancel) { @@ -286,6 +287,14 @@ write_audio_data_to_new_files (ImportableSource* source, ImportStatus& status, uint32_t chn; if ((nread = source->read (data.get(), nframes)) == 0) { +#ifdef PLATFORM_WINDOWS + /* Flush the data once we've finished importing the file. Windows can */ + /* cache the data for very long periods of time (perhaps not writing */ + /* it to disk until Ardour closes). So let's force it to flush now. */ + for (chn = 0; chn < channels; ++chn) + if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(newfiles[chn])) != 0) + afs->flush (); +#endif break; } @@ -417,7 +426,7 @@ remove_file_source (boost::shared_ptr<Source> source) boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source); if (fs) { - ::unlink (fs->path().c_str()); + ::g_unlink (fs->path().c_str()); } } @@ -432,7 +441,7 @@ Session::import_files (ImportStatus& status) Sources all_new_sources; boost::shared_ptr<AudioFileSource> afs; boost::shared_ptr<SMFSource> smfs; - uint channels = 0; + uint32_t channels = 0; status.sources.clear (); @@ -465,6 +474,11 @@ Session::import_files (ImportStatus& status) return; } } + + if (channels == 0) { + error << _("Import: file contains no channels.") << endmsg; + continue; + } vector<string> new_paths = get_paths_for_new_sources (status.replace_existing_source, *p, channels); Sources newfiles; diff --git a/libs/ardour/internal_return.cc b/libs/ardour/internal_return.cc index fc5963603b..1eae5d3171 100644 --- a/libs/ardour/internal_return.cc +++ b/libs/ardour/internal_return.cc @@ -20,6 +20,7 @@ #include "ardour/internal_return.h" #include "ardour/internal_send.h" +#include "ardour/route.h" using namespace std; using namespace ARDOUR; @@ -41,7 +42,7 @@ InternalReturn::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*e if (lm.locked ()) { for (list<InternalSend*>::iterator i = _sends.begin(); i != _sends.end(); ++i) { - if ((*i)->active ()) { + if ((*i)->active () && (!(*i)->source_route() || (*i)->source_route()->active())) { bufs.merge_from ((*i)->get_buffers(), nframes); } } diff --git a/libs/ardour/internal_send.cc b/libs/ardour/internal_send.cc index 17a3ca1f42..e5c7232f48 100644 --- a/libs/ardour/internal_send.cc +++ b/libs/ardour/internal_send.cc @@ -40,14 +40,21 @@ using namespace std; PBD::Signal1<void, pframes_t> InternalSend::CycleStart; -InternalSend::InternalSend (Session& s, boost::shared_ptr<Pannable> p, boost::shared_ptr<MuteMaster> mm, boost::shared_ptr<Route> sendto, Delivery::Role role, bool ignore_bitslot) +InternalSend::InternalSend (Session& s, + boost::shared_ptr<Pannable> p, + boost::shared_ptr<MuteMaster> mm, + boost::shared_ptr<Route> sendfrom, + boost::shared_ptr<Route> sendto, + Delivery::Role role, + bool ignore_bitslot) : Send (s, p, mm, role, ignore_bitslot) + , _send_from (sendfrom) { - if (sendto) { - if (use_target (sendto)) { - throw failed_constructor(); - } - } + if (sendto) { + if (use_target (sendto)) { + throw failed_constructor(); + } + } init_gain (); @@ -202,6 +209,8 @@ InternalSend::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame _amp->setup_gain_automation (start_frame, end_frame, nframes); _amp->run (mixbufs, start_frame, end_frame, nframes, true); + _delayline->run (mixbufs, start_frame, end_frame, nframes, true); + /* consider metering */ if (_metering) { diff --git a/libs/ardour/io.cc b/libs/ardour/io.cc index 6f5b5a63da..2cc213f797 100644 --- a/libs/ardour/io.cc +++ b/libs/ardour/io.cc @@ -19,6 +19,7 @@ #include <fstream> #include <algorithm> #include <cmath> +#include <vector> #include <unistd.h> #include <locale.h> @@ -395,7 +396,9 @@ IO::disconnect (void* src) int IO::ensure_ports_locked (ChanCount count, bool clear, bool& changed) { +#ifndef PLATFORM_WINDOWS assert (!AudioEngine::instance()->process_lock().trylock()); +#endif boost::shared_ptr<Port> port; @@ -466,7 +469,9 @@ IO::ensure_ports_locked (ChanCount count, bool clear, bool& changed) int IO::ensure_ports (ChanCount count, bool clear, void* src) { +#ifndef PLATFORM_WINDOWS assert (!AudioEngine::instance()->process_lock().trylock()); +#endif bool changed = false; @@ -501,7 +506,9 @@ IO::ensure_ports (ChanCount count, bool clear, void* src) int IO::ensure_io (ChanCount count, bool clear, void* src) { +#ifndef PLATFORM_WINDOWS assert (!AudioEngine::instance()->process_lock().trylock()); +#endif return ensure_ports (count, clear, src); } @@ -1373,20 +1380,20 @@ IO::build_legal_port_name (DataType type) limit = name_size - AudioEngine::instance()->my_name().length() - (suffix.length() + 5); - char buf1[name_size+1]; - char buf2[name_size+1]; + std::vector<char> buf1(name_size+1); + std::vector<char> buf2(name_size+1); /* colons are illegal in port names, so fix that */ string nom = _name.val(); replace_all (nom, ":", ";"); - snprintf (buf1, name_size+1, ("%.*s/%s"), limit, nom.c_str(), suffix.c_str()); + snprintf (&buf1[0], name_size+1, ("%.*s/%s"), limit, nom.c_str(), suffix.c_str()); - int port_number = find_port_hole (buf1); - snprintf (buf2, name_size+1, "%s %d", buf1, port_number); + int port_number = find_port_hole (&buf1[0]); + snprintf (&buf2[0], name_size+1, "%s %d", &buf1[0], port_number); - return string (buf2); + return string (&buf2[0]); } int32_t @@ -1404,14 +1411,13 @@ IO::find_port_hole (const char* base) */ for (n = 1; n < 9999; ++n) { - size_t size = AudioEngine::instance()->port_name_size() + 1; - char buf[size]; + std::vector<char> buf (AudioEngine::instance()->port_name_size()); PortSet::iterator i = _ports.begin(); - snprintf (buf, size, _("%s %u"), base, n); + snprintf (&buf[0], buf.size()+1, _("%s %u"), base, n); for ( ; i != _ports.end(); ++i) { - if (i->name() == buf) { + if (string(i->name()) == string(&buf[0])) { break; } } diff --git a/libs/ardour/ladspa_plugin.cc b/libs/ardour/ladspa_plugin.cc index bc3a83799b..8b089929b5 100644 --- a/libs/ardour/ladspa_plugin.cc +++ b/libs/ardour/ladspa_plugin.cc @@ -17,6 +17,10 @@ */ +#ifdef WAF_BUILD +#include "libardour-config.h" +#endif + #include <inttypes.h> #include <vector> @@ -25,11 +29,15 @@ #include <cstdlib> #include <cstdio> // so libraptor doesn't complain #include <cmath> +#ifndef COMPILER_MSVC #include <dirent.h> +#endif #include <sys/stat.h> #include <cerrno> +#ifdef HAVE_LRDF #include <lrdf.h> +#endif #include "pbd/compose.h" #include "pbd/error.h" @@ -50,16 +58,16 @@ using namespace std; using namespace ARDOUR; using namespace PBD; -LadspaPlugin::LadspaPlugin (void *mod, AudioEngine& e, Session& session, uint32_t index, framecnt_t rate) +LadspaPlugin::LadspaPlugin (string module_path, AudioEngine& e, Session& session, uint32_t index, framecnt_t rate) : Plugin (e, session) { - init (mod, index, rate); + init (module_path, index, rate); } LadspaPlugin::LadspaPlugin (const LadspaPlugin &other) : Plugin (other) { - init (other._module, other._index, other._sample_rate); + init (other._module_path, other._index, other._sample_rate); for (uint32_t i = 0; i < parameter_count(); ++i) { _control_data[i] = other._shadow_data[i]; @@ -68,25 +76,32 @@ LadspaPlugin::LadspaPlugin (const LadspaPlugin &other) } void -LadspaPlugin::init (void *mod, uint32_t index, framecnt_t rate) +LadspaPlugin::init (string module_path, uint32_t index, framecnt_t rate) { + void* func; LADSPA_Descriptor_Function dfunc; uint32_t i, port_cnt; - const char *errstr; - _module = mod; + _module_path = module_path; + _module = new Glib::Module(_module_path); _control_data = 0; _shadow_data = 0; _latency_control_port = 0; _was_activated = false; - dfunc = (LADSPA_Descriptor_Function) dlsym (_module, "ladspa_descriptor"); + if (!(*_module)) { + error << _("LADSPA: Unable to open module: ") << Glib::Module::get_last_error() << endmsg; + delete _module; + throw failed_constructor(); + } - if ((errstr = dlerror()) != NULL) { + if (!_module->get_symbol("ladspa_descriptor", func)) { error << _("LADSPA: module has no descriptor function.") << endmsg; throw failed_constructor(); } + dfunc = (LADSPA_Descriptor_Function)func; + if ((_descriptor = dfunc (index)) == 0) { error << _("LADSPA: plugin has gone away since discovery!") << endmsg; throw failed_constructor(); @@ -142,9 +157,8 @@ LadspaPlugin::~LadspaPlugin () deactivate (); cleanup (); - /* XXX who should close a plugin? */ - - // dlclose (module); + // glib has internal reference counting on modules so this is ok + delete _module; delete [] _control_data; delete [] _shadow_data; @@ -629,10 +643,11 @@ LadspaPlugin::print_parameter (uint32_t param, char *buf, uint32_t len) const boost::shared_ptr<Plugin::ScalePoints> LadspaPlugin::get_scale_points(uint32_t port_index) const { + boost::shared_ptr<Plugin::ScalePoints> ret; +#ifdef HAVE_LRDF const uint32_t id = atol(unique_id().c_str()); lrdf_defaults* points = lrdf_get_scale_values(id, port_index); - boost::shared_ptr<Plugin::ScalePoints> ret; if (!points) { return ret; } @@ -645,6 +660,7 @@ LadspaPlugin::get_scale_points(uint32_t port_index) const } lrdf_free_setting_values(points); +#endif return ret; } @@ -710,17 +726,7 @@ PluginPtr LadspaPluginInfo::load (Session& session) { try { - PluginPtr plugin; - void *module; - - if ((module = dlopen (path.c_str(), RTLD_NOW)) == 0) { - error << string_compose(_("LADSPA: cannot load module from \"%1\""), path) << endmsg; - error << dlerror() << endmsg; - return PluginPtr ((Plugin*) 0); - } else { - plugin.reset (new LadspaPlugin (module, session.engine(), session, index, session.frame_rate())); - } - + PluginPtr plugin (new LadspaPlugin (path, session.engine(), session, index, session.frame_rate())); plugin->set_info(PluginInfoPtr(new LadspaPluginInfo(*this))); return plugin; } @@ -739,6 +745,7 @@ LadspaPluginInfo::LadspaPluginInfo() void LadspaPlugin::find_presets () { +#ifdef HAVE_LRDF uint32_t id; std::string unique (unique_id()); @@ -759,12 +766,14 @@ LadspaPlugin::find_presets () } lrdf_free_uris(set_uris); } +#endif } bool LadspaPlugin::load_preset (PresetRecord r) { +#ifdef HAVE_LRDF lrdf_defaults* defs = lrdf_get_setting_values (r.uri.c_str()); if (defs) { @@ -777,6 +786,7 @@ LadspaPlugin::load_preset (PresetRecord r) } Plugin::load_preset (r); +#endif return true; } @@ -784,6 +794,7 @@ LadspaPlugin::load_preset (PresetRecord r) static void lrdf_remove_preset (const char* /*source*/, const char *setting_uri) { +#ifdef HAVE_LRDF lrdf_statement p; lrdf_statement *q; lrdf_statement *i; @@ -817,11 +828,13 @@ lrdf_remove_preset (const char* /*source*/, const char *setting_uri) p.predicate = NULL; p.object = NULL; lrdf_remove_matches (&p); +#endif } void LadspaPlugin::do_remove_preset (string name) { +#ifdef HAVE_LRDF string const envvar = preset_envvar (); if (envvar.empty()) { warning << _("Could not locate HOME. Preset not removed.") << endmsg; @@ -837,6 +850,7 @@ LadspaPlugin::do_remove_preset (string name) lrdf_remove_preset (source.c_str(), p->uri.c_str ()); write_preset_file (envvar); +#endif } string @@ -859,6 +873,7 @@ LadspaPlugin::preset_source (string envvar) const bool LadspaPlugin::write_preset_file (string envvar) { +#ifdef HAVE_LRDF string path = string_compose("%1/.ladspa", envvar); if (g_mkdir_with_parents (path.c_str(), 0775)) { warning << string_compose(_("Could not create %1. Preset not saved. (%2)"), path, strerror(errno)) << endmsg; @@ -879,11 +894,15 @@ LadspaPlugin::write_preset_file (string envvar) } return true; +#else + return false; +#endif } string LadspaPlugin::do_save_preset (string name) { +#ifdef HAVE_LRDF /* make a vector of pids that are input parameters */ vector<int> input_parameter_pids; for (uint32_t i = 0; i < parameter_count(); ++i) { @@ -902,8 +921,8 @@ LadspaPlugin::do_save_preset (string name) lrdf_defaults defaults; defaults.count = input_parameter_pids.size (); - lrdf_portvalue portvalues[input_parameter_pids.size()]; - defaults.items = portvalues; + std::vector<lrdf_portvalue> portvalues(input_parameter_pids.size()); + defaults.items = &portvalues[0]; for (vector<int>::size_type i = 0; i < input_parameter_pids.size(); ++i) { portvalues[i].pid = input_parameter_pids[i]; @@ -927,6 +946,9 @@ LadspaPlugin::do_save_preset (string name) } return uri; +#else + return string(); +#endif } LADSPA_PortDescriptor diff --git a/libs/ardour/linux_vst_info_file.cc b/libs/ardour/linux_vst_info_file.cc deleted file mode 100644 index 581bcca87f..0000000000 --- a/libs/ardour/linux_vst_info_file.cc +++ /dev/null @@ -1,427 +0,0 @@ -/* - Copyright (C) 2012 Paul Davis - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -*/ - -/** @file libs/ardour/vst_info_file.cc - * @brief Code to manage info files containing cached information about a plugin. - * e.g. its name, creator etc. - */ - -#include <iostream> -#include <cassert> - -#include <sys/types.h> -#include <sys/stat.h> -#include <unistd.h> -#include <errno.h> - -#include <stdlib.h> -#include <stddef.h> -#include <stdio.h> -#include <string.h> -#include <libgen.h> - -#include <glib.h> -#include <glib/gstdio.h> -#include <glibmm.h> - -#include "pbd/error.h" - -#include "ardour/linux_vst_support.h" - -#define MAX_STRING_LEN 256 - -using namespace std; - -static char * -read_string (FILE *fp) -{ - char buf[MAX_STRING_LEN]; - - if (!fgets (buf, MAX_STRING_LEN, fp)) { - return 0; - } - - if (strlen(buf) < MAX_STRING_LEN) { - if (strlen (buf)) { - buf[strlen(buf)-1] = 0; - } - return strdup (buf); - } else { - return 0; - } -} - -/** Read an integer value from a line in fp into n, - * @return true on failure, false on success. - */ -static bool -read_int (FILE* fp, int* n) -{ - char buf[MAX_STRING_LEN]; - - char* p = fgets (buf, MAX_STRING_LEN, fp); - if (p == 0) { - return true; - } - - return (sscanf (p, "%d", n) != 1); -} - -static VSTInfo * -load_vstfx_info_file (FILE* fp) -{ - VSTInfo *info; - - if ((info = (VSTInfo*) malloc (sizeof (VSTInfo))) == 0) { - return 0; - } - - if ((info->name = read_string(fp)) == 0) goto error; - if ((info->creator = read_string(fp)) == 0) goto error; - if (read_int (fp, &info->UniqueID)) goto error; - if ((info->Category = read_string(fp)) == 0) goto error; - if (read_int (fp, &info->numInputs)) goto error; - if (read_int (fp, &info->numOutputs)) goto error; - if (read_int (fp, &info->numParams)) goto error; - if (read_int (fp, &info->wantMidi)) goto error; - if (read_int (fp, &info->hasEditor)) goto error; - if (read_int (fp, &info->canProcessReplacing)) goto error; - - if ((info->ParamNames = (char **) malloc(sizeof(char*)*info->numParams)) == 0) { - goto error; - } - - for (int i = 0; i < info->numParams; ++i) { - if ((info->ParamNames[i] = read_string(fp)) == 0) goto error; - } - - if ((info->ParamLabels = (char **) malloc(sizeof(char*)*info->numParams)) == 0) { - goto error; - } - - for (int i = 0; i < info->numParams; ++i) { - if ((info->ParamLabels[i] = read_string(fp)) == 0) goto error; - } - - return info; - - error: - free (info); - return 0; -} - -static int -save_vstfx_info_file (VSTInfo *info, FILE* fp) -{ - assert (info); - assert (fp); - - fprintf (fp, "%s\n", info->name); - fprintf (fp, "%s\n", info->creator); - fprintf (fp, "%d\n", info->UniqueID); - fprintf (fp, "%s\n", info->Category); - fprintf (fp, "%d\n", info->numInputs); - fprintf (fp, "%d\n", info->numOutputs); - fprintf (fp, "%d\n", info->numParams); - fprintf (fp, "%d\n", info->wantMidi); - fprintf (fp, "%d\n", info->hasEditor); - fprintf (fp, "%d\n", info->canProcessReplacing); - - for (int i = 0; i < info->numParams; i++) { - fprintf (fp, "%s\n", info->ParamNames[i]); - } - - for (int i = 0; i < info->numParams; i++) { - fprintf (fp, "%s\n", info->ParamLabels[i]); - } - - return 0; -} - -static string -vstfx_infofile_path (char* dllpath, int personal) -{ - string dir; - if (personal) { - dir = Glib::build_filename (Glib::get_home_dir (), ".fst"); - - /* If the directory doesn't exist, try to create it */ - if (!Glib::file_test (dir, Glib::FILE_TEST_IS_DIR)) { - if (g_mkdir (dir.c_str (), 0700)) { - return 0; - } - } - - } else { - dir = Glib::path_get_dirname (std::string(dllpath)); - } - - stringstream s; - s << "." << Glib::path_get_basename (dllpath) << ".fsi"; - return Glib::build_filename (dir, s.str ()); -} - -static char * -vstfx_infofile_stat (char *dllpath, struct stat* statbuf, int personal) -{ - if (strstr (dllpath, ".so" ) == 0) { - return 0; - } - - string const path = vstfx_infofile_path (dllpath, personal); - - if (Glib::file_test (path, Glib::FileTest (Glib::FILE_TEST_EXISTS | Glib::FILE_TEST_IS_REGULAR))) { - - /* info file exists in same location as the shared object, so - check if its current and up to date - */ - - - struct stat dllstat; - - if (stat (dllpath, &dllstat) == 0) { - if (stat (path.c_str(), statbuf) == 0) { - if (dllstat.st_mtime <= statbuf->st_mtime) { - /* plugin is older than info file */ - return strdup (path.c_str ()); - } - } - } - } - - return 0; -} - - -static FILE * -vstfx_infofile_for_read (char* dllpath) -{ - struct stat own_statbuf; - struct stat sys_statbuf; - FILE *rv = NULL; - - char* own_info = vstfx_infofile_stat (dllpath, &own_statbuf, 1); - char* sys_info = vstfx_infofile_stat (dllpath, &sys_statbuf, 0); - - if (own_info) { - if (sys_info) { - if (own_statbuf.st_mtime <= sys_statbuf.st_mtime) { - /* system info file is newer, use it */ - rv = g_fopen (sys_info, "rb"); - } - } else { - rv = g_fopen (own_info, "rb"); - } - } - free(own_info); - free(sys_info); - - return rv; -} - -static FILE * -vstfx_infofile_create (char* dllpath, int personal) -{ - if (strstr (dllpath, ".so" ) == 0) { - return 0; - } - - string const path = vstfx_infofile_path (dllpath, personal); - return fopen (path.c_str(), "w"); -} - -static FILE * -vstfx_infofile_for_write (char* dllpath) -{ - FILE* f; - - if ((f = vstfx_infofile_create (dllpath, 0)) == 0) { - f = vstfx_infofile_create (dllpath, 1); - } - - return f; -} - -static -int vstfx_can_midi (VSTState* vstfx) -{ - AEffect* plugin = vstfx->plugin; - - int const vst_version = plugin->dispatcher (plugin, effGetVstVersion, 0, 0, 0, 0.0f); - - if (vst_version >= 2) { - /* should we send it VST events (i.e. MIDI) */ - - if ((plugin->flags & effFlagsIsSynth) || (plugin->dispatcher (plugin, effCanDo, 0, 0,(void*) "receiveVstEvents", 0.0f) > 0)) { - return -1; - } - } - - return false; -} - -static VSTInfo * -vstfx_info_from_plugin (VSTState* vstfx) -{ - assert (vstfx); - - VSTInfo* info = (VSTInfo*) malloc (sizeof (VSTInfo)); - if (!info) { - return 0; - } - - /*We need to init the creator because some plugins - fail to implement getVendorString, and so won't stuff the - string with any name*/ - - char creator[65] = "Unknown\0"; - - AEffect* plugin = vstfx->plugin; - - info->name = strdup (vstfx->handle->name); - - /*If the plugin doesn't bother to implement GetVendorString we will - have pre-stuffed the string with 'Unkown' */ - - plugin->dispatcher (plugin, effGetVendorString, 0, 0, creator, 0); - - /*Some plugins DO implement GetVendorString, but DON'T put a name in it - so if its just a zero length string we replace it with 'Unknown' */ - - if (strlen(creator) == 0) { - info->creator = strdup ("Unknown"); - } else { - info->creator = strdup (creator); - } - - info->UniqueID = plugin->uniqueID; - - info->Category = strdup("None"); /* XXX */ - info->numInputs = plugin->numInputs; - info->numOutputs = plugin->numOutputs; - info->numParams = plugin->numParams; - info->wantMidi = vstfx_can_midi(vstfx); - info->hasEditor = plugin->flags & effFlagsHasEditor ? true : false; - info->canProcessReplacing = plugin->flags & effFlagsCanReplacing ? true : false; - info->ParamNames = (char **) malloc(sizeof(char*)*info->numParams); - info->ParamLabels = (char **) malloc(sizeof(char*)*info->numParams); - - for (int i = 0; i < info->numParams; ++i) { - char name[64]; - char label[64]; - - /* Not all plugins give parameters labels as well as names */ - - strcpy (name, "No Name"); - strcpy (label, "No Label"); - - plugin->dispatcher (plugin, effGetParamName, i, 0, name, 0); - info->ParamNames[i] = strdup(name); - - //NOTE: 'effGetParamLabel' is no longer defined in vestige headers - //plugin->dispatcher (plugin, effGetParamLabel, i, 0, label, 0); - info->ParamLabels[i] = strdup(label); - } - return info; -} - -/* A simple 'dummy' audiomaster callback which should be ok, - we will only be instantiating the plugin in order to get its info -*/ - -static intptr_t -simple_master_callback (AEffect *, int32_t opcode, int32_t, intptr_t, void *, float) -{ - if (opcode == audioMasterVersion) { - return 2; - } else { - return 0; - } -} - -/** Try to get plugin info - first by looking for a .fsi cache of the - data, and if that doesn't exist, load the plugin, get its data and - then cache it for future ref -*/ - -VSTInfo * -vstfx_get_info (char* dllpath) -{ - FILE* infofile; - VSTHandle* h; - VSTState* vstfx; - - if ((infofile = vstfx_infofile_for_read (dllpath)) != 0) { - VSTInfo *info; - info = load_vstfx_info_file (infofile); - fclose (infofile); - if (info == 0) { - PBD::warning << "Cannot get LinuxVST information form " << dllpath << ": info file load failed." << endmsg; - } - return info; - } - - if (!(h = vstfx_load(dllpath))) { - PBD::warning << "Cannot get LinuxVST information from " << dllpath << ": load failed." << endmsg; - return 0; - } - - if (!(vstfx = vstfx_instantiate(h, simple_master_callback, 0))) { - vstfx_unload(h); - PBD::warning << "Cannot get LinuxVST information from " << dllpath << ": instantiation failed." << endmsg; - return 0; - } - - infofile = vstfx_infofile_for_write (dllpath); - - if (!infofile) { - vstfx_close(vstfx); - vstfx_unload(h); - PBD::warning << "Cannot get LinuxVST information from " << dllpath << ": cannot create new FST info file." << endmsg; - return 0; - } - - VSTInfo* info = vstfx_info_from_plugin (vstfx); - - save_vstfx_info_file (info, infofile); - fclose (infofile); - - vstfx_close (vstfx); - vstfx_unload (h); - - return info; -} - -void -vstfx_free_info (VSTInfo *info) -{ - for (int i = 0; i < info->numParams; i++) { - free (info->ParamNames[i]); - free (info->ParamLabels[i]); - } - - free (info->name); - free (info->creator); - free (info->Category); - free (info->ParamNames); - free (info->ParamLabels); - free (info); -} - - diff --git a/libs/ardour/linux_vst_support.cc b/libs/ardour/linux_vst_support.cc index 9d36905f48..bd1ed0d27e 100644 --- a/libs/ardour/linux_vst_support.cc +++ b/libs/ardour/linux_vst_support.cc @@ -112,7 +112,7 @@ vstfx_new () void* vstfx_load_vst_library(const char* path) { void* dll; - char* full_path; + char* full_path = NULL; char* envdup; char* lxvst_path; size_t len1; @@ -152,14 +152,15 @@ void* vstfx_load_vst_library(const char* path) len2 = strlen(path); /*Try all the possibilities in the path - deliminated by : */ - - lxvst_path = strtok (envdup, ":"); + char *saveptr; + lxvst_path = strtok_r (envdup, ":", &saveptr); while (lxvst_path != 0) { vstfx_error ("\"%s\"", lxvst_path); len1 = strlen(lxvst_path); + if (full_path) free(full_path); full_path = (char*)malloc(len1 + 1 + len2 + 1); memcpy(full_path, lxvst_path, len1); full_path[len1] = '/'; @@ -176,11 +177,11 @@ void* vstfx_load_vst_library(const char* path) /*Try again*/ - lxvst_path = strtok (0, ":"); + lxvst_path = strtok_r (0, ":", &saveptr); } /*Free the path*/ - + if (full_path) free(full_path); free(envdup); return dll; @@ -209,8 +210,6 @@ vstfx_load (const char *path) buf = (char *)malloc(strlen(path) + 4); //The .so and a terminating zero sprintf (buf, "%s.so", path); - - fhandle->nameptr = strdup (path); } else @@ -218,8 +217,6 @@ vstfx_load (const char *path) /*We already have .so appened to the filename*/ buf = strdup(path); - - fhandle->nameptr = strdup (path); } /* get a name for the plugin based on the path: ye old VST problem where @@ -227,7 +224,7 @@ vstfx_load (const char *path) which we don't want to do at this point */ - fhandle->name = strdup (PBD::basename_nosuffix (fhandle->nameptr).c_str()); + fhandle->name = strdup (PBD::basename_nosuffix (path).c_str()); /*call load_vstfx_library to actually load the .so into memory*/ @@ -289,9 +286,8 @@ vstfx_unload (VSTHandle* fhandle) fhandle->dll = 0; } - if (fhandle->nameptr) + if (fhandle->name) { - free (fhandle->nameptr); free (fhandle->name); } @@ -310,8 +306,9 @@ vstfx_instantiate (VSTHandle* fhandle, audioMasterCallback amc, void* userptr) if(fhandle == 0) { - vstfx_error( "** ERROR ** VSTFX : The handle was 0\n" ); - return 0; + vstfx_error( "** ERROR ** VSTFX : The handle was 0\n" ); + free (vstfx); + return 0; } if ((vstfx->plugin = fhandle->main_entry (amc)) == 0) diff --git a/libs/ardour/location.cc b/libs/ardour/location.cc index 2a27fc318a..eef94797e9 100644 --- a/libs/ardour/location.cc +++ b/libs/ardour/location.cc @@ -30,6 +30,7 @@ #include "pbd/enumwriter.h" #include "ardour/location.h" +#include "ardour/midi_scene_change.h" #include "ardour/session.h" #include "ardour/audiofilesource.h" #include "ardour/tempo.h" @@ -42,6 +43,8 @@ using namespace std; using namespace ARDOUR; using namespace PBD; +PBD::Signal0<void> Location::scene_changed; + Location::Location (Session& s) : SessionHandleRef (s) , _start (0) @@ -87,6 +90,8 @@ Location::Location (const Location& other) assert (_start >= 0); assert (_end >= 0); + + /* scene change is NOT COPIED */ } Location::Location (Session& s, const XMLNode& node) @@ -134,6 +139,8 @@ Location::operator= (const Location& other) _bbt_end = other._bbt_end; _flags = other._flags; _position_lock_style = other._position_lock_style; + + /* XXX need to copy scene change */ /* copy is not locked even if original was */ @@ -181,6 +188,14 @@ Location::set_start (framepos_t s, bool force, bool allow_bbt_recompute) end_changed (this); /* EMIT SIGNAL */ } + /* moving the start (position) of a marker with a scene change + requires an update in the Scene Changer. + */ + + if (_scene_change) { + scene_changed (); /* EMIT SIGNAL */ + } + assert (_start >= 0); assert (_end >= 0); @@ -196,6 +211,7 @@ Location::set_start (framepos_t s, bool force, bool allow_bbt_recompute) recompute_bbt_from_frames (); } start_changed (this); /* EMIT SIGNAL */ + if (is_session_range ()) { Session::StartTimeChanged (old); /* EMIT SIGNAL */ AudioFileSource::set_header_position_offset (s); @@ -431,11 +447,15 @@ Location::get_state () node->add_property ("locked", (_locked ? "yes" : "no")); node->add_property ("position-lock-style", enum_2_string (_position_lock_style)); + if (_scene_change) { + node->add_child_nocopy (_scene_change->get_state()); + } + return *node; } int -Location::set_state (const XMLNode& node, int /*version*/) +Location::set_state (const XMLNode& node, int version) { const XMLProperty *prop; @@ -521,6 +541,12 @@ Location::set_state (const XMLNode& node, int /*version*/) _position_lock_style = PositionLockStyle (string_2_enum (prop->value(), _position_lock_style)); } + XMLNode* scene_child = find_named_node (node, SceneChange::xml_node_name); + + if (scene_child) { + _scene_change = SceneChange::factory (*scene_child, version); + } + recompute_bbt_from_frames (); changed (this); /* EMIT SIGNAL */ @@ -581,6 +607,14 @@ Location::unlock () LockChanged (this); } +void +Location::set_scene_change (boost::shared_ptr<SceneChange> sc) +{ + _scene_change = sc; + + scene_changed (); /* EMIT SIGNAL */ +} + /*---------------------------------------------------------------------- */ Locations::Locations (Session& s) @@ -675,6 +709,7 @@ Locations::clear () ++tmp; if (!(*i)->is_session_range()) { + delete *i; locations.erase (i); } @@ -700,6 +735,7 @@ Locations::clear_markers () ++tmp; if ((*i)->is_mark() && !(*i)->is_session_range()) { + delete *i; locations.erase (i); } @@ -723,6 +759,7 @@ Locations::clear_ranges () ++tmp; if (!(*i)->is_mark()) { + delete *i; locations.erase (i); } @@ -779,6 +816,7 @@ Locations::remove (Location *loc) for (i = locations.begin(); i != locations.end(); ++i) { if ((*i) == loc) { + delete *i; locations.erase (i); was_removed = true; if (current_location == loc) { @@ -972,6 +1010,44 @@ Locations::first_mark_before (framepos_t frame, bool include_special_ranges) return -1; } +Location* +Locations::mark_at (framepos_t pos, framecnt_t slop) const +{ + Glib::Threads::Mutex::Lock lm (lock); + Location* closest = 0; + frameoffset_t mindelta = max_framepos; + frameoffset_t delta; + + /* locations are not necessarily stored in linear time order so we have + * to iterate across all of them to find the one closest to a give point. + */ + + for (LocationList::const_iterator i = locations.begin(); i != locations.end(); ++i) { + + if ((*i)->is_mark()) { + if (pos > (*i)->start()) { + delta = pos - (*i)->start(); + } else { + delta = (*i)->start() - pos; + } + + if (slop == 0 && delta == 0) { + /* special case: no slop, and direct hit for position */ + return *i; + } + + if (delta <= slop) { + if (delta < mindelta) { + closest = *i; + mindelta = delta; + } + } + } + } + + return closest; +} + framepos_t Locations::first_mark_after (framepos_t frame, bool include_special_ranges) { @@ -1146,3 +1222,4 @@ Locations::find_all_between (framepos_t start, framepos_t end, LocationList& ll, } } } + diff --git a/libs/ardour/ltc_slave.cc b/libs/ardour/ltc_slave.cc index bdb4fbead9..8d570aeeb8 100644 --- a/libs/ardour/ltc_slave.cc +++ b/libs/ardour/ltc_slave.cc @@ -19,11 +19,11 @@ */ #include <iostream> #include <errno.h> -#include <poll.h> #include <sys/types.h> #include <unistd.h> #include "pbd/error.h" +#include "pbd/pthread_utils.h" #include "ardour/debug.h" #include "ardour/slave.h" @@ -150,7 +150,7 @@ LTC_Slave::reset() } void -LTC_Slave::parse_ltc(const pframes_t nframes, const Sample* const in, const framecnt_t posinfo) +LTC_Slave::parse_ltc(const ARDOUR::pframes_t nframes, const Sample* const in, const ARDOUR::framecnt_t posinfo) { pframes_t i; unsigned char sound[8192]; @@ -432,7 +432,7 @@ LTC_Slave::speed_and_position (double& speed, framepos_t& pos) frameoffset_t skip = now - (monotonic_cnt + nframes); monotonic_cnt = now; - DEBUG_TRACE (DEBUG::LTC, string_compose ("speed_and_position - TID:%1 | latency: %2 | skip %3\n", ::pthread_self(), ltc_slave_latency.max, skip)); + DEBUG_TRACE (DEBUG::LTC, string_compose ("speed_and_position - TID:%1 | latency: %2 | skip %3\n", pthread_name(), ltc_slave_latency.max, skip)); if (last_timestamp == 0) { engine_dll_initstate = 0; @@ -588,10 +588,10 @@ LTC_Slave::approximate_current_delta() const if (last_timestamp == 0 || engine_dll_initstate == 0) { snprintf(delta, sizeof(delta), "\u2012\u2012\u2012\u2012"); } else if ((monotonic_cnt - last_timestamp) > 2 * frames_per_ltc_frame) { - snprintf(delta, sizeof(delta), _("flywheel")); + snprintf(delta, sizeof(delta), "%s", _("flywheel")); } else { - snprintf(delta, sizeof(delta), "\u0394<span foreground=\"green\" face=\"monospace\" >%s%s%" PRIi64 "</span>sm", - LEADINGZERO(abs(current_delta)), PLUSMINUS(-current_delta), abs(current_delta)); + snprintf(delta, sizeof(delta), "\u0394<span foreground=\"green\" face=\"monospace\" >%s%s%lld</span>sm", + LEADINGZERO(llabs(current_delta)), PLUSMINUS(-current_delta), llabs(current_delta)); } return std::string(delta); } diff --git a/libs/ardour/lv2_evbuf.c b/libs/ardour/lv2_evbuf.c index f0e62d9b65..2802ab8c81 100644 --- a/libs/ardour/lv2_evbuf.c +++ b/libs/ardour/lv2_evbuf.c @@ -219,7 +219,7 @@ lv2_evbuf_get(LV2_Evbuf_Iterator iter, *subframes = 0; *type = aev->body.type; *size = aev->body.size; - *data = LV2_ATOM_BODY(&aev->body); + *data = (uint8_t*)LV2_ATOM_BODY(&aev->body); break; } diff --git a/libs/ardour/lv2_plugin.cc b/libs/ardour/lv2_plugin.cc index 204ae2c694..1bdb2f20d6 100644 --- a/libs/ardour/lv2_plugin.cc +++ b/libs/ardour/lv2_plugin.cc @@ -25,14 +25,14 @@ #include <cstdlib> #include <cstring> -#include <giomm/file.h> +#include <glib/gstdio.h> #include <glib/gprintf.h> #include <glibmm.h> #include <boost/utility.hpp> -#include "pbd/clear_dir.h" -#include "pbd/pathscanner.h" +#include "pbd/file_utils.h" +#include "pbd/stl_delete.h" #include "pbd/compose.h" #include "pbd/error.h" #include "pbd/xml++.h" @@ -48,7 +48,7 @@ #include "ardour/types.h" #include "ardour/utils.h" #include "ardour/worker.h" -#include "ardour/lv2_bundled_search_path.h" +#include "ardour/search_paths.h" #include "i18n.h" #include <locale.h> @@ -1094,7 +1094,7 @@ LV2Plugin::do_remove_preset(string name) name + ".ttl" ) ); - unlink(preset_file.c_str()); + ::g_unlink(preset_file.c_str()); } bool @@ -1122,16 +1122,16 @@ LV2Plugin::write_to(RingBuffer<uint8_t>* dest, uint32_t size, const uint8_t* body) { - const uint32_t buf_size = sizeof(UIMessage) + size; - uint8_t buf[buf_size]; + const uint32_t buf_size = sizeof(UIMessage) + size; + vector<uint8_t> buf(buf_size); - UIMessage* msg = (UIMessage*)buf; + UIMessage* msg = (UIMessage*)&buf[0]; msg->index = index; msg->protocol = protocol; msg->size = size; memcpy(msg + 1, body, size); - return (dest->write(buf, buf_size) == buf_size); + return (dest->write(&buf[0], buf_size) == buf_size); } bool @@ -1210,13 +1210,13 @@ LV2Plugin::emit_to_ui(void* controller, UIMessageSink sink) error << "Error reading from Plugin=>UI RingBuffer" << endmsg; break; } - uint8_t body[msg.size]; - if (_to_ui->read(body, msg.size) != msg.size) { + vector<uint8_t> body(msg.size); + if (_to_ui->read(&body[0], msg.size) != msg.size) { error << "Error reading from Plugin=>UI RingBuffer" << endmsg; break; } - sink(controller, msg.index, msg.size, msg.protocol, body); + sink(controller, msg.index, msg.size, msg.protocol, &body[0]); read_space -= sizeof(msg) + msg.size; } @@ -1699,15 +1699,15 @@ LV2Plugin::connect_and_run(BufferSet& bufs, error << "Error reading from UI=>Plugin RingBuffer" << endmsg; break; } - uint8_t body[msg.size]; - if (_from_ui->read(body, msg.size) != msg.size) { + vector<uint8_t> body(msg.size); + if (_from_ui->read(&body[0], msg.size) != msg.size) { error << "Error reading from UI=>Plugin RingBuffer" << endmsg; break; } if (msg.protocol == urids.atom_eventTransfer) { LV2_Evbuf* buf = _ev_buffers[msg.index]; LV2_Evbuf_Iterator i = lv2_evbuf_end(buf); - const LV2_Atom* const atom = (const LV2_Atom*)body; + const LV2_Atom* const atom = (const LV2_Atom*)&body[0]; if (!lv2_evbuf_write(&i, nframes, 0, atom->type, atom->size, (const uint8_t*)(atom + 1))) { error << "Failed to write data to LV2 event buffer\n"; @@ -2013,21 +2013,19 @@ LV2World::load_bundled_plugins() { if (!_bundle_checked) { cout << "Scanning folders for bundled LV2s: " << ARDOUR::lv2_bundled_search_path().to_string() << endl; - PathScanner scanner; - vector<string *> *plugin_objects = scanner (ARDOUR::lv2_bundled_search_path().to_string(), lv2_filter, 0, true, true); - if (plugin_objects) { - for ( vector<string *>::iterator x = plugin_objects->begin(); x != plugin_objects->end (); ++x) { -#ifdef WINDOWS - string uri = "file:///" + **x + "/"; + + vector<string> plugin_objects; + find_paths_matching_filter (plugin_objects, ARDOUR::lv2_bundled_search_path(), lv2_filter, 0, true, true, true); + for ( vector<string>::iterator x = plugin_objects.begin(); x != plugin_objects.end (); ++x) { +#ifdef PLATFORM_WINDOWS + 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; } @@ -2069,7 +2067,9 @@ LV2PluginInfo::discover() PluginInfoList* plugs = new PluginInfoList; const LilvPlugins* plugins = lilv_world_get_all_plugins(_world.world); - info << "LV2: Discovering " << lilv_plugins_size(plugins) << " plugins" << endmsg; + if (!Config->get_show_plugin_scan_window()) { + info << "LV2: Discovering " << lilv_plugins_size(plugins) << " plugins" << endmsg; + } LILV_FOREACH(plugins, i, plugins) { const LilvPlugin* p = lilv_plugins_get(plugins, i); @@ -2087,6 +2087,7 @@ LV2PluginInfo::discover() info->name = string(lilv_node_as_string(name)); lilv_node_free(name); + ARDOUR::PluginScanMessage(_("LV2"), info->name, false); const LilvPluginClass* pclass = lilv_plugin_get_class(p); const LilvNode* label = lilv_plugin_class_get_label(pclass); diff --git a/libs/ardour/lxvst_plugin.cc b/libs/ardour/lxvst_plugin.cc index 6e30e0c443..c3074d65ad 100644 --- a/libs/ardour/lxvst_plugin.cc +++ b/libs/ardour/lxvst_plugin.cc @@ -27,14 +27,16 @@ using namespace std; using namespace ARDOUR; using namespace PBD; -LXVSTPlugin::LXVSTPlugin (AudioEngine& e, Session& session, VSTHandle* h) +LXVSTPlugin::LXVSTPlugin (AudioEngine& e, Session& session, VSTHandle* h, int unique_id) : VSTPlugin (e, session, h) { /* Instantiate the plugin and return a VSTState* */ + Session::vst_current_loading_id = unique_id; if ((_state = vstfx_instantiate (_handle, Session::vst_callback, this)) == 0) { throw failed_constructor(); } + Session::vst_current_loading_id = 0; set_plugin (_state->plugin); } @@ -44,9 +46,12 @@ LXVSTPlugin::LXVSTPlugin (const LXVSTPlugin &other) { _handle = other._handle; + Session::vst_current_loading_id = PBD::atoi(other.unique_id()); if ((_state = vstfx_instantiate (_handle, Session::vst_callback, this)) == 0) { throw failed_constructor(); } + Session::vst_current_loading_id = 0; + _plugin = _state->plugin; // Plugin::setup_controls (); @@ -72,7 +77,7 @@ LXVSTPluginInfo::load (Session& session) error << string_compose(_("LXVST: cannot load module from \"%1\""), path) << endmsg; } else { - plugin.reset (new LXVSTPlugin (session.engine(), session, handle)); + plugin.reset (new LXVSTPlugin (session.engine(), session, handle, PBD::atoi(unique_id))); } } else { diff --git a/libs/ardour/meter.cc b/libs/ardour/meter.cc index ec736fef69..80690bd744 100644 --- a/libs/ardour/meter.cc +++ b/libs/ardour/meter.cc @@ -18,6 +18,7 @@ #include <algorithm> #include <cmath> +#include <limits> #include "pbd/compose.h" @@ -153,7 +154,7 @@ void PeakMeter::reset_max () { for (size_t i = 0; i < _max_peak_power.size(); ++i) { - _max_peak_power[i] = -INFINITY; + _max_peak_power[i] = -std::numeric_limits<float>::infinity(); _max_peak_signal[i] = 0; } @@ -163,7 +164,7 @@ PeakMeter::reset_max () if (n < n_midi) { _visible_peak_power[n] = 0; } else { - _visible_peak_power[n] = -INFINITY; + _visible_peak_power[n] = -std::numeric_limits<float>::infinity(); } } } @@ -302,7 +303,7 @@ PeakMeter::meter () _peak_signal[n] = 0; /* ... to here */ if (n < n_midi) { - _max_peak_power[n] = -INFINITY; // std::max (new_peak, _max_peak_power[n]); // XXX + _max_peak_power[n] = -std::numeric_limits<float>::infinity(); // std::max (new_peak, _max_peak_power[n]); // XXX _max_peak_signal[n] = 0; if (midi_meter_falloff == 0.0f || new_peak > _visible_peak_power[n]) { ; @@ -336,7 +337,7 @@ PeakMeter::meter () } else { // do falloff new_peak = _visible_peak_power[n] - (audio_meter_falloff); - _visible_peak_power[n] = std::max (new_peak, -INFINITY); + _visible_peak_power[n] = std::max (new_peak, -std::numeric_limits<float>::infinity()); } } } diff --git a/libs/ardour/midi_buffer.cc b/libs/ardour/midi_buffer.cc index 1a6cb7fa26..4715be928c 100644 --- a/libs/ardour/midi_buffer.cc +++ b/libs/ardour/midi_buffer.cc @@ -199,6 +199,57 @@ MidiBuffer::push_back(TimeType time, size_t size, const uint8_t* data) return true; } +bool +MidiBuffer::insert_event(const Evoral::MIDIEvent<TimeType>& ev) +{ + if (size() == 0) { + return push_back(ev); + } + + const size_t stamp_size = sizeof(TimeType); + const size_t bytes_to_merge = stamp_size + ev.size(); + + if (_size + bytes_to_merge >= _capacity) { + cerr << "MidiBuffer::push_back failed (buffer is full)" << endl; + PBD::stacktrace (cerr, 20); + return false; + } + + TimeType t = ev.time(); + + ssize_t insert_offset = -1; + for (MidiBuffer::iterator m = begin(); m != end(); ++m) { + if ((*m).time() < t) { + continue; + } + if ((*m).time() == t) { + const uint8_t our_midi_status_byte = *(_data + m.offset + sizeof (TimeType)); + if (second_simultaneous_midi_byte_is_first (ev.type(), our_midi_status_byte)) { + continue; + } + } + insert_offset = m.offset; + break; + } + if (insert_offset == -1) { + return push_back(ev); + } + + // don't use memmove - it may use malloc(!) + // memmove (_data + insert_offset + bytes_to_merge, _data + insert_offset, _size - insert_offset); + for (ssize_t a = _size + bytes_to_merge - 1, b = _size - 1; b >= insert_offset; --b, --a) { + _data[a] = _data[b]; + } + + uint8_t* const write_loc = _data + insert_offset; + *((TimeType*)write_loc) = t; + memcpy(write_loc + stamp_size, ev.buffer(), ev.size()); + + _size += bytes_to_merge; + + return true; +} + /** Reserve space for a new event in the buffer. * * This call is for copying MIDI directly into the buffer, the data location diff --git a/libs/ardour/midi_clock_slave.cc b/libs/ardour/midi_clock_slave.cc index 762d94469c..8c95272fde 100644 --- a/libs/ardour/midi_clock_slave.cc +++ b/libs/ardour/midi_clock_slave.cc @@ -20,7 +20,6 @@ #include <cmath> #include <errno.h> -#include <poll.h> #include <sys/types.h> #include <unistd.h> #include "pbd/error.h" @@ -261,7 +260,7 @@ MIDIClock_Slave::stop (Parser& /*parser*/, framepos_t /*timestamp*/) } void -MIDIClock_Slave::position (Parser& /*parser*/, byte* message, size_t size) +MIDIClock_Slave::position (Parser& /*parser*/, MIDI::byte* message, size_t size) { // we are note supposed to get position messages while we are running // so lets be robust and ignore those @@ -270,8 +269,8 @@ MIDIClock_Slave::position (Parser& /*parser*/, byte* message, size_t size) } assert(size == 3); - byte lsb = message[1]; - byte msb = message[2]; + MIDI::byte lsb = message[1]; + MIDI::byte msb = message[2]; assert((lsb <= 0x7f) && (msb <= 0x7f)); uint16_t position_in_sixteenth_notes = (uint16_t(msb) << 7) | uint16_t(lsb); diff --git a/libs/ardour/midi_diskstream.cc b/libs/ardour/midi_diskstream.cc index 54b060299f..69eca996aa 100644 --- a/libs/ardour/midi_diskstream.cc +++ b/libs/ardour/midi_diskstream.cc @@ -26,11 +26,10 @@ #include <fcntl.h> #include <cstdlib> #include <ctime> -#include <strings.h> // for ffs(3) #include <sys/stat.h> -#include <sys/mman.h> #include "pbd/error.h" +#include "pbd/ffs.h" #include "pbd/basename.h" #include <glibmm/threads.h> #include "pbd/xml++.h" @@ -76,6 +75,7 @@ MidiDiskstream::MidiDiskstream (Session &sess, const string &name, Diskstream::F , _frames_read_from_ringbuffer(0) , _frames_pending_write(0) , _num_captured_loops(0) + , _accumulated_capture_offset(0) , _gui_feed_buffer(AudioEngine::instance()->raw_buffer_size (DataType::MIDI)) { in_set_state = true; @@ -100,6 +100,7 @@ MidiDiskstream::MidiDiskstream (Session& sess, const XMLNode& node) , _frames_read_from_ringbuffer(0) , _frames_pending_write(0) , _num_captured_loops(0) + , _accumulated_capture_offset(0) , _gui_feed_buffer(AudioEngine::instance()->raw_buffer_size (DataType::MIDI)) { in_set_state = true; @@ -137,6 +138,8 @@ MidiDiskstream::init () MidiDiskstream::~MidiDiskstream () { Glib::Threads::Mutex::Lock lm (state_lock); + delete _playback_buf; + delete _capture_buf; } @@ -363,6 +366,15 @@ MidiDiskstream::process (BufferSet& bufs, framepos_t transport_frame, pframes_t Evoral::OverlapType ot = Evoral::coverage (first_recordable_frame, last_recordable_frame, transport_frame, transport_frame + nframes); calculate_record_range(ot, transport_frame, nframes, rec_nframes, rec_offset); + /* For audio: not writing frames to the capture ringbuffer offsets + * the recording. For midi: we need to keep track of the record range + * and subtract the accumulated difference from the event time. + */ + if (rec_nframes) { + _accumulated_capture_offset += rec_offset; + } else { + _accumulated_capture_offset += nframes; + } if (rec_nframes && !was_recording) { if (loop_loc) { @@ -395,6 +407,9 @@ MidiDiskstream::process (BufferSet& bufs, framepos_t transport_frame, pframes_t for (MidiBuffer::iterator i = buf.begin(); i != buf.end(); ++i) { Evoral::MIDIEvent<MidiBuffer::TimeType> ev(*i, false); + if (ev.time() + rec_offset > rec_nframes) { + break; + } #ifndef NDEBUG if (DEBUG::MidiIO & PBD::debug_bits) { const uint8_t* __data = ev.buffer(); @@ -417,36 +432,39 @@ MidiDiskstream::process (BufferSet& bufs, framepos_t transport_frame, pframes_t any desirable behaviour. We don't want to send event with transport time here since that way the source can not reconstruct their actual time; future clever MIDI looping should - probabl be implemented in the source instead of here. + probably be implemented in the source instead of here. */ const framecnt_t loop_offset = _num_captured_loops * loop_length; - + const framepos_t event_time = transport_frame + loop_offset - _accumulated_capture_offset + ev.time(); + if (event_time < 0 || event_time < first_recordable_frame) { + continue; + } switch (mode) { case AllChannels: - _capture_buf->write(transport_frame + loop_offset + ev.time(), + _capture_buf->write(event_time, ev.type(), ev.size(), ev.buffer()); break; case FilterChannels: if (ev.is_channel_event()) { if ((1<<ev.channel()) & mask) { - _capture_buf->write(transport_frame + loop_offset + ev.time(), + _capture_buf->write(event_time, ev.type(), ev.size(), ev.buffer()); } } else { - _capture_buf->write(transport_frame + loop_offset + ev.time(), + _capture_buf->write(event_time, ev.type(), ev.size(), ev.buffer()); } break; case ForceChannel: if (ev.is_channel_event()) { - ev.set_channel (ffs(mask) - 1); + ev.set_channel (PBD::ffs(mask) - 1); } - _capture_buf->write(transport_frame + loop_offset + ev.time(), + _capture_buf->write(event_time, ev.type(), ev.size(), ev.buffer()); break; } } - g_atomic_int_add(const_cast<gint*> (&_frames_pending_write), nframes); + g_atomic_int_add(const_cast<gint*>(&_frames_pending_write), nframes); if (buf.size() != 0) { Glib::Threads::Mutex::Lock lm (_gui_feed_buffer_mutex, Glib::Threads::TRY_LOCK); @@ -473,6 +491,7 @@ MidiDiskstream::process (BufferSet& bufs, framepos_t transport_frame, pframes_t if (was_recording) { finish_capture (); } + _accumulated_capture_offset = 0; } @@ -808,7 +827,7 @@ MidiDiskstream::do_flush (RunContext /*context*/, bool force_flush) } /* if there are 2+ chunks of disk i/o possible for - this track, let the caller know so that it can arrange + this track), let the caller know so that it can arrange for us to be called again, ASAP. if we are forcing a flush, then if there is* any* extra @@ -973,6 +992,10 @@ MidiDiskstream::transport_stopped_wallclock (struct tm& /*when*/, time_t /*twhen RegionFactory::region_name (region_name, _write_source->name(), false); + DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 capture start @ %2 length %3 add new region %4\n", + _name, (*ci)->start, (*ci)->frames, region_name)); + + // cerr << _name << ": based on ci of " << (*ci)->start << " for " << (*ci)->frames << " add a region\n"; try { @@ -1195,11 +1218,12 @@ MidiDiskstream::use_new_write_source (uint32_t n) return 1; } + _accumulated_capture_offset = 0; _write_source.reset(); try { _write_source = boost::dynamic_pointer_cast<SMFSource>( - _session.create_midi_source_for_session (name ())); + _session.create_midi_source_for_session (write_source_name ())); if (!_write_source) { throw failed_constructor(); @@ -1417,6 +1441,9 @@ MidiDiskstream::get_playback (MidiBuffer& dst, framecnt_t nframes) bool MidiDiskstream::set_name (string const & name) { + if (_name == name) { + return true; + } Diskstream::set_name (name); /* get a new write source so that its name reflects the new diskstream name */ @@ -1425,6 +1452,19 @@ MidiDiskstream::set_name (string const & name) return true; } +bool +MidiDiskstream::set_write_source_name (const std::string& str) { + if (_write_source_name == str) { + return true; + } + Diskstream::set_write_source_name (str); + if (_write_source_name == name()) { + return true; + } + use_new_write_source (0); + return true; +} + boost::shared_ptr<MidiBuffer> MidiDiskstream::get_gui_feed_buffer () const { diff --git a/libs/ardour/midi_model.cc b/libs/ardour/midi_model.cc index 5c1f65d96b..ef9544589d 100644 --- a/libs/ardour/midi_model.cc +++ b/libs/ardour/midi_model.cc @@ -1018,6 +1018,7 @@ MidiModel::PatchChangeDiffCommand::change_channel (PatchChangePtr patch, uint8_t c.patch = patch; c.old_channel = patch->channel (); c.new_channel = channel; + c.patch_id = patch->id(); _changes.push_back (c); } @@ -1030,6 +1031,7 @@ MidiModel::PatchChangeDiffCommand::change_program (PatchChangePtr patch, uint8_t c.patch = patch; c.old_program = patch->program (); c.new_program = program; + c.patch_id = patch->id(); _changes.push_back (c); } @@ -1250,7 +1252,7 @@ MidiModel::PatchChangePtr MidiModel::PatchChangeDiffCommand::unmarshal_patch_change (XMLNode* n) { XMLProperty* prop; - Evoral::event_id_t id; + Evoral::event_id_t id = 0; Evoral::MusicalTime time = 0; int channel = 0; int program = 0; @@ -1282,6 +1284,7 @@ MidiModel::PatchChangeDiffCommand::unmarshal_patch_change (XMLNode* n) } PatchChangePtr p (new Evoral::PatchChange<TimeType> (time, channel, program, bank)); + assert(id); p->set_id (id); return p; } diff --git a/libs/ardour/midi_patch_manager.cc b/libs/ardour/midi_patch_manager.cc index 4bced4e46d..591c0cae40 100644 --- a/libs/ardour/midi_patch_manager.cc +++ b/libs/ardour/midi_patch_manager.cc @@ -28,7 +28,8 @@ #include "ardour/session.h" #include "ardour/session_directory.h" #include "ardour/midi_patch_manager.h" -#include "ardour/midi_patch_search_path.h" + +#include "ardour/search_paths.h" #include "i18n.h" @@ -67,10 +68,9 @@ MidiPatchManager::add_session_patches () assert (Glib::file_test (path_to_patches, Glib::FILE_TEST_IS_DIR)); - Glib::PatternSpec pattern(string("*.midnam")); vector<std::string> result; - find_matching_files_in_directory (path_to_patches, pattern, result); + find_files_matching_pattern (result, path_to_patches, "*.midnam"); info << "Loading " << result.size() << " MIDI patches from " << path_to_patches << endmsg; @@ -102,11 +102,10 @@ MidiPatchManager::refresh() _master_devices_by_model.clear(); _all_models.clear(); - SearchPath search_path = midi_patch_search_path (); - Glib::PatternSpec pattern (string("*.midnam")); + Searchpath search_path = midi_patch_search_path (); vector<std::string> result; - find_matching_files_in_search_path (search_path, pattern, result); + find_files_matching_pattern (result, search_path, "*.midnam"); info << "Loading " << result.size() << " MIDI patches from " << search_path.to_string() << endmsg; diff --git a/libs/ardour/midi_scene_change.cc b/libs/ardour/midi_scene_change.cc new file mode 100644 index 0000000000..dae8acfc21 --- /dev/null +++ b/libs/ardour/midi_scene_change.cc @@ -0,0 +1,142 @@ +/* + Copyright (C) 2014 Paul Davis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include "pbd/error.h" +#include "pbd/compose.h" + +#include "ardour/midi_port.h" +#include "ardour/midi_scene_change.h" + +#include "i18n.h" + +using namespace PBD; +using namespace ARDOUR; + +MIDISceneChange::MIDISceneChange (int c, int b, int p) + : _bank (b) + , _program (p) + , _channel (c & 0xf) +{ + if (_bank > 16384) { + _bank = -1; + } + + if (_program > 128) { + _program = -1; + } +} + +MIDISceneChange::MIDISceneChange (const XMLNode& node, int version) + : _bank (-1) + , _program (-1) + , _channel (-1) +{ + set_state (node, version); +} + +MIDISceneChange::~MIDISceneChange () +{ +} + +size_t +MIDISceneChange::get_bank_msb_message (uint8_t* buf, size_t size) const +{ + if (size < 3 || _bank < 0) { + return 0; + } + + buf[0] = 0xB0 | (_channel & 0xf); + buf[1] = 0x0; + buf[2] = (_bank >> 7) & 0x7f; + + return 3; +} + +size_t +MIDISceneChange::get_bank_lsb_message (uint8_t* buf, size_t size) const +{ + if (size < 3 || _bank < 0) { + return 0; + } + + buf[0] = 0xB0 | (_channel & 0xf); + buf[1] = 0x20; + buf[2] = _bank & 0x7f; + + return 3; +} + +size_t +MIDISceneChange::get_program_message (uint8_t* buf, size_t size) const +{ + if (size < 2 || _program < 0) { + return 0; + } + + buf[0] = 0xC0 | (_channel & 0xf); + buf[1] = _program & 0x7f; + + return 2; +} + +XMLNode& +MIDISceneChange::get_state () +{ + char buf[32]; + XMLNode* node = new XMLNode (SceneChange::xml_node_name); + + node->add_property (X_("type"), X_("MIDI")); + snprintf (buf, sizeof (buf), "%d", (int) _program); + node->add_property (X_("id"), id().to_s()); + snprintf (buf, sizeof (buf), "%d", (int) _program); + node->add_property (X_("program"), buf); + snprintf (buf, sizeof (buf), "%d", (int) _bank); + node->add_property (X_("bank"), buf); + snprintf (buf, sizeof (buf), "%d", (int) _channel); + node->add_property (X_("channel"), buf); + + return *node; +} + +int +MIDISceneChange::set_state (const XMLNode& node, int /* version-ignored */) +{ + if (!set_id (node)) { + return -1; + } + + const XMLProperty* prop; + + if ((prop = node.property (X_("program"))) == 0) { + return -1; + } + _program = atoi (prop->value()); + + if ((prop = node.property (X_("bank"))) == 0) { + return -1; + } + _bank = atoi (prop->value()); + + if ((prop = node.property (X_("channel"))) == 0) { + return -1; + } + _channel = atoi (prop->value()); + + return 0; +} diff --git a/libs/ardour/midi_scene_changer.cc b/libs/ardour/midi_scene_changer.cc new file mode 100644 index 0000000000..fcc20b850f --- /dev/null +++ b/libs/ardour/midi_scene_changer.cc @@ -0,0 +1,329 @@ +/* + Copyright (C) 2014 Paul Davis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include "evoral/MIDIEvent.hpp" +#include "midi++/channel.h" +#include "midi++/parser.h" +#include "midi++/port.h" + +#include "ardour/async_midi_port.h" +#include "ardour/event_type_map.h" +#include "ardour/midi_port.h" +#include "ardour/midi_scene_change.h" +#include "ardour/midi_scene_changer.h" +#include "ardour/session.h" + +#include "i18n.h" + +using namespace ARDOUR; + +MIDISceneChanger::MIDISceneChanger (Session& s) + : SceneChanger (s) + , _recording (true) + , last_bank_message_time (-1) + , last_program_message_time (-1) + , last_delivered_program (-1) + , last_delivered_bank (-1) + +{ + _session.locations()->changed.connect_same_thread (*this, boost::bind (&MIDISceneChanger::locations_changed, this, _1)); + Location::scene_changed.connect_same_thread (*this, boost::bind (&MIDISceneChanger::gather, this)); +} + +MIDISceneChanger::~MIDISceneChanger () +{ +} + +void +MIDISceneChanger::locations_changed (Locations::Change) +{ + gather (); +} + +/** Use the session's list of locations to collect all patch changes. + * + * This is called whenever the locations change in anyway. + */ +void +MIDISceneChanger::gather () +{ + const Locations::LocationList& locations (_session.locations()->list()); + boost::shared_ptr<SceneChange> sc; + + Glib::Threads::RWLock::WriterLock lm (scene_lock); + + scenes.clear (); + + for (Locations::LocationList::const_iterator l = locations.begin(); l != locations.end(); ++l) { + + if ((sc = (*l)->scene_change()) != 0) { + + boost::shared_ptr<MIDISceneChange> msc = boost::dynamic_pointer_cast<MIDISceneChange> (sc); + + if (msc) { + scenes.insert (std::make_pair ((*l)->start(), msc)); + } + } + } +} + +void +MIDISceneChanger::rt_deliver (MidiBuffer& mbuf, framepos_t when, boost::shared_ptr<MIDISceneChange> msc) +{ + uint8_t buf[4]; + size_t cnt; + + if ((cnt = msc->get_bank_msb_message (buf, sizeof (buf))) > 0) { + mbuf.push_back (when, cnt, buf); + + if ((cnt = msc->get_bank_lsb_message (buf, sizeof (buf))) > 0) { + mbuf.push_back (when, cnt, buf); + } + + last_delivered_bank = msc->bank(); + } + + if ((cnt = msc->get_program_message (buf, sizeof (buf))) > 0) { + mbuf.push_back (when, cnt, buf); + + last_delivered_program = msc->program(); + } +} + +void +MIDISceneChanger::non_rt_deliver (boost::shared_ptr<MIDISceneChange> msc) +{ + uint8_t buf[4]; + size_t cnt; + boost::shared_ptr<AsyncMIDIPort> aport = boost::dynamic_pointer_cast<AsyncMIDIPort>(output_port); + + /* We use zero as the timestamp for these messages because we are in a + non-RT/process context. Using zero means "deliver them as early as + possible" (practically speaking, in the next process callback). + */ + + if ((cnt = msc->get_bank_msb_message (buf, sizeof (buf))) > 0) { + aport->write (buf, cnt, 0); + + if ((cnt = msc->get_bank_lsb_message (buf, sizeof (buf))) > 0) { + aport->write (buf, cnt, 0); + } + + last_delivered_bank = msc->bank(); + } + + if ((cnt = msc->get_program_message (buf, sizeof (buf))) > 0) { + aport->write (buf, cnt, 0); + last_delivered_program = msc->program(); + } +} + +void +MIDISceneChanger::run (framepos_t start, framepos_t end) +{ + if (!output_port || recording() || !_session.transport_rolling()) { + return; + } + + Glib::Threads::RWLock::ReaderLock lm (scene_lock, Glib::Threads::TRY_LOCK); + + if (!lm.locked()) { + return; + } + + /* get lower bound of events to consider */ + + Scenes::const_iterator i = scenes.lower_bound (start); + MidiBuffer& mbuf (output_port->get_midi_buffer (end-start)); + + while (i != scenes.end()) { + + if (i->first >= end) { + break; + } + + rt_deliver (mbuf, i->first - start, i->second); + + ++i; + } +} + +void +MIDISceneChanger::locate (framepos_t pos) +{ + boost::shared_ptr<MIDISceneChange> msc; + framepos_t when; + + { + Glib::Threads::RWLock::ReaderLock lm (scene_lock); + + if (scenes.empty()) { + return; + } + + Scenes::const_iterator i = scenes.lower_bound (pos); + + if (i != scenes.end()) { + + if (i->first != pos) { + /* i points to first scene with position > pos, so back + * up, if possible. + */ + if (i != scenes.begin()) { + --i; + } else { + return; + } + } + } else { + /* go back to the final scene and use it */ + --i; + } + + when = i->first; + msc = i->second; + } + + if (msc->program() != last_delivered_program || msc->bank() != last_delivered_bank) { + non_rt_deliver (msc); + } +} + +void +MIDISceneChanger::set_input_port (MIDI::Port* mp) +{ + input_port = mp; + + incoming_connections.drop_connections(); + + if (input_port) { + + /* midi port is asynchronous. MIDI parsing will be carried out + * by the MIDI UI thread which will emit the relevant signals + * and thus invoke our callbacks as necessary. + */ + + for (int channel = 0; channel < 16; ++channel) { + input_port->parser()->channel_bank_change[channel].connect_same_thread (incoming_connections, boost::bind (&MIDISceneChanger::bank_change_input, this, _1, _2, channel)); + input_port->parser()->channel_program_change[channel].connect_same_thread (incoming_connections, boost::bind (&MIDISceneChanger::program_change_input, this, _1, _2, channel)); + } + } +} + +void +MIDISceneChanger::set_output_port (boost::shared_ptr<MidiPort> mp) +{ + output_port = mp; +} + +void +MIDISceneChanger::set_recording (bool yn) +{ + _recording = yn; +} + +bool +MIDISceneChanger::recording() const +{ + return _session.transport_rolling() && _session.get_record_enabled(); +} + +void +MIDISceneChanger::bank_change_input (MIDI::Parser& parser, unsigned short, int) +{ + if (!recording()) { + return; + } + + last_bank_message_time = parser.get_timestamp (); +} + +void +MIDISceneChanger::program_change_input (MIDI::Parser& parser, MIDI::byte program, int channel) +{ + framecnt_t time = parser.get_timestamp (); + + last_program_message_time = time; + + if (!recording()) { + jump_to (input_port->channel (channel)->bank(), program); + return; + } + + Locations* locations (_session.locations ()); + Location* loc; + bool new_mark = false; + framecnt_t slop = (framecnt_t) floor ((Config->get_inter_scene_gap_msecs() / 1000.0) * _session.frame_rate()); + + /* check for marker at current location */ + + loc = locations->mark_at (time, slop); + + if (!loc) { + /* create a new marker at the desired position */ + + std::string new_name; + + if (!locations->next_available_name (new_name, _("Scene "))) { + std::cerr << "No new marker name available\n"; + return; + } + + loc = new Location (_session, time, time, new_name, Location::IsMark); + new_mark = true; + } + + unsigned short bank = input_port->channel (channel)->bank(); + + MIDISceneChange* msc =new MIDISceneChange (channel, bank, program & 0x7f); + + loc->set_scene_change (boost::shared_ptr<MIDISceneChange> (msc)); + + /* this will generate a "changed" signal to be emitted by locations, + and we will call ::gather() to update our list of MIDI events. + */ + + if (new_mark) { + locations->add (loc); + } +} + +void +MIDISceneChanger::jump_to (int bank, int program) +{ + const Locations::LocationList& locations (_session.locations()->list()); + boost::shared_ptr<SceneChange> sc; + framepos_t where = max_framepos; + + for (Locations::LocationList::const_iterator l = locations.begin(); l != locations.end(); ++l) { + + if ((sc = (*l)->scene_change()) != 0) { + + boost::shared_ptr<MIDISceneChange> msc = boost::dynamic_pointer_cast<MIDISceneChange> (sc); + + if (msc->bank() == bank && msc->program() == program && (*l)->start() < where) { + where = (*l)->start(); + } + } + } + + if (where != max_framepos) { + _session.request_locate (where); + } +} diff --git a/libs/ardour/midi_source.cc b/libs/ardour/midi_source.cc index 880bad1c24..655222413a 100644 --- a/libs/ardour/midi_source.cc +++ b/libs/ardour/midi_source.cc @@ -20,7 +20,6 @@ #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> -#include <poll.h> #include <float.h> #include <cerrno> #include <ctime> diff --git a/libs/ardour/midi_track.cc b/libs/ardour/midi_track.cc index d07076ea65..638ed05706 100644 --- a/libs/ardour/midi_track.cc +++ b/libs/ardour/midi_track.cc @@ -17,8 +17,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include <strings.h> // for ffs(3) - +#include "pbd/ffs.h" #include "pbd/enumwriter.h" #include "pbd/convert.h" #include "evoral/midi_util.h" @@ -315,7 +314,7 @@ MidiTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame if (!lm.locked()) { boost::shared_ptr<MidiDiskstream> diskstream = midi_diskstream(); framecnt_t playback_distance = diskstream->calculate_playback_distance(nframes); - if (can_internal_playback_seek(std::llabs(playback_distance))) { + if (can_internal_playback_seek(llabs(playback_distance))) { /* TODO should declick, and/or note-off */ internal_playback_seek(playback_distance); } @@ -507,7 +506,7 @@ MidiTrack::filter_channels (BufferSet& bufs, ChannelMode mode, uint32_t mask) } break; case ForceChannel: - ev.set_channel (ffs (mask) - 1); + ev.set_channel (PBD::ffs (mask) - 1); ++e; break; case AllChannels: @@ -548,7 +547,7 @@ MidiTrack::write_out_of_band_data (BufferSet& bufs, framepos_t /*start*/, framep int MidiTrack::export_stuff (BufferSet& /*bufs*/, framepos_t /*start_frame*/, framecnt_t /*nframes*/, - boost::shared_ptr<Processor> /*endpoint*/, bool /*include_endpoint*/, bool /*forexport*/) + boost::shared_ptr<Processor> /*endpoint*/, bool /*include_endpoint*/, bool /*for_export*/, bool /*for_freeze*/) { return -1; } @@ -627,9 +626,9 @@ void MidiTrack::MidiControl::set_value(double val) { bool valid = false; - if (std::isinf(val)) { + if (isinf(val)) { cerr << "MIDIControl value is infinity" << endl; - } else if (std::isnan(val)) { + } else if (isnan(val)) { cerr << "MIDIControl value is NaN" << endl; } else if (val < _list->parameter().min()) { cerr << "MIDIControl value is < " << _list->parameter().min() << endl; diff --git a/libs/ardour/midi_ui.cc b/libs/ardour/midi_ui.cc index b80370ec6a..e00ec587ec 100644 --- a/libs/ardour/midi_ui.cc +++ b/libs/ardour/midi_ui.cc @@ -52,7 +52,11 @@ MidiControlUI::MidiControlUI (Session& s) MidiControlUI::~MidiControlUI () { + /* stop the thread */ + quit (); + /* drop all ports as GIO::Sources */ clear_ports (); + /* we no longer exist */ _instance = 0; } @@ -77,7 +81,9 @@ MidiControlUI::midi_input_handler (IOCondition ioc, AsyncMIDIPort* port) if (ioc & IO_IN) { +#ifndef PLATFORM_WINDOWS CrossThreadChannel::drain (port->selectable()); +#endif DEBUG_TRACE (DEBUG::MidiIO, string_compose ("data available on %1\n", ((ARDOUR::Port*)port)->name())); framepos_t now = _session.engine().sample_time(); @@ -116,6 +122,10 @@ MidiControlUI::reset_ports () if ((p = dynamic_cast<AsyncMIDIPort*> (_session.mmc_input_port()))) { ports.push_back (p); } + + if ((p = dynamic_cast<AsyncMIDIPort*> (_session.scene_input_port()))) { + ports.push_back (p); + } if (ports.empty()) { return; diff --git a/libs/ardour/mididm.cc b/libs/ardour/mididm.cc new file mode 100644 index 0000000000..0888d154e9 --- /dev/null +++ b/libs/ardour/mididm.cc @@ -0,0 +1,140 @@ +/* + * Copyright (C) 2013-2014 Robin Gareus <robin@gareus.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "ardour/mididm.h" +#include "ardour/port_engine.h" + +using namespace ARDOUR; + +MIDIDM::MIDIDM (framecnt_t sample_rate) + : _sample_rate (sample_rate) + , _monotonic_cnt (sample_rate) + , _last_signal_tme (0) + , _cnt_total (0) + , _dly_total (0) + , _min_delay (INT32_MAX) + , _max_delay (0) + , _avg_delay (0) + , _var_m (0) + , _var_s (0) +{ + +} + +int64_t +MIDIDM::parse_mclk (uint8_t* buf, pframes_t timestamp) const +{ + /* calculate time difference */ +#define MODCLK (16384) // 1<<(2*7) + const int64_t tc = (_monotonic_cnt + timestamp) & 0x3fff; // MODCLK - 1; + const int64_t ti = ((buf[2] & 0x7f) << 7) | (buf[1] & 0x7f); + const int64_t tdiff = (MODCLK + tc - ti) % MODCLK; +#ifdef DEBUG_MIDIDM + printf("MCLK DELAY: #%5"PRId64" dt:%6"PRId64" [spl] (%6"PRId64" - %8"PRId64") @(%8"PRId64" + %d)\n", + _cnt_total, tdiff, tc, ti, _monotonic_cnt, timestamp); +#endif + return tdiff; +} + +int64_t +MIDIDM::parse_mtc (uint8_t* buf, pframes_t timestamp) const +{ +#define MODTC (2097152) // 1<<(3*7) + const int64_t tc = (_monotonic_cnt + timestamp) & 0x001FFFFF; + const int64_t ti = (buf[5] & 0x7f) + | ((buf[6] & 0x7f) << 7) + | ((buf[7] & 0x7f) << 14) + | ((buf[8] & 0x7f) << 21); + const int64_t tdiff = (MODTC + tc - ti) % MODTC; +#ifdef DEBUG_MIDIDM + printf("MTC DELAY: #%5"PRId64" dt:%6"PRId64" [spl] (%6"PRId64" - %8"PRId64") @(%8"PRId64" + %d)\n", + _cnt_total, tdiff, tc, ti, _monotonic_cnt, timestamp); +#endif + return tdiff; +} + +int MIDIDM::process (pframes_t nframes, PortEngine &pe, void *midi_in, void *midi_out) +{ + /* send midi event */ + pe.midi_clear(midi_out); +#ifndef USE_MTC // use 3-byte song position + uint8_t obuf[3]; + obuf[0] = 0xf2; + obuf[1] = (_monotonic_cnt) & 0x7f; + obuf[2] = (_monotonic_cnt >> 7) & 0x7f; + pe.midi_event_put (midi_out, 0, obuf, 3); +#else // sysex MTC frame + uint8_t obuf[10]; + obuf[0] = 0xf0; + obuf[1] = 0x7f; + obuf[2] = 0x7f; + obuf[3] = 0x01; + obuf[4] = 0x01; + obuf[9] = 0xf7; + obuf[5] = (_monotonic_cnt ) & 0x7f; + obuf[6] = (_monotonic_cnt >> 7) & 0x7f; + obuf[7] = (_monotonic_cnt >> 14) & 0x7f; + obuf[8] = (_monotonic_cnt >> 21) & 0x7f; + pe.midi_event_put (midi_out, 0, obuf, 10); +#endif + + /* process incoming */ + const pframes_t nevents = pe.get_midi_event_count (midi_in); +#ifdef DEBUG_MIDIDM + printf("MIDI SEND: @%8"PRId64", recv: %d systime:%"PRId64"\n", _monotonic_cnt, nevents, g_get_monotonic_time()); +#endif + for (pframes_t n = 0; n < nevents; ++n) { + pframes_t timestamp; + size_t size; + uint8_t* buf; + int64_t tdiff; + pe.midi_event_get (timestamp, size, &buf, midi_in, n); + + if (size == 3 && buf[0] == 0xf2 ) + { + tdiff = parse_mclk(buf, timestamp); + } else if (size == 10 && buf[0] == 0xf0) + { + tdiff = parse_mtc(buf, timestamp); + } + else + { + continue; + } + + _last_signal_tme = _monotonic_cnt; + + /* running variance */ + if (_cnt_total == 0) { + _var_m = tdiff; + } else { + const double var_m1 = _var_m; + _var_m = _var_m + ((double)tdiff - _var_m) / (double)(_cnt_total + 1); + _var_s = _var_s + ((double)tdiff - _var_m) * ((double)tdiff - var_m1); + } + /* average and mix/max */ + ++_cnt_total; + _dly_total += tdiff; + _avg_delay = _dly_total / _cnt_total; + if (tdiff < _min_delay) _min_delay = tdiff; + if (tdiff > _max_delay) _max_delay = tdiff; + } + + _monotonic_cnt += nframes; + return 0; +} diff --git a/libs/ardour/midiport_manager.cc b/libs/ardour/midiport_manager.cc index 6de0436586..b1699ca5ab 100644 --- a/libs/ardour/midiport_manager.cc +++ b/libs/ardour/midiport_manager.cc @@ -40,8 +40,14 @@ MidiPortManager::~MidiPortManager () if (_midi_in) { AudioEngine::instance()->unregister_port (_midi_in); } - if (_midi_in) { - AudioEngine::instance()->unregister_port (_midi_in); + if (_midi_out) { + AudioEngine::instance()->unregister_port (_midi_out); + } + if (_scene_in) { + AudioEngine::instance()->unregister_port (_scene_in); + } + if (_scene_out) { + AudioEngine::instance()->unregister_port (_scene_out); } if (_mtc_input_port) { AudioEngine::instance()->unregister_port (_mtc_input_port); @@ -73,7 +79,10 @@ MidiPortManager::create_ports () _mmc_in = AudioEngine::instance()->register_input_port (DataType::MIDI, X_("MMC in"), true); _mmc_out = AudioEngine::instance()->register_output_port (DataType::MIDI, X_("MMC out"), true); - + + _scene_in = AudioEngine::instance()->register_input_port (DataType::MIDI, X_("Scene in"), true); + _scene_out = AudioEngine::instance()->register_output_port (DataType::MIDI, X_("Scene out"), true); + /* XXX nasty type conversion needed because of the mixed inheritance * required to integrate MIDI::IPMidiPort and ARDOUR::AsyncMIDIPort. * @@ -88,6 +97,9 @@ MidiPortManager::create_ports () _mmc_input_port = boost::dynamic_pointer_cast<AsyncMIDIPort>(_mmc_in).get(); _mmc_output_port = boost::dynamic_pointer_cast<AsyncMIDIPort>(_mmc_out).get(); + _scene_input_port = boost::dynamic_pointer_cast<AsyncMIDIPort>(_scene_in).get(); + _scene_output_port = boost::dynamic_pointer_cast<AsyncMIDIPort>(_scene_out).get(); + /* Now register ports used for sync (MTC and MIDI Clock) */ @@ -129,6 +141,8 @@ MidiPortManager::set_midi_port_states (const XMLNodeList&nodes) ports.insert (make_pair (_midi_output_port->name(), _midi_out)); ports.insert (make_pair (_mmc_input_port->name(), _mmc_in)); ports.insert (make_pair (_mmc_output_port->name(), _mmc_out)); + ports.insert (make_pair (_scene_output_port->name(), _scene_out)); + ports.insert (make_pair (_scene_input_port->name(), _scene_in)); for (XMLNodeList::const_iterator n = nodes.begin(); n != nodes.end(); ++n) { if ((prop = (*n)->property (X_("name"))) == 0) { @@ -159,6 +173,8 @@ MidiPortManager::get_midi_port_states () const ports.insert (make_pair (_midi_output_port->name(), _midi_out)); ports.insert (make_pair (_mmc_input_port->name(), _mmc_in)); ports.insert (make_pair (_mmc_output_port->name(), _mmc_out)); + ports.insert (make_pair (_scene_output_port->name(), _scene_out)); + ports.insert (make_pair (_scene_input_port->name(), _scene_in)); for (PortMap::const_iterator p = ports.begin(); p != ports.end(); ++p) { s.push_back (&p->second->get_state()); diff --git a/libs/ardour/mix.cc b/libs/ardour/mix.cc index 3a873a8e50..220cd0660c 100644 --- a/libs/ardour/mix.cc +++ b/libs/ardour/mix.cc @@ -24,6 +24,8 @@ #include "ardour/runtime_functions.h" #include <stdint.h> +using std::min; +using std::max; using namespace ARDOUR; #if defined (ARCH_X86) && defined (BUILD_SSE_OPTIMIZATIONS) @@ -93,22 +95,22 @@ default_compute_peak (const ARDOUR::Sample * buf, pframes_t nsamples, float curr } void -default_find_peaks (const ARDOUR::Sample * buf, pframes_t nframes, float *min, float *max) +default_find_peaks (const ARDOUR::Sample * buf, pframes_t nframes, float *minf, float *maxf) { pframes_t i; float a, b; - a = *max; - b = *min; + a = *maxf; + b = *minf; for (i = 0; i < nframes; i++) { - a = fmax (buf[i], a); - b = fmin (buf[i], b); + a = max (buf[i], a); + b = min (buf[i], b); } - *max = a; - *min = b; + *maxf = a; + *minf = b; } void diff --git a/libs/ardour/msvc/msvc_libardour.cc b/libs/ardour/msvc/msvc_libardour.cc new file mode 100644 index 0000000000..bd186728ea --- /dev/null +++ b/libs/ardour/msvc/msvc_libardour.cc @@ -0,0 +1,276 @@ +/* + Copyright (C) 2009 John Emmas + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#if (defined(PLATFORM_WINDOWS) && !defined(COMPILER_CYGWIN)) +#include <shlobj.h> +#include <glibmm.h> +#ifdef COMPILER_MSVC +#pragma warning(disable:4996) +#endif +#else +#include <glib.h> +#endif + +#include <string.h> +#include <stdlib.h> +#include <ardour/msvc_libardour.h> + +namespace ARDOUR { + +//*************************************************************** +// +// placeholder_for_non_msvc_specific_function() +// +// Description +// +// Returns: +// +// On Success: +// +// On Failure: +// +/* LIBARDOUR_API char* LIBARDOUR_APICALLTYPE + placeholder_for_non_msvc_specific_function() +{ +char *pRet = buffer; + + return (pRet); +} +*/ + +} // namespace ARDOUR + +#ifdef COMPILER_MSVC + +#include <errno.h> + +namespace ARDOUR { + +//*************************************************************** +// +// symlink() +// +// Emulates POSIX symlink() but creates a Windows shortcut. To +// create a Windows shortcut the supplied shortcut name must end +// in ".lnk" +// Note that you can only create a shortcut in a folder for which +// you have appropriate access rights. Note also that the folder +// must already exist. If it doesn't exist or if you don't have +// sufficient access rights to it, symlink() will generate an +// error (in common with its POSIX counterpart). +// +// Returns: +// +// On Success: Zero +// On Failure: -1 ('errno' will contain the specific error) +// +LIBARDOUR_API int LIBARDOUR_APICALLTYPE +symlink(const char *dest, const char *shortcut, const char *working_directory /*= NULL */) +{ +IShellLinkA *pISL = NULL; +IPersistFile *ppf = NULL; +int ret = (-1); + + if ((NULL == dest) || (NULL == shortcut) || (strlen(shortcut) < 5) || (strlen(dest) == 0)) + _set_errno(EINVAL); + else if ((strlen(shortcut) > _MAX_PATH) || (strlen(dest) > _MAX_PATH)) + _set_errno(ENAMETOOLONG); + else if (Glib::file_test(shortcut, Glib::FILE_TEST_EXISTS)) + _set_errno(EEXIST); + else + { + HRESULT hRet = 0; + + if (SUCCEEDED (hRet = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&pISL))) + { + if (SUCCEEDED (pISL->QueryInterface(IID_IPersistFile, (LPVOID*)&ppf))) + { + char sc_path_lower_case[_MAX_PATH]; + WCHAR shortcut_path[_MAX_PATH]; + + // Fail if the path isn't a shortcut + strcpy(sc_path_lower_case, shortcut); + strlwr(sc_path_lower_case); + const char *p = strlen(sc_path_lower_case) + sc_path_lower_case - 4; + + if (0 == strcmp(p, ".lnk")) + { + HRESULT hr; + + // We're apparently been given valid Windows shortcut name + MultiByteToWideChar (CP_ACP, MB_PRECOMPOSED, shortcut, -1, shortcut_path, _MAX_PATH); + + // Create the shortcut + if (FAILED (hr = ppf->Load(shortcut_path, STGM_CREATE|STGM_READWRITE|STGM_SHARE_EXCLUSIVE))) + hr = ppf->Save(shortcut_path, TRUE); + + if (S_OK == hr) + { + // Set its target path + if (S_OK == pISL->SetPath(dest)) + { + // Set its working directory + if (working_directory) + p = working_directory; + else + p = ""; + + if (S_OK == pISL->SetWorkingDirectory(p)) + { + // Set its 'Show' command + if (S_OK == pISL->SetShowCmd(SW_SHOWNORMAL)) + { + // And finally, set its icon to the same file as the target. + // For the time being, don't fail if the target has no icon. + if (Glib::file_test(dest, Glib::FILE_TEST_IS_DIR)) + pISL->SetIconLocation("%SystemRoot%\\system32\\shell32.dll", 1); + else + pISL->SetIconLocation(dest, 0); + + if (S_OK == ppf->Save(shortcut_path, FALSE)) + { + Sleep(1500); + + ret = 0; + // _set_errno(0); + } + else + _set_errno(EACCES); + } + else + _set_errno(EACCES); + } + else + _set_errno(EACCES); + } + else + _set_errno(EACCES); + } + else + _set_errno(EBADF); + } + else + _set_errno(EACCES); + } + else + _set_errno(EBADF); + } + else + { + if (E_POINTER == hRet) + _set_errno(EINVAL); + else + _set_errno(EIO); + } + } + + return (ret); +} + + +//*************************************************************** +// +// readlink() +// +// Emulates POSIX readlink() but using Windows shortcuts +// Doesn't (currently) resolve shortcuts to shortcuts. This would +// be quite simple to incorporate but we'd need to check for +// recursion (i.e. a shortcut that points to an earlier shortcut +// in the same chain). +// +// Returns: +// +// On Success: Zero +// On Failure: -1 ('errno' will contain the specific error) +// +LIBARDOUR_API int LIBARDOUR_APICALLTYPE +readlink(const char *__restrict shortcut, char *__restrict buf, size_t bufsize) +{ +IShellLinkA *pISL = NULL; +IPersistFile *ppf = NULL; +int ret = (-1); + + if ((NULL == shortcut) || (NULL == buf) || (strlen(shortcut) < 5) || (bufsize == 0)) + _set_errno(EINVAL); + else if ((bufsize > _MAX_PATH) || (strlen(shortcut) > _MAX_PATH)) + _set_errno(ENAMETOOLONG); + else + { + HRESULT hRet = 0; + + if (SUCCEEDED (hRet = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&pISL))) + { + if (SUCCEEDED (pISL->QueryInterface(IID_IPersistFile, (LPVOID*)&ppf))) + { + char target_path[_MAX_PATH]; + WCHAR shortcut_path[_MAX_PATH]; + + // Fail if the path isn't a shortcut + strcpy(target_path, shortcut); // Use 'target_path' temporarily + strlwr(target_path); + const char *p = strlen(target_path) + target_path - 4; + + if (0 == strcmp(p, ".lnk")) + { + // We're apparently pointing to a valid Windows shortcut + MultiByteToWideChar (CP_ACP, MB_PRECOMPOSED, shortcut, -1, shortcut_path, _MAX_PATH); + + // Load the shortcut into our persistent file + if (SUCCEEDED (ppf->Load(shortcut_path, 0))) + { + // Read the target information from the shortcut object + if (S_OK == (pISL->GetPath (target_path, _MAX_PATH, NULL, SLGP_UNCPRIORITY))) + { + strncpy(buf, target_path, bufsize); + ret = ((ret = strlen(buf)) > bufsize) ? bufsize : ret; + // _set_errno(0); + } + else + _set_errno(EACCES); + } + else + _set_errno(EBADF); + } + else + _set_errno(EINVAL); + } + else + _set_errno(EBADF); + } + else + { + if (E_POINTER == hRet) + _set_errno(EINVAL); + else + _set_errno(EIO); + } + + if (ppf) + ppf->Release(); + + if (pISL) + pISL->Release(); + } + + return (ret); +} + +} // namespace ARDOUR + +#endif // COMPILER_MSVC diff --git a/libs/ardour/mtc_slave.cc b/libs/ardour/mtc_slave.cc index e9071af619..1a1c5f2bec 100644 --- a/libs/ardour/mtc_slave.cc +++ b/libs/ardour/mtc_slave.cc @@ -19,11 +19,11 @@ */ #include <iostream> #include <errno.h> -#include <poll.h> #include <sys/types.h> #include <unistd.h> #include "pbd/error.h" +#include "pbd/pthread_utils.h" #include "ardour/audioengine.h" #include "ardour/debug.h" @@ -32,6 +32,8 @@ #include "ardour/session.h" #include "ardour/slave.h" +#include <glibmm/timer.h> + #include "i18n.h" using namespace std; @@ -236,7 +238,7 @@ MTC_Slave::read_current (SafeTime *st) const do { if (tries == 10) { error << _("MTC Slave: atomic read of current time failed, sleeping!") << endmsg; - usleep (20); + Glib::usleep (20); tries = 0; } *st = current; @@ -299,7 +301,7 @@ MTC_Slave::update_mtc_qtr (Parser& /*p*/, int which_qtr, framepos_t now) * when a full TC has been received * OR on locate */ void -MTC_Slave::update_mtc_time (const byte *msg, bool was_full, framepos_t now) +MTC_Slave::update_mtc_time (const MIDI::byte *msg, bool was_full, framepos_t now) { busy_guard1++; @@ -307,8 +309,7 @@ MTC_Slave::update_mtc_time (const byte *msg, bool was_full, framepos_t now) to use a timestamp indicating when this MTC time was received. example: when we received a locate command via MMC. */ - - DEBUG_TRACE (DEBUG::MTC, string_compose ("MTC::update_mtc_time - TID:%1\n", ::pthread_self())); + DEBUG_TRACE (DEBUG::MTC, string_compose ("MTC::update_mtc_time - TID:%1\n", pthread_name())); TimecodeFormat tc_format; bool reset_tc = true; @@ -488,7 +489,7 @@ MTC_Slave::update_mtc_status (MIDI::MTC_Status status) /* XXX !!! thread safety ... called from MIDI I/O context * on locate (via ::update_mtc_time()) */ - DEBUG_TRACE (DEBUG::MTC, string_compose("MTC_Slave::update_mtc_status - TID:%1\n", ::pthread_self())); + DEBUG_TRACE (DEBUG::MTC, string_compose("MTC_Slave::update_mtc_status - TID:%1\n", pthread_name())); return; // why was this fn needed anyway ? it just messes up things -> use reset. busy_guard1++; diff --git a/libs/ardour/panner_manager.cc b/libs/ardour/panner_manager.cc index ec5b675731..906e979862 100644 --- a/libs/ardour/panner_manager.cc +++ b/libs/ardour/panner_manager.cc @@ -24,12 +24,13 @@ #include "pbd/error.h" #include "pbd/compose.h" -#include "pbd/pathscanner.h" +#include "pbd/file_utils.h" #include "pbd/stl_delete.h" #include "ardour/debug.h" #include "ardour/panner_manager.h" -#include "ardour/panner_search_path.h" + +#include "ardour/search_paths.h" #include "i18n.h" @@ -62,28 +63,42 @@ PannerManager::instance () static bool panner_filter (const string& str, void */*arg*/) { -#ifdef __APPLE__ +#ifdef COMPILER_MSVC + /** + * Different build targets (Debug / Release etc) use different versions + * of the 'C' runtime (which can't be 'mixed & matched'). Therefore, in + * case the supplied search path contains multiple version(s) of a given + * panner module, only select the one(s) which match the current build + * target (otherwise, all hell will break loose !!) + */ + #if defined (_DEBUG) + return str.length() > 12 && (str.find ("panner_") == 0) && (str.find ("D.dll") == (str.length() - 5)); + #elif defined (RDC_BUILD) + return str.length() > 14 && (str.find ("panner_") == 0) && (str.find ("RDC.dll") == (str.length() - 7)); + #elif defined (_WIN64) + return str.length() > 13 && (str.find ("panner_") == 0) && (str.find ("64.dll") == (str.length() - 6)); + #else + return str.length() > 13 && (str.find ("panner_") == 0) && (str.find ("32.dll") == (str.length() - 6)); + #endif +#elif defined (__APPLE__) return str[0] != '.' && (str.length() > 6 && str.find (".dylib") == (str.length() - 6)); #else - return str[0] != '.' && (str.length() > 3 && str.find (".so") == (str.length() - 3)); + return str[0] != '.' && (str.length() > 3 && (str.find (".so") == (str.length() - 3) || str.find (".dll") == (str.length() - 4))); #endif } void PannerManager::discover_panners () { - PathScanner scanner; - std::vector<std::string *> *panner_modules; - std::string search_path = panner_search_path().to_string(); + std::vector<std::string> panner_modules; - DEBUG_TRACE (DEBUG::Panning, string_compose (_("looking for panners in %1\n"), search_path)); + DEBUG_TRACE (DEBUG::Panning, string_compose (_("looking for panners in %1\n"), panner_search_path().to_string())); - panner_modules = scanner (search_path, panner_filter, 0, false, true, 1, true); + find_files_matching_filter (panner_modules, panner_search_path(), panner_filter, 0, false, true, true); - for (vector<std::string *>::iterator i = panner_modules->begin(); i != panner_modules->end(); ++i) { - panner_discover (**i); + for (vector<std::string>::iterator i = panner_modules.begin(); i != panner_modules.end(); ++i) { + panner_discover (*i); } - vector_delete (panner_modules); } int @@ -104,6 +119,8 @@ PannerManager::panner_discover (string path) if (i == panner_info.end()) { panner_info.push_back (pinfo); DEBUG_TRACE (DEBUG::Panning, string_compose(_("Panner discovered: \"%1\" in %2\n"), pinfo->descriptor.name, path)); + } else { + delete pinfo; } } @@ -113,31 +130,33 @@ PannerManager::panner_discover (string path) PannerInfo* PannerManager::get_descriptor (string path) { - void *module; + Glib::Module* module = new Glib::Module(path); PannerInfo* info = 0; PanPluginDescriptor *descriptor = 0; PanPluginDescriptor* (*dfunc)(void); - const char *errstr; + void* func = 0; - if ((module = dlopen (path.c_str(), RTLD_NOW)) == 0) { - error << string_compose(_("PannerManager: cannot load module \"%1\" (%2)"), path, dlerror()) << endmsg; + if (!module) { + error << string_compose(_("PannerManager: cannot load module \"%1\" (%2)"), path, + Glib::Module::get_last_error()) << endmsg; + delete module; return 0; } - dfunc = (PanPluginDescriptor* (*)(void)) dlsym (module, "panner_descriptor"); - - if ((errstr = dlerror()) != 0) { + if (!module->get_symbol("panner_descriptor", func)) { error << string_compose(_("PannerManager: module \"%1\" has no descriptor function."), path) << endmsg; - error << errstr << endmsg; - dlclose (module); + error << Glib::Module::get_last_error() << endmsg; + delete module; return 0; } + dfunc = (PanPluginDescriptor* (*)(void))func; descriptor = dfunc(); + if (descriptor) { info = new PannerInfo (*descriptor, module); } else { - dlclose (module); + delete module; } return info; diff --git a/libs/ardour/panner_search_path.cc b/libs/ardour/panner_search_path.cc deleted file mode 100644 index 49349238e4..0000000000 --- a/libs/ardour/panner_search_path.cc +++ /dev/null @@ -1,44 +0,0 @@ -/* - Copyright (C) 2007 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 <glibmm/miscutils.h> - -#include "ardour/panner_search_path.h" -#include "ardour/directory_names.h" -#include "ardour/filesystem_paths.h" - -namespace { - const char * const panner_env_variable_name = "ARDOUR_PANNER_PATH"; -} // anonymous - -using namespace PBD; - -namespace ARDOUR { - -SearchPath -panner_search_path () -{ - SearchPath spath(user_config_directory ()); - spath += ardour_dll_directory (); - spath.add_subdirectory_to_paths(panner_dir_name); - spath += SearchPath(Glib::getenv(panner_env_variable_name)); - return spath; -} - -} // namespace ARDOUR diff --git a/libs/ardour/panner_shell.cc b/libs/ardour/panner_shell.cc index 75543433c5..a4a9342816 100644 --- a/libs/ardour/panner_shell.cc +++ b/libs/ardour/panner_shell.cc @@ -119,8 +119,8 @@ PannerShell::configure_io (ChanCount in, ChanCount out) PannerInfo* pi = PannerManager::instance().select_panner (in, out, _user_selected_panner_uri); if (!pi) { - cerr << "No panner found: check that panners are being discovered correctly during startup.\n"; - assert (pi); + fatal << _("No panner found: check that panners are being discovered correctly during startup.") << endmsg; + /*NOTREACHED*/ } DEBUG_TRACE (DEBUG::Panning, string_compose (_("select panner: %1\n"), pi->descriptor.name.c_str())); @@ -233,6 +233,16 @@ PannerShell::set_state (const XMLNode& node, int version) _current_panner_uri = (*p)->descriptor.panner_uri; _panner_gui_uri = (*p)->descriptor.gui_uri; + if (_is_send) { + if (!_panlinked) { + _pannable_internal->set_panner(_panner); + } else { + _force_reselect = true; + } + } else { + _pannable_route->set_panner(_panner); + } + if (_panner->set_state (**niter, version) == 0) { return -1; } diff --git a/libs/ardour/pcm_utils.cc b/libs/ardour/pcm_utils.cc index de3497d977..ae3bd4a4e0 100644 --- a/libs/ardour/pcm_utils.cc +++ b/libs/ardour/pcm_utils.cc @@ -17,8 +17,10 @@ */ +#ifdef COMPILER_MSVC +#include <ardourext/float_cast.h> +#endif #include "ardour/pcm_utils.h" - #include <cmath> using namespace std; diff --git a/libs/ardour/pi_controller.cc b/libs/ardour/pi_controller.cc deleted file mode 100644 index a165aa9e40..0000000000 --- a/libs/ardour/pi_controller.cc +++ /dev/null @@ -1,231 +0,0 @@ -/* - Copyright (C) 2008 Torben Hohn - - 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 <iostream> -#include <cmath> -#include <cstdlib> - -#include "ardour/pi_controller.h" - -static inline double hann(double x) { - return 0.5 * (1.0 - cos(2 * M_PI * x)); -} - -PIController::PIController (double resample_factor, int fir_size) -{ - resample_mean = resample_factor; - static_resample_factor = resample_factor; - offset_array = new double[fir_size]; - window_array = new double[fir_size]; - offset_differential_index = 0; - offset_integral = 0.0; - smooth_size = fir_size; - - for (int i = 0; i < fir_size; i++) { - offset_array[i] = 0.0; - window_array[i] = hann(double(i) / (double(fir_size) - 1.0)); - } - - // These values could be configurable - catch_factor = 20000; - catch_factor2 = 4000; - pclamp = 150.0; - controlquant = 10000.0; - fir_empty = false; -} - -PIController::~PIController () -{ - delete [] offset_array; - delete [] window_array; -} - -double -PIController::get_ratio (int fill_level, int period_size) -{ - double offset = fill_level; - double this_catch_factor = catch_factor; - double this_catch_factor2 = catch_factor2 * 4096.0/(double)period_size; - - - // Save offset. - if( fir_empty ) { - for (int i = 0; i < smooth_size; i++) { - offset_array[i] = offset; - } - fir_empty = false; - } else { - offset_array[(offset_differential_index++) % smooth_size] = offset; - } - - // Build the mean of the windowed offset array basically fir lowpassing. - smooth_offset = 0.0; - for (int i = 0; i < smooth_size; i++) { - smooth_offset += offset_array[(i + offset_differential_index - 1) % smooth_size] * window_array[i]; - } - smooth_offset /= double(smooth_size); - - // This is the integral of the smoothed_offset - offset_integral += smooth_offset; - - std::cerr << smooth_offset << " "; - - // Clamp offset : the smooth offset still contains unwanted noise which would go straigth onto the resample coeff. - // It only used in the P component and the I component is used for the fine tuning anyways. - - if (fabs(smooth_offset) < pclamp) - smooth_offset = 0.0; - - smooth_offset += (static_resample_factor - resample_mean) * this_catch_factor; - - // Ok, now this is the PI controller. - // u(t) = K * (e(t) + 1/T \int e(t') dt') - // Kp = 1/catch_factor and T = catch_factor2 Ki = Kp/T - current_resample_factor - = static_resample_factor - smooth_offset / this_catch_factor - offset_integral / this_catch_factor / this_catch_factor2; - - // Now quantize this value around resample_mean, so that the noise which is in the integral component doesnt hurt. - current_resample_factor = floor((current_resample_factor - resample_mean) * controlquant + 0.5) / controlquant + resample_mean; - - // Calculate resample_mean so we can init ourselves to saner values. - // resample_mean = 0.9999 * resample_mean + 0.0001 * current_resample_factor; - resample_mean = (1.0-0.01) * resample_mean + 0.01 * current_resample_factor; - std::cerr << fill_level << " " << smooth_offset << " " << offset_integral << " " << current_resample_factor << " " << resample_mean << "\n"; - return current_resample_factor; -} - -void -PIController::out_of_bounds() -{ - int i; - // Set the resample_rate... we need to adjust the offset integral, to do this. - // first look at the PI controller, this code is just a special case, which should never execute once - // everything is swung in. - offset_integral = - (resample_mean - static_resample_factor) * catch_factor * catch_factor2; - // Also clear the array. we are beginning a new control cycle. - for (i = 0; i < smooth_size; i++) { - offset_array[i] = 0.0; - } - fir_empty = false; -} - - -PIChaser::PIChaser() { - pic = new PIController( 1.0, 16 ); - array_index = 0; - for( int i=0; i<ESTIMATOR_SIZE; i++ ) { - realtime_stamps[i] = 0; - chasetime_stamps[i] = 0; - } - - speed_threshold = 0.2; - pos_threshold = 4000; - want_locate_val = 0; -} - -void -PIChaser::reset() { - array_index = 0; - for( int i=0; i<ESTIMATOR_SIZE; i++ ) { - realtime_stamps[i] = 0; - chasetime_stamps[i] = 0; - } - pic->reset(1.0); -} -PIChaser::~PIChaser() { - delete pic; -} - -double -PIChaser::get_ratio(framepos_t chasetime_measured, framepos_t chasetime, framepos_t slavetime_measured, framepos_t slavetime, bool in_control, int period_size ) { - - feed_estimator( chasetime_measured, chasetime ); - std::cerr << (double)chasetime_measured/48000.0 << " " << chasetime << " " << slavetime << " "; - double crude = get_estimate(); - double fine; - framepos_t massaged_chasetime = chasetime + (framepos_t)( (double)(slavetime_measured - chasetime_measured) * crude ); - - fine = pic->get_ratio (slavetime - massaged_chasetime, period_size); - if (in_control) { - if (fabs(fine-crude) > crude*speed_threshold) { - std::cout << "reset to " << crude << " fine = " << fine << "\n"; - pic->reset( crude ); - speed = crude; - } else { - speed = fine; - } - - if (abs(chasetime-slavetime) > pos_threshold) { - pic->reset( crude ); - speed = crude; - want_locate_val = chasetime; - std::cout << "we are off by " << chasetime-slavetime << " want_locate:" << chasetime << "\n"; - } else { - want_locate_val = 0; - } - } else { - std::cout << "not in control..." << crude << "\n"; - speed = crude; - pic->reset( crude ); - } - - return speed; -} - -void -PIChaser::feed_estimator (framepos_t realtime, framepos_t chasetime ) { - array_index += 1; - realtime_stamps [ array_index%ESTIMATOR_SIZE ] = realtime; - chasetime_stamps[ array_index%ESTIMATOR_SIZE ] = chasetime; -} - -double -PIChaser::get_estimate() { - double est = 0; - int num=0; - int i; - framepos_t n1_realtime; - framepos_t n1_chasetime; - for( i=(array_index + 1); i<=(array_index + ESTIMATOR_SIZE); i++ ) { - if( realtime_stamps[(i)%ESTIMATOR_SIZE] ) { - n1_realtime = realtime_stamps[(i)%ESTIMATOR_SIZE]; - n1_chasetime = chasetime_stamps[(i)%ESTIMATOR_SIZE]; - i+=1; - break; - } - } - - for( ; i<=(array_index + ESTIMATOR_SIZE); i++ ) { - if( realtime_stamps[(i)%ESTIMATOR_SIZE] ) { - if( (realtime_stamps[(i)%ESTIMATOR_SIZE] - n1_realtime) > 200 ) { - framepos_t n_realtime = realtime_stamps[(i)%ESTIMATOR_SIZE]; - framepos_t n_chasetime = chasetime_stamps[(i)%ESTIMATOR_SIZE]; - est += ((double)( n_chasetime - n1_chasetime )) - / ((double)( n_realtime - n1_realtime )); - n1_realtime = n_realtime; - n1_chasetime = n_chasetime; - num += 1; - } - } - } - - if(num) - return est/(double)num; - else - return 0.0; -} diff --git a/libs/ardour/playlist.cc b/libs/ardour/playlist.cc index bb79801c9f..ef768cad96 100644 --- a/libs/ardour/playlist.cc +++ b/libs/ardour/playlist.cc @@ -1997,11 +1997,11 @@ Playlist::find_next_region (framepos_t frame, RegionPoint point, int dir) freeze (); /* add the added regions */ - for (RegionListProperty::ChangeContainer::iterator i = change.added.begin(); i != change.added.end(); ++i) { + for (RegionListProperty::ChangeContainer::const_iterator i = change.added.begin(); i != change.added.end(); ++i) { add_region_internal ((*i), (*i)->position()); } /* remove the removed regions */ - for (RegionListProperty::ChangeContainer::iterator i = change.removed.begin(); i != change.removed.end(); ++i) { + for (RegionListProperty::ChangeContainer::const_iterator i = change.removed.begin(); i != change.removed.end(); ++i) { remove_region (*i); } @@ -2488,7 +2488,7 @@ Playlist::uses_source (boost::shared_ptr<const Source> src) const { RegionReadLock rlock (const_cast<Playlist*> (this)); - for (set<boost::shared_ptr<Region> >::iterator r = all_regions.begin(); r != all_regions.end(); ++r) { + for (set<boost::shared_ptr<Region> >::const_iterator r = all_regions.begin(); r != all_regions.end(); ++r) { if ((*r)->uses_source (src)) { return true; } @@ -2533,7 +2533,7 @@ Playlist::region_by_id (const ID& id) const { /* searches all regions ever added to this playlist */ - for (set<boost::shared_ptr<Region> >::iterator i = all_regions.begin(); i != all_regions.end(); ++i) { + for (set<boost::shared_ptr<Region> >::const_iterator i = all_regions.begin(); i != all_regions.end(); ++i) { if ((*i)->id() == id) { return *i; } @@ -2809,7 +2809,14 @@ Playlist::combine (const RegionList& r) pl->in_partition = true; - for (RegionList::const_iterator i = r.begin(); i != r.end(); ++i) { + /* sort by position then layer. + * route_time_axis passes 'selected_regions' - which is not sorted. + * here we need the top-most first, then every layer's region sorted by position. + */ + RegionList sorted(r); + sorted.sort(RegionSortByLayerAndPosition()); + + for (RegionList::const_iterator i = sorted.begin(); i != sorted.end(); ++i) { /* copy the region */ @@ -3050,6 +3057,7 @@ Playlist::uncombine (boost::shared_ptr<Region> target) for (vector<boost::shared_ptr<Region> >::iterator i = originals.begin(); i != originals.end(); ++i) { add_region ((*i), (*i)->position()); + set_layer((*i), (*i)->layer()); } in_partition = false; diff --git a/libs/ardour/plugin.cc b/libs/ardour/plugin.cc index 9b2170c349..11d859ed8c 100644 --- a/libs/ardour/plugin.cc +++ b/libs/ardour/plugin.cc @@ -27,12 +27,16 @@ #include <cstdlib> #include <cstdio> // so libraptor doesn't complain #include <cmath> +#ifndef COMPILER_MSVC #include <dirent.h> +#endif #include <sys/stat.h> #include <cerrno> #include <utility> +#ifdef HAVE_LRDF #include <lrdf.h> +#endif #include "pbd/compose.h" #include "pbd/error.h" diff --git a/libs/ardour/plugin_insert.cc b/libs/ardour/plugin_insert.cc index ae018fb2a3..5279a36962 100644 --- a/libs/ardour/plugin_insert.cc +++ b/libs/ardour/plugin_insert.cc @@ -352,6 +352,9 @@ PluginInsert::connect_and_run (BufferSet& bufs, pframes_t nframes, framecnt_t of } } + bufs.set_count(ChanCount::max(bufs.count(), in_streams)); + bufs.set_count(ChanCount::max(bufs.count(), out_streams)); + /* Note that we've already required that plugins be able to handle in-place processing. */ @@ -452,13 +455,13 @@ PluginInsert::silence (framecnt_t nframes) } void -PluginInsert::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, pframes_t nframes, bool) +PluginInsert::run (BufferSet& bufs, framepos_t start_frame, framepos_t /*end_frame*/, pframes_t nframes, bool) { if (_pending_active) { /* run as normal if we are active or moving from inactive to active */ - if (_session.transport_rolling()) { - automation_run (bufs, nframes); + if (_session.transport_rolling() || _session.bounce_processing()) { + automation_run (bufs, start_frame, nframes); } else { connect_and_run (bufs, nframes, 0, false); } @@ -535,10 +538,10 @@ PluginInsert::get_parameter (Evoral::Parameter param) } void -PluginInsert::automation_run (BufferSet& bufs, pframes_t nframes) +PluginInsert::automation_run (BufferSet& bufs, framepos_t start, pframes_t nframes) { Evoral::ControlEvent next_event (0, 0.0f); - framepos_t now = _session.transport_frame (); + framepos_t now = start; framepos_t end = now + nframes; framecnt_t offset = 0; @@ -973,6 +976,22 @@ PluginInsert::set_state(const XMLNode& node, int version) boost::shared_ptr<Plugin> plugin = find_plugin (_session, prop->value(), type); + /* treat linux and windows VST plugins equivalent if they have the same uniqueID + * allow to move sessions windows <> linux */ +#ifdef LXVST_SUPPORT + if (plugin == 0 && type == ARDOUR::Windows_VST) { + type = ARDOUR::LXVST; + plugin = find_plugin (_session, prop->value(), type); + } +#endif + +#ifdef WINDOWS_VST_SUPPORT + if (plugin == 0 && type == ARDOUR::LXVST) { + type = ARDOUR::Windows_VST; + plugin = find_plugin (_session, prop->value(), type); + } +#endif + if (plugin == 0) { error << string_compose( _("Found a reference to a plugin (\"%1\") that is unknown.\n" diff --git a/libs/ardour/plugin_manager.cc b/libs/ardour/plugin_manager.cc index df1b7fc441..e596c67634 100644 --- a/libs/ardour/plugin_manager.cc +++ b/libs/ardour/plugin_manager.cc @@ -25,27 +25,33 @@ #include <sys/types.h> #include <cstdio> -#include <lrdf.h> -#include <dlfcn.h> #include <cstdlib> #include <fstream> +#ifdef HAVE_LRDF +#include <lrdf.h> +#endif + #ifdef WINDOWS_VST_SUPPORT +#include "ardour/vst_info_file.h" #include "fst.h" #include "pbd/basename.h" #include <cstring> #endif // WINDOWS_VST_SUPPORT #ifdef LXVST_SUPPORT +#include "ardour/vst_info_file.h" #include "ardour/linux_vst_support.h" #include "pbd/basename.h" #include <cstring> #endif //LXVST_SUPPORT +#include <glib/gstdio.h> #include <glibmm/miscutils.h> +#include <glibmm/pattern.h> -#include "pbd/pathscanner.h" #include "pbd/whitespace.h" +#include "pbd/file_utils.h" #include "ardour/debug.h" #include "ardour/filesystem_paths.h" @@ -55,6 +61,8 @@ #include "ardour/plugin_manager.h" #include "ardour/rc_configuration.h" +#include "ardour/search_paths.h" + #ifdef LV2_SUPPORT #include "ardour/lv2_plugin.h" #endif @@ -77,14 +85,17 @@ #include "i18n.h" +#include "ardour/debug.h" + using namespace ARDOUR; using namespace PBD; using namespace std; PluginManager* PluginManager::_instance = 0; +std::string PluginManager::scanner_bin_path = ""; PluginManager& -PluginManager::instance() +PluginManager::instance() { if (!_instance) { _instance = new PluginManager; @@ -98,10 +109,17 @@ PluginManager::PluginManager () , _ladspa_plugin_info(0) , _lv2_plugin_info(0) , _au_plugin_info(0) + , _cancel_scan(false) + , _cancel_timeout(false) { char* s; string lrdf_path; + string scan_p = Glib::build_filename(ARDOUR::ardour_dll_directory(), "fst"); + if (!PBD::find_file ( PBD::Searchpath(scan_p), "ardour-vst-scanner", scanner_bin_path)) { + PBD::warning << "VST scanner app (ardour-vst-scanner) not found in path " << scan_p << endmsg; + } + load_statuses (); if ((s = getenv ("LADSPA_RDF_PATH"))){ @@ -126,36 +144,38 @@ PluginManager::PluginManager () } #endif /* Native LinuxVST support*/ - if ((s = getenv ("LADSPA_PATH"))) { - ladspa_path = s; - } - if ((s = getenv ("VST_PATH"))) { windows_vst_path = s; } else if ((s = getenv ("VST_PLUGINS"))) { windows_vst_path = s; } + if (windows_vst_path.length() == 0) { + windows_vst_path = vst_search_path (); + } + if ((s = getenv ("LXVST_PATH"))) { lxvst_path = s; } else if ((s = getenv ("LXVST_PLUGINS"))) { lxvst_path = s; } - if (_instance == 0) { - _instance = this; + if (lxvst_path.length() == 0) { + lxvst_path = "/usr/local/lib64/lxvst:/usr/local/lib/lxvst:/usr/lib64/lxvst:/usr/lib/lxvst:" + "/usr/local/lib64/linux_vst:/usr/local/lib/linux_vst:/usr/lib64/linux_vst:/usr/lib/linux_vst:" + "/usr/lib/vst:/usr/local/lib/vst"; } - /* the plugin manager is constructed too early to use Profile */ + /* first time setup, use 'default' path */ + if (Config->get_plugin_path_lxvst() == X_("@default@")) { + Config->set_plugin_path_lxvst(get_default_lxvst_path()); + } + if (Config->get_plugin_path_vst() == X_("@default@")) { + Config->set_plugin_path_vst(get_default_windows_vst_path()); + } - if (getenv ("ARDOUR_SAE")) { - ladspa_plugin_whitelist.push_back (1203); // single band parametric - ladspa_plugin_whitelist.push_back (1772); // caps compressor - ladspa_plugin_whitelist.push_back (1913); // fast lookahead limiter - ladspa_plugin_whitelist.push_back (1075); // simple RMS expander - ladspa_plugin_whitelist.push_back (1061); // feedback delay line (max 5s) - ladspa_plugin_whitelist.push_back (1216); // gverb - ladspa_plugin_whitelist.push_back (2150); // tap pitch shifter + if (_instance == 0) { + _instance = this; } BootMessage (_("Discovering Plugins")); @@ -166,123 +186,154 @@ PluginManager::~PluginManager() { } - void -PluginManager::refresh () +PluginManager::refresh (bool cache_only) { DEBUG_TRACE (DEBUG::PluginManager, "PluginManager::refresh\n"); + _cancel_scan = false; + BootMessage (_("Scanning LADSPA Plugins")); ladspa_refresh (); #ifdef LV2_SUPPORT + BootMessage (_("Scanning LV2 Plugins")); lv2_refresh (); #endif #ifdef WINDOWS_VST_SUPPORT if (Config->get_use_windows_vst()) { - windows_vst_refresh (); + BootMessage (_("Scanning Windows VST Plugins")); + windows_vst_refresh (cache_only); } #endif // WINDOWS_VST_SUPPORT #ifdef LXVST_SUPPORT if(Config->get_use_lxvst()) { - lxvst_refresh(); + BootMessage (_("Scanning Linux VST Plugins")); + lxvst_refresh(cache_only); } #endif //Native linuxVST SUPPORT #ifdef AUDIOUNIT_SUPPORT + BootMessage (_("Scanning AU Plugins")); au_refresh (); #endif + BootMessage (_("Plugin Scan Complete...")); PluginListChanged (); /* EMIT SIGNAL */ + PluginScanMessage(X_("closeme"), "", false); + _cancel_scan = false; } void -PluginManager::ladspa_refresh () +PluginManager::cancel_plugin_scan () { - if (_ladspa_plugin_info) - _ladspa_plugin_info->clear (); - else - _ladspa_plugin_info = new ARDOUR::PluginInfoList (); + _cancel_scan = true; +} - static const char *standard_paths[] = { - "/usr/local/lib64/ladspa", - "/usr/local/lib/ladspa", - "/usr/lib64/ladspa", - "/usr/lib/ladspa", - "/Library/Audio/Plug-Ins/LADSPA", - "" - }; +void +PluginManager::cancel_plugin_timeout () +{ + _cancel_timeout = true; +} - /* allow LADSPA_PATH to augment, not override standard locations */ +void +PluginManager::clear_vst_cache () +{ + // see also libs/ardour/vst_info_file.cc - vstfx_infofile_path() +#ifdef WINDOWS_VST_SUPPORT + { + vector<string> fsi_files; + find_files_matching_regex (fsi_files, Config->get_plugin_path_vst(), "\\.fsi$"); + for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) { + ::g_unlink(i->c_str()); + } + } +#endif - /* Only add standard locations to ladspa_path if it doesn't - * already contain them. Check for trailing G_DIR_SEPARATOR too. - */ +#ifdef LXVST_SUPPORT + { + vector<string> fsi_files; + find_files_matching_regex (fsi_files, Config->get_plugin_path_lxvst(), "\\.fsi$"); + for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) { + ::g_unlink(i->c_str()); + } + } +#endif - int i; - for (i = 0; standard_paths[i][0]; i++) { - size_t found = ladspa_path.find(standard_paths[i]); - if (found != ladspa_path.npos) { - switch (ladspa_path[found + strlen(standard_paths[i])]) { - case ':' : - case '\0': - continue; - case G_DIR_SEPARATOR : - if (ladspa_path[found + strlen(standard_paths[i]) + 1] == ':' || - ladspa_path[found + strlen(standard_paths[i]) + 1] == '\0') { - continue; - } - } +#if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT) + { + string personal = get_personal_vst_info_cache_dir(); + vector<string> fsi_files; + find_files_matching_regex (fsi_files, personal, "\\.fsi$"); + for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) { + ::g_unlink(i->c_str()); } - if (!ladspa_path.empty()) - ladspa_path += ":"; + } +#endif +} - ladspa_path += standard_paths[i]; +void +PluginManager::clear_vst_blacklist () +{ +#ifdef WINDOWS_VST_SUPPORT + { + vector<string> fsi_files; + find_files_matching_regex (fsi_files, Config->get_plugin_path_vst(), "\\.fsb$"); + for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) { + ::g_unlink(i->c_str()); + } + } +#endif +#ifdef LXVST_SUPPORT + { + vector<string> fsi_files; + find_files_matching_regex (fsi_files, Config->get_plugin_path_lxvst(), "\\.fsb$"); + for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) { + ::g_unlink(i->c_str()); + } } +#endif - DEBUG_TRACE (DEBUG::PluginManager, string_compose ("LADSPA: search along: [%1]\n", ladspa_path)); +#if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT) + { + string personal = get_personal_vst_blacklist_dir(); - ladspa_discover_from_path (ladspa_path); + vector<string> fsi_files; + find_files_matching_regex (fsi_files, personal, "\\.fsb$"); + for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) { + ::g_unlink(i->c_str()); + } + } +#endif } - -int -PluginManager::add_ladspa_directory (string path) +void +PluginManager::ladspa_refresh () { - if (ladspa_discover_from_path (path) == 0) { - ladspa_path += ':'; - ladspa_path += path; - return 0; + if (_ladspa_plugin_info) { + _ladspa_plugin_info->clear (); + } else { + _ladspa_plugin_info = new ARDOUR::PluginInfoList (); } - return -1; -} -static bool ladspa_filter (const string& str, void */*arg*/) -{ - /* Not a dotfile, has a prefix before a period, suffix is "so" */ + /* allow LADSPA_PATH to augment, not override standard locations */ - return str[0] != '.' && (str.length() > 3 && str.find (".so") == (str.length() - 3)); -} + /* Only add standard locations to ladspa_path if it doesn't + * already contain them. Check for trailing G_DIR_SEPARATOR too. + */ -int -PluginManager::ladspa_discover_from_path (string /*path*/) -{ - PathScanner scanner; - vector<string *> *plugin_objects; - vector<string *>::iterator x; - int ret = 0; + vector<string> ladspa_modules; - plugin_objects = scanner (ladspa_path, ladspa_filter, 0, false, true); + DEBUG_TRACE (DEBUG::PluginManager, string_compose ("LADSPA: search along: [%1]\n", ladspa_search_path().to_string())); - if (plugin_objects) { - for (x = plugin_objects->begin(); x != plugin_objects->end (); ++x) { - ladspa_discover (**x); - } + find_files_matching_pattern (ladspa_modules, ladspa_search_path (), "*.so"); + find_files_matching_pattern (ladspa_modules, ladspa_search_path (), "*.dylib"); + find_files_matching_pattern (ladspa_modules, ladspa_search_path (), "*.dll"); - vector_delete (plugin_objects); + for (vector<std::string>::iterator i = ladspa_modules.begin(); i != ladspa_modules.end(); ++i) { + ARDOUR::PluginScanMessage(_("LADSPA"), *i, false); + ladspa_discover (*i); } - - return ret; } static bool rdf_filter (const string &str, void* /*arg*/) @@ -315,10 +366,9 @@ PluginManager::add_lxvst_presets() void PluginManager::add_presets(string domain) { - - PathScanner scanner; - vector<string *> *presets; - vector<string *>::iterator x; +#ifdef HAVE_LRDF + vector<string> presets; + vector<string>::iterator x; char* envvar; if ((envvar = getenv ("HOME")) == 0) { @@ -326,64 +376,64 @@ PluginManager::add_presets(string domain) } string path = string_compose("%1/.%2/rdf", envvar, domain); - presets = scanner (path, rdf_filter, 0, false, true); + find_files_matching_filter (presets, path, rdf_filter, 0, false, true); - if (presets) { - for (x = presets->begin(); x != presets->end (); ++x) { - string file = "file:" + **x; - if (lrdf_read_file(file.c_str())) { - warning << string_compose(_("Could not parse rdf file: %1"), *x) << endmsg; - } + for (x = presets.begin(); x != presets.end (); ++x) { + string file = "file:" + *x; + if (lrdf_read_file(file.c_str())) { + warning << string_compose(_("Could not parse rdf file: %1"), *x) << endmsg; } - - vector_delete (presets); } + +#endif } void PluginManager::add_lrdf_data (const string &path) { - PathScanner scanner; - vector<string *>* rdf_files; - vector<string *>::iterator x; +#ifdef HAVE_LRDF + vector<string> rdf_files; + vector<string>::iterator x; - rdf_files = scanner (path, rdf_filter, 0, false, true); + find_files_matching_filter (rdf_files, path, rdf_filter, 0, false, true); - if (rdf_files) { - for (x = rdf_files->begin(); x != rdf_files->end (); ++x) { - const string uri(string("file://") + **x); + for (x = rdf_files.begin(); x != rdf_files.end (); ++x) { + const string uri(string("file://") + *x); - if (lrdf_read_file(uri.c_str())) { - warning << "Could not parse rdf file: " << uri << endmsg; - } + if (lrdf_read_file(uri.c_str())) { + warning << "Could not parse rdf file: " << uri << endmsg; } - - vector_delete (rdf_files); } +#endif } int PluginManager::ladspa_discover (string path) { - void *module; + DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Checking for LADSPA plugin at %1\n", path)); + + Glib::Module module(path); const LADSPA_Descriptor *descriptor; LADSPA_Descriptor_Function dfunc; - const char *errstr; + void* func = 0; - if ((module = dlopen (path.c_str(), RTLD_NOW)) == 0) { - error << string_compose(_("LADSPA: cannot load module \"%1\" (%2)"), path, dlerror()) << endmsg; + if (!module) { + error << string_compose(_("LADSPA: cannot load module \"%1\" (%2)"), + path, Glib::Module::get_last_error()) << endmsg; return -1; } - dfunc = (LADSPA_Descriptor_Function) dlsym (module, "ladspa_descriptor"); - if ((errstr = dlerror()) != 0) { + if (!module.get_symbol("ladspa_descriptor", func)) { error << string_compose(_("LADSPA: module \"%1\" has no descriptor function."), path) << endmsg; - error << errstr << endmsg; - dlclose (module); + error << Glib::Module::get_last_error() << endmsg; return -1; } + dfunc = (LADSPA_Descriptor_Function)func; + + DEBUG_TRACE (DEBUG::PluginManager, string_compose ("LADSPA plugin found at %1\n", path)); + for (uint32_t i = 0; ; ++i) { if ((descriptor = dfunc (i)) == 0) { break; @@ -437,6 +487,8 @@ PluginManager::ladspa_discover (string path) if(!found){ _ladspa_plugin_info->push_back (info); } + + DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Found LADSPA plugin, name: %1, Inputs: %2, Outputs: %3\n", info->name, info->n_inputs, info->n_outputs)); } // GDB WILL NOT LIKE YOU IF YOU DO THIS @@ -448,6 +500,7 @@ PluginManager::ladspa_discover (string path) string PluginManager::get_ladspa_category (uint32_t plugin_id) { +#ifdef HAVE_LRDF char buf[256]; lrdf_statement pattern; @@ -505,6 +558,9 @@ PluginManager::get_ladspa_category (uint32_t plugin_id) } else { return label; } +#else + return ("Unknown"); +#endif } #ifdef LV2_SUPPORT @@ -531,7 +587,7 @@ PluginManager::au_refresh () #ifdef WINDOWS_VST_SUPPORT void -PluginManager::windows_vst_refresh () +PluginManager::windows_vst_refresh (bool cache_only) { if (_windows_vst_plugin_info) { _windows_vst_plugin_info->clear (); @@ -539,25 +595,10 @@ PluginManager::windows_vst_refresh () _windows_vst_plugin_info = new ARDOUR::PluginInfoList(); } - if (windows_vst_path.length() == 0) { - windows_vst_path = "/usr/local/lib/vst:/usr/lib/vst"; - } - - windows_vst_discover_from_path (windows_vst_path); -} - -int -PluginManager::add_windows_vst_directory (string path) -{ - if (windows_vst_discover_from_path (path) == 0) { - windows_vst_path += ':'; - windows_vst_path += path; - return 0; - } - return -1; + windows_vst_discover_from_path (Config->get_plugin_path_vst(), cache_only); } -static bool windows_vst_filter (const string& str, void *arg) +static bool windows_vst_filter (const string& str, void * /*arg*/) { /* Not a dotfile, has a prefix before a period, suffix is "dll" */ @@ -565,71 +606,95 @@ static bool windows_vst_filter (const string& str, void *arg) } int -PluginManager::windows_vst_discover_from_path (string path) +PluginManager::windows_vst_discover_from_path (string path, bool cache_only) { - PathScanner scanner; - vector<string *> *plugin_objects; - vector<string *>::iterator x; + vector<string> plugin_objects; + vector<string>::iterator x; int ret = 0; DEBUG_TRACE (DEBUG::PluginManager, string_compose ("detecting Windows VST plugins along %1\n", path)); - plugin_objects = scanner (windows_vst_path, windows_vst_filter, 0, false, true); - - if (plugin_objects) { - for (x = plugin_objects->begin(); x != plugin_objects->end (); ++x) { - windows_vst_discover (**x); - } + find_files_matching_filter (plugin_objects, Config->get_plugin_path_vst(), windows_vst_filter, 0, false, true); - vector_delete (plugin_objects); + for (x = plugin_objects.begin(); x != plugin_objects.end (); ++x) { + ARDOUR::PluginScanMessage(_("VST"), *x, !cache_only && !cancelled()); + windows_vst_discover (*x, cache_only || cancelled()); } return ret; } int -PluginManager::windows_vst_discover (string path) +PluginManager::windows_vst_discover (string path, bool cache_only) { - VSTInfo* finfo; - char buf[32]; + DEBUG_TRACE (DEBUG::PluginManager, string_compose ("windows_vst_discover '%1'\n", path)); - if ((finfo = fst_get_info (const_cast<char *> (path.c_str()))) == 0) { - warning << "Cannot get Windows VST information from " << path << endmsg; + _cancel_timeout = false; + vector<VSTInfo*> * finfos = vstfx_get_info_fst (const_cast<char *> (path.c_str()), + cache_only ? VST_SCAN_CACHE_ONLY : VST_SCAN_USE_APP); + + if (finfos->empty()) { + DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Cannot get Windows VST information from '%1'\n", path)); return -1; } - if (!finfo->canProcessReplacing) { - warning << string_compose (_("VST plugin %1 does not support processReplacing, and so cannot be used in %2 at this time"), - finfo->name, PROGRAM_NAME) - << endl; - } + uint32_t discovered = 0; + for (vector<VSTInfo *>::iterator x = finfos->begin(); x != finfos->end(); ++x) { + VSTInfo* finfo = *x; + char buf[32]; - PluginInfoPtr info (new WindowsVSTPluginInfo); + if (!finfo->canProcessReplacing) { + warning << string_compose (_("VST plugin %1 does not support processReplacing, and so cannot be used in %2 at this time"), + finfo->name, PROGRAM_NAME) + << endl; + continue; + } - /* what a joke freeware VST is */ + PluginInfoPtr info (new WindowsVSTPluginInfo); - if (!strcasecmp ("The Unnamed plugin", finfo->name)) { - info->name = PBD::basename_nosuffix (path); - } else { - info->name = finfo->name; - } + /* what a joke freeware VST is */ + + if (!strcasecmp ("The Unnamed plugin", finfo->name)) { + info->name = PBD::basename_nosuffix (path); + } else { + info->name = finfo->name; + } - snprintf (buf, sizeof (buf), "%d", finfo->UniqueID); - info->unique_id = buf; - info->category = "VST"; - info->path = path; - info->creator = finfo->creator; - info->index = 0; - info->n_inputs.set_audio (finfo->numInputs); - info->n_outputs.set_audio (finfo->numOutputs); - info->n_inputs.set_midi (finfo->wantMidi ? 1 : 0); - info->type = ARDOUR::Windows_VST; + snprintf (buf, sizeof (buf), "%d", finfo->UniqueID); + info->unique_id = buf; + info->category = "VST"; + info->path = path; + info->creator = finfo->creator; + info->index = 0; + info->n_inputs.set_audio (finfo->numInputs); + info->n_outputs.set_audio (finfo->numOutputs); + info->n_inputs.set_midi ((finfo->wantMidi&1) ? 1 : 0); + info->n_outputs.set_midi ((finfo->wantMidi&2) ? 1 : 0); + info->type = ARDOUR::Windows_VST; + + // TODO: check dup-IDs (lxvst AND windows vst) + bool duplicate = false; + + if (!_windows_vst_plugin_info->empty()) { + for (PluginInfoList::iterator i =_windows_vst_plugin_info->begin(); i != _windows_vst_plugin_info->end(); ++i) { + if ((info->type == (*i)->type)&&(info->unique_id == (*i)->unique_id)) { + warning << "Ignoring duplicate Windows VST plugin " << info->name << "\n"; + duplicate = true; + break; + } + } + } - _windows_vst_plugin_info->push_back (info); - fst_free_info (finfo); + if (!duplicate) { + DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Windows VST plugin ID '%1'\n", info->unique_id)); + _windows_vst_plugin_info->push_back (info); + discovered++; + } + } - return 0; + vstfx_free_info_list (finfos); + return discovered > 0 ? 0 : -1; } #endif // WINDOWS_VST_SUPPORT @@ -637,7 +702,7 @@ PluginManager::windows_vst_discover (string path) #ifdef LXVST_SUPPORT void -PluginManager::lxvst_refresh () +PluginManager::lxvst_refresh (bool cache_only) { if (_lxvst_plugin_info) { _lxvst_plugin_info->clear (); @@ -645,24 +710,7 @@ PluginManager::lxvst_refresh () _lxvst_plugin_info = new ARDOUR::PluginInfoList(); } - if (lxvst_path.length() == 0) { - lxvst_path = "/usr/local/lib64/lxvst:/usr/local/lib/lxvst:/usr/lib64/lxvst:/usr/lib/lxvst:" - "/usr/local/lib64/linux_vst:/usr/local/lib/linux_vst:/usr/lib64/linux_vst:/usr/lib/linux_vst:" - "/usr/lib/vst:/usr/local/lib/vst"; - } - - lxvst_discover_from_path (lxvst_path); -} - -int -PluginManager::add_lxvst_directory (string path) -{ - if (lxvst_discover_from_path (path) == 0) { - lxvst_path += ':'; - lxvst_path += path; - return 0; - } - return -1; + lxvst_discover_from_path (Config->get_plugin_path_lxvst(), cache_only); } static bool lxvst_filter (const string& str, void *) @@ -673,87 +721,102 @@ static bool lxvst_filter (const string& str, void *) } int -PluginManager::lxvst_discover_from_path (string path) +PluginManager::lxvst_discover_from_path (string path, bool cache_only) { - PathScanner scanner; - vector<string *> *plugin_objects; - vector<string *>::iterator x; + vector<string> plugin_objects; + vector<string>::iterator x; int ret = 0; - DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Discovering linuxVST plugins along %1\n", path)); +#ifndef NDEBUG + (void) path; +#endif - plugin_objects = scanner (lxvst_path, lxvst_filter, 0, false, true); + DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Discovering linuxVST plugins along %1\n", path)); - if (plugin_objects) { - for (x = plugin_objects->begin(); x != plugin_objects->end (); ++x) { - lxvst_discover (**x); - } + find_files_matching_filter (plugin_objects, Config->get_plugin_path_lxvst(), lxvst_filter, 0, false, true); - vector_delete (plugin_objects); + for (x = plugin_objects.begin(); x != plugin_objects.end (); ++x) { + ARDOUR::PluginScanMessage(_("LXVST"), *x, !cache_only && !cancelled()); + lxvst_discover (*x, cache_only || cancelled()); } return ret; } int -PluginManager::lxvst_discover (string path) +PluginManager::lxvst_discover (string path, bool cache_only) { - VSTInfo* finfo; - char buf[32]; - DEBUG_TRACE (DEBUG::PluginManager, string_compose ("checking apparent LXVST plugin at %1\n", path)); - if ((finfo = vstfx_get_info (const_cast<char *> (path.c_str()))) == 0) { + _cancel_timeout = false; + vector<VSTInfo*> * finfos = vstfx_get_info_lx (const_cast<char *> (path.c_str()), + cache_only ? VST_SCAN_CACHE_ONLY : VST_SCAN_USE_APP); + + if (finfos->empty()) { + DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Cannot get Linux VST information from '%1'\n", path)); return -1; } - if (!finfo->canProcessReplacing) { - warning << string_compose (_("linuxVST plugin %1 does not support processReplacing, and so cannot be used in %2 at this time"), - finfo->name, PROGRAM_NAME) - << endl; - } + uint32_t discovered = 0; + for (vector<VSTInfo *>::iterator x = finfos->begin(); x != finfos->end(); ++x) { + VSTInfo* finfo = *x; + char buf[32]; - PluginInfoPtr info(new LXVSTPluginInfo); + if (!finfo->canProcessReplacing) { + warning << string_compose (_("linuxVST plugin %1 does not support processReplacing, and so cannot be used in %2 at this time"), + finfo->name, PROGRAM_NAME) + << endl; + continue; + } - if (!strcasecmp ("The Unnamed plugin", finfo->name)) { - info->name = PBD::basename_nosuffix (path); - } else { - info->name = finfo->name; - } - - - snprintf (buf, sizeof (buf), "%d", finfo->UniqueID); - info->unique_id = buf; - info->category = "linuxVSTs"; - info->path = path; - info->creator = finfo->creator; - info->index = 0; - info->n_inputs.set_audio (finfo->numInputs); - info->n_outputs.set_audio (finfo->numOutputs); - info->n_inputs.set_midi (finfo->wantMidi ? 1 : 0); - info->type = ARDOUR::LXVST; - - /* Make sure we don't find the same plugin in more than one place along - the LXVST_PATH We can't use a simple 'find' because the path is included - in the PluginInfo, and that is the one thing we can be sure MUST be - different if a duplicate instance is found. So we just compare the type - and unique ID (which for some VSTs isn't actually unique...) - */ - - if (!_lxvst_plugin_info->empty()) { - for (PluginInfoList::iterator i =_lxvst_plugin_info->begin(); i != _lxvst_plugin_info->end(); ++i) { - if ((info->type == (*i)->type)&&(info->unique_id == (*i)->unique_id)) { - warning << "Ignoring duplicate Linux VST plugin " << info->name << "\n"; - vstfx_free_info(finfo); - return 0; + PluginInfoPtr info(new LXVSTPluginInfo); + + if (!strcasecmp ("The Unnamed plugin", finfo->name)) { + info->name = PBD::basename_nosuffix (path); + } else { + info->name = finfo->name; + } + + + snprintf (buf, sizeof (buf), "%d", finfo->UniqueID); + info->unique_id = buf; + info->category = "linuxVSTs"; + info->path = path; + info->creator = finfo->creator; + info->index = 0; + info->n_inputs.set_audio (finfo->numInputs); + info->n_outputs.set_audio (finfo->numOutputs); + info->n_inputs.set_midi ((finfo->wantMidi&1) ? 1 : 0); + info->n_outputs.set_midi ((finfo->wantMidi&2) ? 1 : 0); + info->type = ARDOUR::LXVST; + + /* Make sure we don't find the same plugin in more than one place along + the LXVST_PATH We can't use a simple 'find' because the path is included + in the PluginInfo, and that is the one thing we can be sure MUST be + different if a duplicate instance is found. So we just compare the type + and unique ID (which for some VSTs isn't actually unique...) + */ + + // TODO: check dup-IDs with windowsVST, too + bool duplicate = false; + if (!_lxvst_plugin_info->empty()) { + for (PluginInfoList::iterator i =_lxvst_plugin_info->begin(); i != _lxvst_plugin_info->end(); ++i) { + if ((info->type == (*i)->type)&&(info->unique_id == (*i)->unique_id)) { + warning << "Ignoring duplicate Linux VST plugin " << info->name << "\n"; + duplicate = true; + break; + } } } + + if (!duplicate) { + _lxvst_plugin_info->push_back (info); + discovered++; + } } - - _lxvst_plugin_info->push_back (info); - vstfx_free_info (finfo); - return 0; + vstfx_free_info_list (finfos); + return discovered > 0 ? 0 : -1; } #endif // LXVST_SUPPORT @@ -929,8 +992,7 @@ ARDOUR::PluginInfoList& PluginManager::lxvst_plugin_info () { #ifdef LXVST_SUPPORT - if (!_lxvst_plugin_info) - lxvst_refresh(); + assert(_lxvst_plugin_info); return *_lxvst_plugin_info; #else return _empty_plugin_info; @@ -940,8 +1002,7 @@ PluginManager::lxvst_plugin_info () ARDOUR::PluginInfoList& PluginManager::ladspa_plugin_info () { - if (!_ladspa_plugin_info) - ladspa_refresh(); + assert(_ladspa_plugin_info); return *_ladspa_plugin_info; } @@ -949,8 +1010,7 @@ ARDOUR::PluginInfoList& PluginManager::lv2_plugin_info () { #ifdef LV2_SUPPORT - if (!_lv2_plugin_info) - lv2_refresh(); + assert(_lv2_plugin_info); return *_lv2_plugin_info; #else return _empty_plugin_info; @@ -961,8 +1021,7 @@ ARDOUR::PluginInfoList& PluginManager::au_plugin_info () { #ifdef AUDIOUNIT_SUPPORT - if (!_au_plugin_info) - au_refresh(); + assert(_au_plugin_info); return *_au_plugin_info; #else return _empty_plugin_info; diff --git a/libs/ardour/po/cs.po b/libs/ardour/po/cs.po index 9554921194..31203f8a92 100644 --- a/libs/ardour/po/cs.po +++ b/libs/ardour/po/cs.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-11-05 11:11-0500\n" +"POT-Creation-Date: 2014-02-10 17:53+0100\n" "PO-Revision-Date: 2013-06-13 22:47+0200\n" "Last-Translator: Pavel Fric <pavelfric@seznam.cz>\n" "Language-Team: Czech <kde-i18n-doc@kde.org>\n" @@ -21,73 +21,73 @@ msgstr "" msgid "Fader" msgstr "ProlÃnaÄ" -#: audio_diskstream.cc:244 +#: audio_diskstream.cc:242 msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist" msgstr "AudioDiskstream: Seznam skladeb \"%1\" nenà seznamem zvukových skladeb" -#: audio_diskstream.cc:296 +#: audio_diskstream.cc:294 msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!" msgstr "" "AudioDiskstream %1: nenà žádný seznam skladeb, který by bylo lze kopÃrovat!" -#: audio_diskstream.cc:848 audio_diskstream.cc:858 +#: audio_diskstream.cc:846 audio_diskstream.cc:856 msgid "" "AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3" msgstr "" "AudioDiskstream %1: PÅ™i doplňovánà nelze ÄÃst %2 ze seznamu skladeb u snÃmku " "%3" -#: audio_diskstream.cc:1014 +#: audio_diskstream.cc:1012 msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3" msgstr "AudioDiskstream %1: Nelze ÄÃst %2 ze seznamu skladeb u snÃmku %3" -#: audio_diskstream.cc:1383 audio_diskstream.cc:1400 +#: audio_diskstream.cc:1381 audio_diskstream.cc:1398 msgid "AudioDiskstream %1: cannot write to disk" msgstr "AudioDiskstream %1: Nelze zapisovat na disk" -#: audio_diskstream.cc:1443 +#: audio_diskstream.cc:1441 msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!" msgstr "AudioDiskstream %1: Zachycená data nelze zapisovat na disk!" -#: audio_diskstream.cc:1537 +#: audio_diskstream.cc:1535 msgid "%1: could not create region for complete audio file" msgstr "%1: NepodaÅ™ilo se vytvoÅ™it oblast pro úplný zvukový soubor" -#: audio_diskstream.cc:1571 +#: audio_diskstream.cc:1569 msgid "AudioDiskstream: could not create region for captured audio!" msgstr "" "AudioDiskstream: NepodaÅ™ilo se vytvoÅ™it oblast pro zaznamenaný zvukový " "materiál!" -#: audio_diskstream.cc:1679 +#: audio_diskstream.cc:1677 msgid "programmer error: %1" msgstr "Chyba v programovánÃ: %1" -#: audio_diskstream.cc:1905 +#: audio_diskstream.cc:1903 msgid "AudioDiskstream: channel %1 out of range" msgstr "AudioDiskstream: Kanál %1 pÅ™ekroÄenà rozsahu" -#: audio_diskstream.cc:1919 midi_diskstream.cc:1210 +#: audio_diskstream.cc:1917 midi_diskstream.cc:1209 msgid "%1:%2 new capture file not initialized correctly" msgstr "%1:%2 nový záznamový soubor neinicializován správnÄ›" -#: audio_diskstream.cc:2200 +#: audio_diskstream.cc:2198 msgid "%1: cannot restore pending capture source file %2" msgstr "%1: Nelze obnovit pÅ™edběžný záznamový zdrojový soubor %2" -#: audio_diskstream.cc:2222 +#: audio_diskstream.cc:2220 msgid "%1: incorrect number of pending sources listed - ignoring them all" msgstr "" "%1: Seznam obsahuje nesprávný poÄet pÅ™edběžných zdrojů - vÅ¡echny jsou " "pÅ™ehlÞeny" -#: audio_diskstream.cc:2246 +#: audio_diskstream.cc:2244 msgid "%1: cannot create whole-file region from pending capture sources" msgstr "" "%1: Z pÅ™edběžných záznamových zdrojů nelze vytvoÅ™it žádnou oblast pro úplný " "soubor" -#: audio_library.cc:71 +#: audio_library.cc:81 msgid "Could not open %1. Audio Library not saved" msgstr "NepodaÅ™ilo se otevÅ™Ãt %1. Zvuková knihovna nebyla uložena" @@ -131,11 +131,11 @@ msgstr "Å patnÄ› utvoÅ™ený XML v zavedeném seznamu skladeb" msgid "Audio Playlists (unused)" msgstr "Seznamy zvukových skladeb (nepoužÃvané)" -#: audio_playlist_source.cc:171 audiosource.cc:913 file_source.cc:529 +#: audio_playlist_source.cc:171 audiosource.cc:891 file_source.cc:520 #: midi_playlist_source.cc:144 midi_playlist_source.cc:152 -#: midi_playlist_source.cc:159 midi_source.cc:371 plugin_insert.cc:643 -#: rb_effect.cc:333 session.cc:2619 session.cc:2652 session.cc:3797 -#: session_handle.cc:87 sndfilesource.cc:121 +#: midi_playlist_source.cc:159 midi_source.cc:370 plugin_insert.cc:634 +#: rb_effect.cc:333 session.cc:2636 session.cc:2669 session.cc:3814 +#: session_handle.cc:87 sndfilesource.cc:122 msgid "programming error: %1" msgstr "Chyba v programovánÃ: %1" @@ -163,23 +163,23 @@ msgstr "" "\n" "Kanály: " -#: audio_track.cc:167 +#: audio_track.cc:161 msgid "Unknown bundle \"%1\" listed for input of %2" msgstr "Neznámý kabel \"%1\" uvedený pro vstup %2" -#: audio_track.cc:169 +#: audio_track.cc:163 msgid "in 1" msgstr "in 1" -#: audio_track.cc:170 +#: audio_track.cc:164 msgid "No input bundles available as a replacement" msgstr "Nejsou žádné vhodné vstupnà kabely jako náhrada" -#: audio_track.cc:174 +#: audio_track.cc:168 msgid "Bundle %1 was not available - \"in 1\" used instead" msgstr "Kabel %1 nebyl dostupný - mÃsto nÄ›j se použÃvá \"in 1\"" -#: audio_track.cc:183 +#: audio_track.cc:177 msgid "improper input channel list in XML node (%1)" msgstr "Uzel XML (%1) obsahuje nevhodný seznam vstupnÃch kanálů" @@ -203,23 +203,23 @@ msgstr "Nelze nahrát pÅ™Ãdavný modul VAMP \"%1\"" msgid "VAMP Plugin \"%1\" could not be loaded" msgstr "PÅ™Ãdavný modul VAMP \"%1\" se nepodaÅ™ilo nahrát" -#: audioengine.cc:488 +#: audioengine.cc:495 msgid "looking for backends in %1\n" msgstr "" -#: audioengine.cc:511 +#: audioengine.cc:518 msgid "AudioEngine: cannot load module \"%1\" (%2)" msgstr "" -#: audioengine.cc:517 +#: audioengine.cc:524 msgid "AudioEngine: backend at \"%1\" has no descriptor function." msgstr "" -#: audioengine.cc:589 +#: audioengine.cc:596 msgid "Could not create backend for %1: %2" msgstr "" -#: audioregion.cc:1643 +#: audioregion.cc:1651 msgid "" "You have requested an operation that requires audio analysis.\n" "\n" @@ -244,11 +244,11 @@ msgstr "" "Tento dialog se znovu nezobrazÃ. Ale můžete si pÅ™i této a budoucÃch " "operacÃch s urÄenÃm pÅ™echodných dat vÅ¡imnout lehkého zpoždÄ›nÃ.\n" -#: audiosource.cc:199 +#: audiosource.cc:210 msgid "cannot rename peakfile for %1 from %2 to %3 (%4)" msgstr "Nelze pÅ™ejmenovat vrcholový soubor pro %1 z %2 na %3 (%4)" -#: audiosource.cc:226 +#: audiosource.cc:239 msgid "AudioSource: cannot stat peakfile \"%1\"" msgstr "AudioSource: Vrcholový soubor \"%1\" nenà zjevný" @@ -256,49 +256,70 @@ msgstr "AudioSource: Vrcholový soubor \"%1\" nenà zjevný" msgid "cannot read sample data for unscaled peak computation" msgstr "Nelze pÅ™eÄÃst vzorkovacà data neÅ¡kálovaný výpoÄet vrcholů" -#: audiosource.cc:387 +#: audiosource.cc:386 msgid "AudioSource: cannot open peakpath (a) \"%1\" (%2)" msgstr "AudioSource: Nelze otevÅ™Ãt cestu pro vrcholy (a) \"%1\" (%2)" -#: audiosource.cc:463 +#: audiosource.cc:395 audiosource.cc:473 +msgid "" +"AudioSource: could not seek to correct location in peak file \"%1\" (%2)" +msgstr "" + +#: audiosource.cc:453 msgid "AudioSource: cannot open peakpath (b) \"%1\" (%2)" msgstr "AudioSource: Nelze otevÅ™Ãt cestu pro vrcholy (b) \"%1\" (%2)" -#: audiosource.cc:587 +#: audiosource.cc:567 msgid "" "AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)" msgstr "" "AudioSource[%1]: Ätenà vrcholu - Nelze pÅ™eÄÃst %2 vzorky pÅ™i posunu %3 %4(%5)" -#: audiosource.cc:667 +#: audiosource.cc:634 msgid "%1: could not write read raw data for peak computation (%2)" msgstr "" "%1: NepodaÅ™ilo se pÅ™eÄÃst/zapsat nezpracovaná data pro výpoÄet vrcholů (%2)" -#: audiosource.cc:706 +#: audiosource.cc:672 msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)" msgstr "AudioSource: Nelze otevÅ™Ãt cestu pro vrcholy (c) \"%1\" (%2)" -#: audiosource.cc:773 audiosource.cc:886 +#: audiosource.cc:739 audiosource.cc:861 +msgid "%1: could not seek in peak file data (%2)" +msgstr "" + +#: audiosource.cc:744 audiosource.cc:870 msgid "%1: could not write peak file data (%2)" msgstr "%1: NepodaÅ™ilo se zapsat vrcholová data do souboru (%2)" -#: audiosource.cc:924 +#: audiosource.cc:903 msgid "could not truncate peakfile %1 to %2 (error: %3)" msgstr "NepodaÅ™ilo se zkrátit vrcholový soubor %1 na %2 (Chyba: %3)" -#: auditioner.cc:87 +#: auditioner.cc:95 +msgid "Falling back to Reasonable Synth for Midi Audition" +msgstr "" + +#: auditioner.cc:97 +msgid "No synth for midi-audition found." +msgstr "" + +#: auditioner.cc:152 msgid "no outputs available for auditioner - manual connection required" msgstr "Pro poslech nejsou dostupné žádné výstupy - požadováno ruÄnà pÅ™ipojenÃ" -#: auditioner.cc:135 -msgid "Auditioning of non-audio regions not yet supported" -msgstr "Poslech nezvukových oblastà jeÅ¡tÄ› nenà podporován" - -#: auditioner.cc:160 +#: auditioner.cc:392 auditioner.cc:438 msgid "Cannot setup auditioner processing flow for %1 channels" msgstr "Nelze nastavit signálový tok poslechu pro %1 kanály" +#: auditioner.cc:426 +msgid "Failed to load synth for MIDI-Audition." +msgstr "" + +#: auditioner.cc:445 +msgid "Auditioning of regions other than Audio or Midi is not supported." +msgstr "" + #: automatable.cc:81 msgid "Automation node has no path property" msgstr "Uzel automatizace nemá žádnou vlastnost \"cesta\"" @@ -337,24 +358,24 @@ msgstr "" "Seznam automatizace: Uzel XML s názvem %1, nepÅ™edán \"AutomationList\" - " "pÅ™ehlÞà se" -#: butler.cc:91 +#: butler.cc:80 msgid "Cannot create transport request signal pipe (%1)" msgstr "" "Nelze vytvoÅ™it vedenà signálu pro požadavky na pÅ™ehrávánà (transport) (%1)" -#: butler.cc:97 butler.cc:103 +#: butler.cc:86 butler.cc:92 msgid "UI: cannot set O_NONBLOCK on butler request pipe (%1)" msgstr "UI: Nelze nastavit O_NONBLOCK pro vedenà požadavku sluhy (%1)" -#: butler.cc:109 +#: butler.cc:124 msgid "Session: could not create butler thread" msgstr "SezenÃ: NepodaÅ™ilo se vytvoÅ™it vlákno sluhy" -#: butler.cc:156 +#: butler.cc:165 msgid "poll on butler request pipe failed (%1)" msgstr "průzkum na vedenà požadavku sluhy se nezdaÅ™il (%1)" -#: butler.cc:163 +#: butler.cc:172 msgid "Error on butler thread request pipe: fd=%1 err=%2" msgstr "Chyba ve vedenà požadavku vlákna sluhy: fd=%1 err=%2" @@ -362,55 +383,55 @@ msgstr "Chyba ve vedenà požadavku vlákna sluhy: fd=%1 err=%2" msgid "Error reading from butler request pipe" msgstr "Chyba pÅ™i Ätenà vedenà požadavku sluhy" -#: butler.cc:248 +#: butler.cc:301 msgid "Butler read ahead failure on dstream %1" msgstr "Chyba pÅ™i Ätenà sluhy u dstream %1" -#: butler.cc:285 +#: butler.cc:338 msgid "Butler write-behind failure on dstream %1" msgstr "Chyba pÅ™i zápisu sluhy u dstream %1" -#: control_protocol_manager.cc:134 +#: control_protocol_manager.cc:164 msgid "control protocol name \"%1\" has no descriptor" msgstr "Název kontrolnÃho protokolu \"%1\" nemá žádný popis" -#: control_protocol_manager.cc:141 +#: control_protocol_manager.cc:171 msgid "control protocol name \"%1\" could not be initialized" msgstr "Kontrolnà protokol \"%1\" se nepodaÅ™ilo inicializovat" -#: control_protocol_manager.cc:201 +#: control_protocol_manager.cc:237 msgid "Instantiating mandatory control protocol %1" msgstr "Doloženà povinného kontrolnÃho protokolu %1" -#: control_protocol_manager.cc:222 +#: control_protocol_manager.cc:258 msgid "looking for control protocols in %1\n" msgstr "Hledánà kontrolnÃho protokolu v %1\n" -#: control_protocol_manager.cc:247 +#: control_protocol_manager.cc:283 msgid "Control protocol %1 not usable" msgstr "Kontrolnà protokol %1 nepoužitelný" -#: control_protocol_manager.cc:264 +#: control_protocol_manager.cc:300 msgid "Control surface protocol discovered: \"%1\"\n" msgstr "Protokol pro kontrolnà povrch odkryt: \"%1\"\n" -#: control_protocol_manager.cc:282 +#: control_protocol_manager.cc:318 msgid "ControlProtocolManager: cannot load module \"%1\" (%2)" msgstr "ControlProtocolManager: Nelze nahrát modul \"%1\" (%2)" -#: control_protocol_manager.cc:290 +#: control_protocol_manager.cc:324 msgid "ControlProtocolManager: module \"%1\" has no descriptor function." msgstr "ControlProtocolManager: Modul \"%1\" nemá žádnou funkci k popisu" -#: cycle_timer.cc:38 +#: cycle_timer.cc:40 msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo" msgstr "CycleTimer::get_mhz(): Nelze otevÅ™Ãt /proc/cpuinfo" -#: cycle_timer.cc:50 +#: cycle_timer.cc:52 msgid "CycleTimer::get_mhz(): cannot locate cpu MHz in /proc/cpuinfo" msgstr "CycleTimer::get_mhz(): Nelze nalézt takt CPU (MHz) v /proc/cpuinfo" -#: cycle_timer.cc:73 +#: cycle_timer.cc:75 msgid "cannot locate cpu MHz in /proc/cpuinfo" msgstr "Nelze nalézt takt CPU (MHz) v /proc/cpuinfo" @@ -418,7 +439,7 @@ msgstr "Nelze nalézt takt CPU (MHz) v /proc/cpuinfo" msgid "audio" msgstr "Zvuk" -#: data_type.cc:28 session.cc:1791 session.cc:1794 +#: data_type.cc:28 session.cc:1808 session.cc:1811 msgid "MIDI" msgstr "MIDI" @@ -426,15 +447,15 @@ msgstr "MIDI" msgid "unknown" msgstr "Neznámý" -#: delivery.cc:114 +#: delivery.cc:118 msgid "main outs" msgstr "Hlavnà výstupy" -#: delivery.cc:117 send.cc:61 +#: delivery.cc:121 send.cc:62 msgid "listen" msgstr "Poslech" -#: diskstream.cc:303 +#: diskstream.cc:302 msgid "Location \"%1\" not valid for track loop (start >= end)" msgstr "ÄŒasový bod \"%1\" pro smyÄku stopy neplatný (ZaÄátek >= Konec)" @@ -448,24 +469,24 @@ msgstr "" msgid "Export failed: %1" msgstr "Vyvedenà se nezdaÅ™ilo: %1" -#: export_filename.cc:118 +#: export_filename.cc:119 msgid "Existing export folder for this session (%1) does not exist - ignored" msgstr "" "StávajÃcà složka pro vyvedenà pro toto sezenà (%1) neexistuje - pÅ™ehlÞà se" -#: export_filename.cc:229 +#: export_filename.cc:230 msgid "No Time" msgstr "Žádný Äas" -#: export_filename.cc:238 +#: export_filename.cc:239 msgid "Invalid time format" msgstr "Neplatný Äasový formát" -#: export_filename.cc:247 +#: export_filename.cc:248 msgid "No Date" msgstr "Žádné datum" -#: export_filename.cc:262 +#: export_filename.cc:263 msgid "Invalid date format" msgstr "Neplatný formát data" @@ -533,7 +554,7 @@ msgstr "TrojúhelnÃkový" msgid "Rectangular" msgstr "ObdélnÃkový" -#: export_formats.cc:52 session.cc:5014 session.cc:5030 +#: export_formats.cc:52 session.cc:5006 session.cc:5022 msgid "None" msgstr "Žádný" @@ -573,15 +594,15 @@ msgstr "Vzorkovacà formát Vorbis" msgid "No sample format" msgstr "Žádný vzorkovacà formát" -#: export_handler.cc:335 +#: export_handler.cc:343 msgid "Editor: cannot open \"%1\" as export file for CD marker file" msgstr "Editor: Nelze otevÅ™Ãt \"%1\" jako soubor vyvedenà pro znaÄku CD" -#: export_handler.cc:417 export_handler.cc:420 +#: export_handler.cc:425 export_handler.cc:428 msgid "an error occured while writing a TOC/CUE file: %1" msgstr "PÅ™i zápisu souboru TOC/CUE se vyskytla chyba:%1" -#: export_handler.cc:642 export_handler.cc:700 +#: export_handler.cc:650 export_handler.cc:708 msgid "Cannot convert %1 to Latin-1 text" msgstr "Nelze pÅ™evést %1 na kódovánà Latin-1" @@ -644,7 +665,7 @@ msgid "" msgstr "" "% podporuje jen %2 kanály, ale ve vaÅ¡em nastavenà kanálů se nacházà %3 kanál" -#: file_source.cc:198 session_state.cc:2807 +#: file_source.cc:198 session_state.cc:2843 msgid "" "there are already 1000 files with names like %1; versioning discontinued" msgstr "Je již 1000 souborů s názvem, jako je %1; verzovánà skonÄeno" @@ -653,31 +674,29 @@ msgstr "Je již 1000 souborů s názvem, jako je %1; verzovánà skonÄeno" msgid "cannot rename file source from %1 to %2 (%3)" msgstr "Nelze pÅ™ejmenovat zdroj souboru z %1 na %2 (%3)" -#: file_source.cc:250 file_source.cc:378 +#: file_source.cc:248 file_source.cc:372 msgid "FileSource: search path not set" msgstr "Zdroj souboru: Cesta hledánà nenastavena" -#: file_source.cc:313 file_source.cc:448 -msgid "Filesource: cannot find required file (%1): while searching %2" -msgstr "Zdroj souboru: Nelze najÃt požadovaný soubor (%1) pÅ™i prohledávánà %2" +#: file_source.cc:309 file_source.cc:439 +msgid "Filesource: cannot find required file (%1)" +msgstr "" -#: file_source.cc:440 +#: file_source.cc:432 msgid "" -"FileSource: \"%1\" is ambigous when searching %2\n" +"FileSource: \"%1\" is ambigous when searching\n" "\t" msgstr "" -"Zdroj souboru: \"%1\" je pÅ™i prohledávánà %2 nejednoznaÄný\n" -"\t" -#: file_source.cc:494 +#: file_source.cc:484 msgid "Filesource: cannot find required file (%1): %2" msgstr "Zdroj souboru: Nelze najÃt požadovaný soubor (%1): %2" -#: file_source.cc:501 +#: file_source.cc:492 msgid "Filesource: cannot check for existing file (%1): %2" msgstr "Zdroj souboru: U souboru (%1) nelze ověřit, zda existuje: %2" -#: file_source.cc:535 +#: file_source.cc:526 msgid "" "Programming error! %1 tried to rename a file over another file! It's safe to " "continue working, but please report this to the developers." @@ -686,7 +705,7 @@ msgstr "" "existujÃcÃm názvem! Můžete bezpeÄnÄ› pracovat dál, ale nahlaÅ¡te to, prosÃm, " "vývojářům." -#: file_source.cc:540 +#: file_source.cc:531 msgid "cannot rename file %1 to %2 (%3)" msgstr "Nelze pÅ™ejmenovat soubor %1 na %2 (%3)" @@ -702,15 +721,15 @@ msgstr "" "Adresář pro nastavenà %1 již existuje, nenà ale žádný adresář/složka - nelze " "spustit" -#: filesystem_paths.cc:91 +#: filesystem_paths.cc:96 msgid "ARDOUR_DLL_PATH not set in environment - exiting\n" msgstr "PromÄ›nná prostÅ™edà ARDOUR_DLL_PATH nenà nastavena - ukonÄuje se\n" -#: filesystem_paths.cc:107 +#: filesystem_paths.cc:125 msgid "ARDOUR_CONFIG_PATH not set in environment - exiting\n" msgstr "PromÄ›nná prostÅ™edà ARDOUR_CONFIG_PATH nenà nastavena - ukonÄuje se\n" -#: filesystem_paths.cc:127 +#: filesystem_paths.cc:148 msgid "ARDOUR_DATA_PATH not set in environment - exiting\n" msgstr "PromÄ›nná prostÅ™edà ARDOUR_DATA_PATH nenà nastavena - ukonÄuje se\n" @@ -722,89 +741,85 @@ msgstr "Filtr: Chyba pÅ™i vytvářenà názvu pro nový soubor z %1" msgid "filter: error creating new file %1 (%2)" msgstr "Filtr: Chyba pÅ™i vytvářenà nového souboru %1 (%2)" -#: find_session.cc:51 -msgid "Could not resolve path: %1 (%2)" -msgstr "NepodaÅ™ilo se vyÅ™eÅ¡it cestu: %1 (%2)" - -#: find_session.cc:63 +#: find_session.cc:59 msgid "cannot check session path %1 (%2)" msgstr "Nelze ověřit cestu sezenà %1 (%2)" -#: find_session.cc:89 +#: find_session.cc:85 msgid "cannot check statefile %1 (%2)" msgstr "Nelze ověřit soubor sezenà %1 (%2)" -#: find_session.cc:125 +#: find_session.cc:121 msgid "%1 is not a snapshot file" msgstr "%1 nenà souborem se snÃmkem" -#: find_session.cc:142 +#: find_session.cc:138 msgid "cannot determine current working directory (%1)" msgstr "Nelze urÄit nynÄ›jÅ¡Ã pracovnà adresář (%1)" -#: find_session.cc:159 +#: find_session.cc:155 msgid "unknown file type for session %1" msgstr "Neznámý typ souboru pro sezenà %1" -#: globals.cc:207 +#: globals.cc:216 msgid "Could not set system open files limit to \"unlimited\"" msgstr "" "NepodaÅ™ilo se nastavit systémové omezenà pro otevÅ™ené soubory na \"neomezeno" "\"" -#: globals.cc:209 +#: globals.cc:218 msgid "Could not set system open files limit to %1" msgstr "NepodaÅ™ilo se nastavit systémové omezenà pro otevÅ™ené soubory na %1" -#: globals.cc:213 +#: globals.cc:222 msgid "Your system is configured to limit %1 to only %2 open files" msgstr "VaÅ¡e systémové nastavenà omezuje %1 na jen %2 otevÅ™ené soubory" -#: globals.cc:217 +#: globals.cc:226 msgid "Could not get system open files limit (%1)" msgstr "NepodaÅ™ilo se dostat systémové omezenà pro otevÅ™ené soubory (%1)" -#: globals.cc:268 +#: globals.cc:280 msgid "Loading configuration" msgstr "Nahrává se nastavenÃ" -#: import.cc:207 +#: import.cc:208 msgid "Could not find a source for %1 even though we are updating this file!" msgstr "NepodaÅ™ilo se najÃt zdroj pro %1, i když se tento soubor aktualizuje!" -#: import.cc:236 +#: import.cc:237 msgid "Unable to create file %1 during import" msgstr "Soubor %1 nelze bÄ›hem zavádÄ›nà vytvoÅ™it" -#: import.cc:262 +#: import.cc:263 msgid "Resampling %1 from %2kHz to %3kHz" msgstr "PÅ™evzorkovánà %1 z %2 kHz na %3 kHz" -#: import.cc:268 +#: import.cc:269 msgid "Copying %1" msgstr "KopÃruje se %1" -#: import.cc:446 +#: import.cc:455 msgid "Track %1 of %2 contained no usable MIDI data" msgstr "Stopa %1 z %2 neobsahovala žádná užiteÄná data MIDI" -#: import.cc:453 +#: import.cc:462 msgid "MIDI file %1 was not readable (no reason available)" msgstr "Soubor MIDI %1 nebyl Äitelný (žádná pÅ™ÃÄina se nedá urÄit)" -#: import.cc:499 +#: import.cc:508 msgid "Import: cannot open input sound file \"%1\"" msgstr "ZavedenÃ: Nelze otevÅ™Ãt vstupnà zvukový soubor \"%1\"" -#: import.cc:510 +#: import.cc:519 msgid "Import: error opening MIDI file" msgstr "ZavedenÃ: Chyba pÅ™i otevÃránà souboru MIDI" -#: import.cc:549 +#: import.cc:558 msgid "Loading MIDI file %1" msgstr "Nahrává se soubor MIDI %1" -#: import.cc:614 +#: import.cc:623 msgid "Failed to remove some files after failed/cancelled import operation" msgstr "" "NepodaÅ™ilo se odstranit nÄ›které soubory po nezdaÅ™eném/pÅ™eruÅ¡eném zavedenÃ" @@ -817,120 +832,124 @@ msgstr "Neznámý" msgid "preset %1 (bank %2)" msgstr "PÅ™ednastavenà %1 (banka %2)" -#: internal_send.cc:278 internal_send.cc:279 +#: internal_send.cc:300 internal_send.cc:301 msgid "%1 - cannot find any track/bus with the ID %2 to connect to" msgstr "%1 - Nelze najÃt stopu/sbÄ›rnici s ID %2 ke spojenà s" -#: io.cc:208 +#: io.cc:209 msgid "IO: cannot disconnect port %1 from %2" msgstr "IO: PÅ™Ãpojku %1 nelze oddÄ›lit od %2" -#: io.cc:343 io.cc:428 +#: io.cc:344 io.cc:431 msgid "IO: cannot register input port %1" msgstr "IO: Nelze zapsat vstupnà pÅ™Ãpojku %1" -#: io.cc:348 io.cc:433 +#: io.cc:349 io.cc:436 msgid "IO: cannot register output port %1" msgstr "IO: Nelze zapsat výstupnà pÅ™Ãpojku %1" -#: io.cc:591 io.cc:647 +#: io.cc:598 io.cc:654 msgid "incorrect XML node \"%1\" passed to IO object" msgstr "Nesprávný uzel XML \"%1\" odevzdán objektu IO" -#: io.cc:706 +#: io.cc:713 msgid "in" msgstr "vst" -#: io.cc:706 +#: io.cc:713 msgid "out" msgstr "výst" -#: io.cc:707 +#: io.cc:714 msgid "input" msgstr "Vstup" -#: io.cc:707 +#: io.cc:714 msgid "output" msgstr "Výstup" -#: io.cc:717 +#: io.cc:724 msgid "Unknown bundle \"%1\" listed for %2 of %3" msgstr "Neznámý kabel \"%1\"uvedený pro %2 %3" -#: io.cc:783 +#: io.cc:790 msgid "Bundle %1 was not available - \"%2\" used instead" msgstr "Kabel %1 nebyl dostupný - mÃsto nÄ›j se použÃvá \"%2\" " -#: io.cc:786 +#: io.cc:793 msgid "No %1 bundles available as a replacement" msgstr "Žádné %1 kabely dostupné jako náhrada" -#: io.cc:889 +#: io.cc:896 msgid "%1: cannot create I/O ports" msgstr "%1: Nelze vytvoÅ™it pÅ™Ãpojky vstup/výstup" -#: io.cc:1017 io.cc:1121 +#: io.cc:1024 io.cc:1128 msgid "IO: badly formed string in XML node for inputs \"%1\"" msgstr "IO: Å patnÄ› utvoÅ™ený Å™etÄ›zec v uzlu XML pro vstupy \"%1\"" -#: io.cc:1022 io.cc:1126 +#: io.cc:1029 io.cc:1133 msgid "bad input string in XML node \"%1\"" msgstr "IO: Å patný Å™etÄ›zec pro vstup v uzlu XML \"%1\"" -#: io.cc:1060 +#: io.cc:1067 msgid "IO: badly formed string in XML node for outputs \"%1\"" msgstr "IO: Å patnÄ› utvoÅ™ený Å™etÄ›zec v uzlu XML pro výstupy \"%1\"" -#: io.cc:1065 +#: io.cc:1072 msgid "IO: bad output string in XML node \"%1\"" msgstr "IO: Å patný Å™etÄ›zec pro výstup v uzlu XML \"%1\"" -#: io.cc:1411 +#: io.cc:1417 #, c-format msgid "%s %u" msgstr "%s %u" -#: io.cc:1458 +#: io.cc:1464 #, c-format msgid "%s in" msgstr "%s vstup" -#: io.cc:1460 +#: io.cc:1466 #, c-format msgid "%s out" msgstr "%s výstup" -#: io.cc:1535 session.cc:686 session.cc:715 +#: io.cc:1541 session.cc:689 session.cc:718 msgid "mono" msgstr "Mono" -#: io.cc:1537 session.cc:699 session.cc:729 +#: io.cc:1543 session.cc:702 session.cc:732 msgid "L" msgstr "L" -#: io.cc:1537 session.cc:701 session.cc:731 +#: io.cc:1543 session.cc:704 session.cc:734 msgid "R" msgstr "P" -#: io.cc:1539 io.cc:1545 +#: io.cc:1545 io.cc:1551 #, c-format msgid "%d" msgstr "%d" -#: ladspa_plugin.cc:86 +#: ladspa_plugin.cc:93 +msgid "LADSPA: Unable to open module: " +msgstr "" + +#: ladspa_plugin.cc:99 msgid "LADSPA: module has no descriptor function." msgstr "LADSPA: Modul nemá žádnou funkci popisu" -#: ladspa_plugin.cc:91 +#: ladspa_plugin.cc:106 msgid "LADSPA: plugin has gone away since discovery!" msgstr "LADSPA: PÅ™Ãdavný modul už nenà vÃce nalezitelný!" -#: ladspa_plugin.cc:98 +#: ladspa_plugin.cc:113 msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing" msgstr "" "LADSPA: \"%1\" nemůže být použit, neboÅ¥ nedÄ›lá žádný \"inplace processing\"" -#: ladspa_plugin.cc:297 +#: ladspa_plugin.cc:311 msgid "" "illegal parameter number used with plugin \"%1\". This may indicate a change " "in the plugin design, and presets may be invalid" @@ -938,35 +957,31 @@ msgstr "" "Å patné ÄÃslo parametru pro pÅ™Ãdavný modul \"%1\". To může znaÄit zmÄ›nu v " "návrhupÅ™Ãdavného modulu, a pÅ™ednastavenà jsou pÅ™ÃpadnÄ› neplatná" -#: ladspa_plugin.cc:376 ladspa_plugin.cc:426 +#: ladspa_plugin.cc:390 ladspa_plugin.cc:440 msgid "Bad node sent to LadspaPlugin::set_state" msgstr "Å patný uzel poslán LadspaPlugin::set_state" -#: ladspa_plugin.cc:391 ladspa_plugin.cc:440 +#: ladspa_plugin.cc:405 ladspa_plugin.cc:454 msgid "LADSPA: no ladspa port number" msgstr "LADSPA: Žádné ÄÃslo pÅ™Ãpojky LADSPA" -#: ladspa_plugin.cc:397 ladspa_plugin.cc:446 +#: ladspa_plugin.cc:411 ladspa_plugin.cc:460 msgid "LADSPA: no ladspa port data" msgstr "LADSPA: Žádná data pÅ™Ãpojky LADSPA" -#: ladspa_plugin.cc:717 -msgid "LADSPA: cannot load module from \"%1\"" -msgstr "LADSPA: Nelze nahrát modul z \"%1\"" - -#: ladspa_plugin.cc:827 +#: ladspa_plugin.cc:840 msgid "Could not locate HOME. Preset not removed." msgstr "NepodaÅ™ilo se najÃt HOME. PÅ™ednastavenà neodstranÄ›no." -#: ladspa_plugin.cc:864 ladspa_plugin.cc:870 +#: ladspa_plugin.cc:879 ladspa_plugin.cc:885 msgid "Could not create %1. Preset not saved. (%2)" msgstr "NepodaÅ™ilo se vytvoÅ™it %1. PÅ™ednastavenà neuloženo. (%2)" -#: ladspa_plugin.cc:877 +#: ladspa_plugin.cc:892 msgid "Error saving presets file %1." msgstr "Chyba pÅ™i ukládánà souboru s pÅ™ednastavenÃm %1." -#: ladspa_plugin.cc:915 +#: ladspa_plugin.cc:934 msgid "Could not locate HOME. Preset not saved." msgstr "NepodaÅ™ilo se najÃt HOME. PÅ™ednastavenà neuloženo." @@ -1006,7 +1021,7 @@ msgstr "Locations: Pokus o použità neznámé polohy jako vybrané polohy" msgid "incorrect XML mode passed to Locations::set_state" msgstr "Nesprávný uzel XML pÅ™edán dál Locations::set_state" -#: location.cc:842 session.cc:4516 session_state.cc:1031 +#: location.cc:842 session.cc:4533 session_state.cc:1025 msgid "session" msgstr "SezenÃ" @@ -1071,42 +1086,41 @@ msgid "Session and LTC framerate mismatch: LTC:%1 Session:%2." msgstr "Rychlost snÃmkovánà sezenà a LTC se liÅ¡Ã: LTC: %1 SezenÃ: %2." #: ltc_slave.cc:591 -#, c-format msgid "flywheel" msgstr "SetrvaÄnÃk" -#: midi_diskstream.cc:167 +#: midi_diskstream.cc:166 msgid "" "%1: I/O configuration change %4 requested to use %2, but channel setup is %3" msgstr "" "%1: ZmÄ›na nastavenà vstupu/výstupu %4 použije %2, ale poÄet kanálů je %3" -#: midi_diskstream.cc:219 +#: midi_diskstream.cc:218 msgid "MidiDiskstream: Playlist \"%1\" isn't a midi playlist" msgstr "MidiDiskstream: Seznam skladeb \"%1\" nenà seznamem skladeb MIDI" -#: midi_diskstream.cc:270 +#: midi_diskstream.cc:269 msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!" msgstr "" "MidiDiskstream %1: nenà žádný seznam skladeb, který by bylo lze kopÃrovat!" -#: midi_diskstream.cc:699 +#: midi_diskstream.cc:698 msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3" msgstr "MidiDiskstream %1: Nelze ÄÃst %2 ze seznamu skladeb u snÃmku %3" -#: midi_diskstream.cc:834 +#: midi_diskstream.cc:833 msgid "MidiDiskstream %1: cannot write to disk" msgstr "MidiDiskstream %1: Nelze zapisovat na disk" -#: midi_diskstream.cc:868 +#: midi_diskstream.cc:867 msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!" msgstr "MidiDiskstream %1: Zachycená data nelze zapisovat na disk!" -#: midi_diskstream.cc:955 +#: midi_diskstream.cc:954 msgid "%1: could not create region for complete midi file" msgstr "%1: NepodaÅ™ilo se vytvoÅ™it oblast pro úplný soubor MIDI" -#: midi_diskstream.cc:992 +#: midi_diskstream.cc:991 msgid "MidiDiskstream: could not create region for captured midi!" msgstr "" "MidiDiskstream: NepodaÅ™ilo se vytvoÅ™it oblast pro zaznamenaný materiál MIDI!" @@ -1119,27 +1133,27 @@ msgstr "Nenalezeno žádné NoteID pro zmÄ›nu vlastnosti \"note\" - pÅ™ehlÞà msgid "No SysExID found for sys-ex property change - ignored" msgstr "Nenalezeno žádné SysExID pro zmÄ›nu vlastnosti \"sys-ex\" - pÅ™ehlÞà se" -#: midi_model.cc:2010 +#: midi_model.cc:2012 msgid "transpose" msgstr "PÅ™evést" -#: midi_patch_manager.cc:126 +#: midi_patch_manager.cc:127 msgid "Duplicate MIDI device `%1' in `%2' ignored" msgstr "Zdvojenà zaÅ™Ãzenà MIDI `%1' v `%2' se pÅ™ehlÞÃ" -#: midi_source.cc:125 +#: midi_source.cc:124 msgid "Missing parameter property on InterpolationStyle" msgstr "ChybÄ›jÃcà vlastnost \"parameter\" u InterpolationStyle" -#: midi_source.cc:132 +#: midi_source.cc:131 msgid "Missing style property on InterpolationStyle" msgstr "ChybÄ›jÃcà vlastnost \"style\" u InterpolationStyle" -#: midi_source.cc:144 +#: midi_source.cc:143 msgid "Missing parameter property on AutomationState" msgstr "ChybÄ›jÃcà vlastnost \"parameter\" u AutomationState" -#: midi_source.cc:151 +#: midi_source.cc:150 msgid "Missing state property on AutomationState" msgstr "ChybÄ›jÃcà vlastnost \"state\" u AutomationState" @@ -1183,11 +1197,11 @@ msgstr "Ovládánà polarity" msgid "solo control" msgstr "Ovládánà sóla" -#: mtc_slave.cc:238 +#: mtc_slave.cc:240 msgid "MTC Slave: atomic read of current time failed, sleeping!" msgstr "MTC Slave: Chyba pÅ™i atomickém Ätenà nynÄ›jÅ¡Ãho Äasu, spánek!" -#: mtc_slave.cc:361 +#: mtc_slave.cc:362 msgid "" "Unknown rate/drop value %1 in incoming MTC stream, session values used " "instead" @@ -1195,11 +1209,11 @@ msgstr "" "Neznámá hodnota %1 pro rychlost snÃmkovánÃ/zahozené snÃmky v pÅ™ÃchozÃm " "datovém proudu MTC, mÃsto nà se použÃvajà hodnoty sezenÃ" -#: mtc_slave.cc:381 +#: mtc_slave.cc:382 msgid "Session framerate adjusted from %1 TO: MTC's %2." msgstr "Rychlost snÃmkovánà sezenà zmÄ›nÄ›na z %1 na MTC: %2" -#: mtc_slave.cc:395 +#: mtc_slave.cc:396 msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3." msgstr "Rychlost snÃmkovánà sezenà a MTC se neshodujÃ: MTC: %1 %2:%3." @@ -1259,33 +1273,37 @@ msgstr "KopÃrovat oblast s pevnÄ› stanoveným Äasem" msgid "Pannable given XML data for %1 - ignored" msgstr "CÃli vyváženà pÅ™edána data XML pro %1 - pÅ™ehlÞà se" -#: panner_manager.cc:76 -msgid "looking for panners in %1" -msgstr "Hledánà vyváženà v %1" +#: panner_manager.cc:80 +msgid "looking for panners in %1\n" +msgstr "" -#: panner_manager.cc:100 -msgid "Panner discovered: \"%1\" in %2" -msgstr "Vyváženà nalezeno: \"%1\" v %2" +#: panner_manager.cc:108 +msgid "Panner discovered: \"%1\" in %2\n" +msgstr "" -#: panner_manager.cc:117 +#: panner_manager.cc:125 msgid "PannerManager: cannot load module \"%1\" (%2)" msgstr "SprávceVyváženÃ: Nelze nahrát modul \"%1\" (%2)" -#: panner_manager.cc:124 +#: panner_manager.cc:132 msgid "PannerManager: module \"%1\" has no descriptor function." msgstr "SprávceVyváženÃ: Modul \"%1\" nemá žádnou funkci popisu" -#: panner_manager.cc:187 +#: panner_manager.cc:219 msgid "no panner discovered for in/out = %1/%2" msgstr "Nenalezeno žádné vyváženà pro vstupy/výstupy %1/%2" -#: panner_shell.cc:179 +#: panner_shell.cc:126 +msgid "select panner: %1\n" +msgstr "" + +#: panner_shell.cc:245 msgid "Unknown panner plugin \"%1\" found in pan state - ignored" msgstr "" "Ve stavu vyváženà nalezen neznámý pÅ™Ãdavný modul pro vyváženà \"%1\" - " "pÅ™ehlÞà se" -#: panner_shell.cc:185 +#: panner_shell.cc:251 msgid "panner plugin node has no type information!" msgstr "Uzel pÅ™Ãdavného modulu pro vyváženà nemá žádnou informaci o typu!" @@ -1305,19 +1323,19 @@ msgstr "Žádné ID seznamu skladeb v XML zdroje seznamu skladeb!" msgid "Could not construct playlist for PlaylistSource from session data!" msgstr "NepodaÅ™ilo se sestavit seznam skladeb ze zdrojových dat sezenÃ!" -#: plugin.cc:324 +#: plugin.cc:328 msgid "" "Plugin presets are not supported in this build of %1. Consider paying for a " "full version" msgstr "" -#: plugin.cc:398 +#: plugin.cc:402 msgid "" "Saving plugin settings is not supported in this build of %1. Consider paying " "for the full version" msgstr "" -#: plugin_insert.cc:598 +#: plugin_insert.cc:589 msgid "programming error: " msgstr "Chyba v programovánÃ:" @@ -1354,23 +1372,23 @@ msgid "PluginInsert: automatable control %1 not found - ignored" msgstr "" "PluginInsert: automatizovatelný prvek ovládánà %1 nenalezen - pÅ™ehlÞà se" -#: plugin_manager.cc:161 +#: plugin_manager.cc:165 msgid "Discovering Plugins" msgstr "Hledánà pÅ™Ãdavných modulů" -#: plugin_manager.cc:335 +#: plugin_manager.cc:286 msgid "Could not parse rdf file: %1" msgstr "NepodaÅ™ilo se zpracovat soubor RDF: %1" -#: plugin_manager.cc:374 +#: plugin_manager.cc:330 msgid "LADSPA: cannot load module \"%1\" (%2)" msgstr "LADSPA: Nelze nahrát modul \"%1\" (%2)" -#: plugin_manager.cc:381 +#: plugin_manager.cc:337 msgid "LADSPA: module \"%1\" has no descriptor function." msgstr "LADSPA: Modul \"%1\" nemá žádnou funkci popisu." -#: plugin_manager.cc:602 +#: plugin_manager.cc:567 msgid "" "VST plugin %1 does not support processReplacing, and so cannot be used in %2 " "at this time" @@ -1378,7 +1396,7 @@ msgstr "" "PÅ™Ãdavný modul VST %1 nepodporuje processReplacing a z toho důvodu jej nynà " "nelze v %2 použÃt" -#: plugin_manager.cc:709 +#: plugin_manager.cc:680 msgid "" "linuxVST plugin %1 does not support processReplacing, and so cannot be used " "in %2 at this time" @@ -1386,16 +1404,16 @@ msgstr "" "PÅ™Ãdavný modul linuxVST %1 nepodporuje processReplacing a z toho důvodu jej " "nynà nelze v %2 použÃt" -#: plugin_manager.cc:870 +#: plugin_manager.cc:841 msgid "unknown plugin status type \"%1\" - all entries ignored" msgstr "" "Neznámý typ stavu pÅ™Ãdavného modulu\"%1\" - vÅ¡echny záznamy se pÅ™ehlÞÃ" -#: plugin_manager.cc:887 +#: plugin_manager.cc:858 msgid "unknown plugin type \"%1\" - ignored" msgstr "Neznámý typ pÅ™Ãdavného modulu \"%1\" - pÅ™ehlÞà se" -#: port.cc:410 +#: port.cc:412 msgid "could not reregister %1" msgstr "NepodaÅ™ilo se znovu zaregistrovat %1" @@ -1403,11 +1421,11 @@ msgstr "NepodaÅ™ilo se znovu zaregistrovat %1" msgid "insert %1" msgstr "Vložit %1" -#: port_insert.cc:198 +#: port_insert.cc:197 msgid "XML node describing port insert is missing the `type' field" msgstr "Uzlu XML k popisu pÅ™Ãpojky chybà pole \"type\"" -#: port_insert.cc:203 +#: port_insert.cc:202 msgid "non-port insert XML used for port plugin insert" msgstr "" "XML pro vloženà ne-pÅ™Ãpojky použito ke vloženà pÅ™Ãdavného modulu pÅ™Ãpojky" @@ -1442,11 +1460,11 @@ msgstr "AudioEngine: Nelze spojit %1 (%2) s %3 (%4)" msgid "Re-establising port %1 failed" msgstr "" -#: processor.cc:207 +#: processor.cc:208 msgid "No %1 property flag in element %2" msgstr "Žádný pÅ™Ãznak pro vlastnost \"%1\" v prvku %2" -#: processor.cc:216 +#: processor.cc:217 msgid "No child node with active property" msgstr "Žádný uzel potomka s vlastnostà \"Äinný\"" @@ -1514,11 +1532,11 @@ msgstr "%1 spojen-%2.1 (%3)" msgid "cannot create new name for region \"%1\"" msgstr "Nelze vytvoÅ™it nový název pro oblast \"%1\"" -#: resampled_source.cc:98 +#: resampled_source.cc:102 msgid "Import: %1" msgstr "ZavedenÃ: %1" -#: resampled_source.cc:128 +#: resampled_source.cc:132 srcfilesource.cc:76 msgid "Import: src_new() failed : %1" msgstr "ZavedenÃ: Chyba v src_new() : %1" @@ -1526,30 +1544,30 @@ msgstr "ZavedenÃ: Chyba v src_new() : %1" msgid "return %1" msgstr "Vrácená hodnota: %1" -#: route.cc:1075 route.cc:2528 +#: route.cc:1081 route.cc:2541 msgid "unknown Processor type \"%1\"; ignored" msgstr "Neznámý typ procesoru \"%1\"; pÅ™ehlÞà se" -#: route.cc:1087 +#: route.cc:1093 msgid "processor could not be created. Ignored." msgstr "Procesor se nepodaÅ™ilo vytvoÅ™it. PÅ™ehlÞà se." -#: route.cc:1962 route.cc:2187 +#: route.cc:1975 route.cc:2200 msgid "Bad node sent to Route::set_state() [%1]" msgstr "Å patný uzel poslán Route::set_state() [%1]" -#: route.cc:2022 +#: route.cc:2035 msgid "Pannable state found for route (%1) without a panner!" msgstr "" "Nalezen stav cÃle vyváženà pro cestu (%1), aniž by bylo nalezeno vyváženÃ!" -#: route.cc:2096 route.cc:2100 route.cc:2301 route.cc:2305 +#: route.cc:2109 route.cc:2113 route.cc:2314 route.cc:2318 msgid "badly formed order key string in state file! [%1] ... ignored." msgstr "" "Å patnÄ› utvoÅ™ený Å™etÄ›zec znaků pro klÃÄ poÅ™adà roztÅ™ÃdÄ›nà v souboru sezenÃ! " "[%1] ... PÅ™ehlÞà se." -#: route.cc:2311 +#: route.cc:2324 msgid "Converting deprecated order key for %1 using Editor order %2" msgstr "" @@ -1565,15 +1583,15 @@ msgstr "tempoize: Chyba pÅ™i Ätenà dat z %1 v %2 (žádáno %3, obdrženo %4)" msgid "error writing tempo-adjusted data to %1" msgstr "Chyba pÅ™i zápisu dat s upraveným tempem do %1" -#: send.cc:59 +#: send.cc:60 msgid "aux %1" msgstr "Pomocné (Aux) %1" -#: send.cc:63 +#: send.cc:64 msgid "send %1" msgstr "Poslánà (send) %1" -#: send.cc:65 +#: send.cc:66 msgid "programming error: send created using role %1" msgstr "Chyba v programovánÃ: Poslánà vytvoÅ™eno pomocà role %1" @@ -1597,60 +1615,60 @@ msgstr "" msgid "Set up standard connections" msgstr "Nastavit standardnà spojenÃ" -#: session.cc:635 +#: session.cc:638 msgid "could not setup Click I/O" msgstr "NepodaÅ™ilo se nastavit vstup/výstup metronomu" -#: session.cc:683 +#: session.cc:686 #, c-format msgid "out %<PRIu32>" msgstr "Výstup %<PRIu32>" -#: session.cc:697 +#: session.cc:700 #, c-format msgid "out %<PRIu32>+%<PRIu32>" msgstr "Výstup %<PRIu32>+%<PRIu32>" -#: session.cc:712 +#: session.cc:715 #, c-format msgid "in %<PRIu32>" msgstr "Vstup %<PRIu32>" -#: session.cc:726 +#: session.cc:729 #, c-format msgid "in %<PRIu32>+%<PRIu32>" msgstr "Vstup %<PRIu32>+%<PRIu32>" -#: session.cc:790 +#: session.cc:793 msgid "cannot connect master output %1 to %2" msgstr "Nelze spojit hlavnà výstup %1 s %2" -#: session.cc:849 +#: session.cc:862 msgid "monitor" msgstr "SledovánÃ" -#: session.cc:894 +#: session.cc:907 msgid "cannot connect control input %1 to %2" msgstr "Nelze spojit vstup ovládánà %1 s %2" -#: session.cc:914 +#: session.cc:927 msgid "The preferred I/O for the monitor bus (%1) cannot be found" msgstr "UpÅ™ednostňovaný vstup/výstup pro sledovacà sbÄ›rnici (%1) nelze najÃt" -#: session.cc:945 +#: session.cc:958 msgid "cannot connect control output %1 to %2" msgstr "Nelze spojit výstup ovládánà %1 s %2" -#: session.cc:1009 +#: session.cc:1026 msgid "cannot create Auditioner: no auditioning of regions possible" msgstr "Nelze vytvoÅ™it poslechový systém: Žádný poslech oblastà nenà možný" -#: session.cc:1193 +#: session.cc:1210 msgid "Session: you can't use that location for auto punch (start <= end)" msgstr "" "SezenÃ: Tuto polohu nelze pro automatický pÅ™epis použÃt (ZaÄátek <= Konec) " -#: session.cc:1233 +#: session.cc:1250 msgid "" "You cannot use this location for auto-loop because it has zero or negative " "length" @@ -1658,15 +1676,15 @@ msgstr "" "Tuto polohu nelze pro automatickou smyÄku použÃt, protože nemá žádnou, nebo " "má zápornou délku" -#: session.cc:1547 +#: session.cc:1564 msgid "feedback loop setup between %1 and %2" msgstr "SmyÄka zpÄ›tné vazby rozpoznána mezi %1 a %2" -#: session.cc:1843 +#: session.cc:1860 msgid "Session: could not create new midi track." msgstr "SezenÃ: NepodaÅ™ilo se vytvoÅ™it novou stopu MIDI" -#: session.cc:1849 +#: session.cc:1866 msgid "" "No more JACK ports are available. You will need to stop %1 and restart JACK " "with more ports if you need this many tracks." @@ -1674,75 +1692,75 @@ msgstr "" "Nejsou dostupné dalÅ¡Ã pÅ™Ãpojky JACK. Pokud potÅ™ebujete tolik stop, musÃte " "zastavit %1 a spustit JACK znovu s vÃce pÅ™Ãpojkami." -#: session.cc:2026 session.cc:2029 +#: session.cc:2043 session.cc:2046 msgid "Audio" msgstr "Zvuk" -#: session.cc:2053 session.cc:2061 session.cc:2138 session.cc:2146 +#: session.cc:2070 session.cc:2078 session.cc:2155 session.cc:2163 msgid "cannot configure %1 in/%2 out configuration for new audio track" msgstr "Nelze nastavit %1 nastavenà vstup/%2 výstup pro novou zvukovou stopu" -#: session.cc:2084 +#: session.cc:2101 msgid "Session: could not create new audio track." msgstr "SezenÃ: NepodaÅ™ilo se vytvoÅ™it novou zvukovou stopu" -#: session.cc:2116 session.cc:2119 +#: session.cc:2133 session.cc:2136 msgid "Bus" msgstr "SbÄ›rnice" -#: session.cc:2169 +#: session.cc:2186 msgid "Session: could not create new audio route." msgstr "SezenÃ: NepodaÅ™ilo se vytvoÅ™it novou zvukovou cestu" -#: session.cc:2228 session.cc:2238 +#: session.cc:2245 session.cc:2255 msgid "Session: UINT_MAX routes? impossible!" msgstr "SezenÃ: Cesty UINT_MAX? Nemožné!" -#: session.cc:2260 +#: session.cc:2277 msgid "Session: cannot create track/bus from template description" msgstr "SezenÃ: Nelze vytvoÅ™it stopu/sbÄ›rnici z popisu pÅ™edlohy" -#: session.cc:2286 +#: session.cc:2303 msgid "Session: could not create new route from template" msgstr "SezenÃ: NepodaÅ™ilo se vytvoÅ™it novou cestu z pÅ™edlohy" -#: session.cc:2315 +#: session.cc:2332 msgid "Adding new tracks/busses failed" msgstr "Chyba pÅ™i pÅ™idávánà nové stopy/sbÄ›rnice" -#: session.cc:3419 +#: session.cc:3436 msgid "FATAL ERROR! Could not find a suitable version of %1 for a rename" msgstr "OSUDOVà CHYBA! NepodaÅ™ilo se najÃt vhodnou verzi %1 pro pÅ™ejmenovánÃ" -#: session.cc:3539 session.cc:3597 +#: session.cc:3556 session.cc:3614 msgid "There are already %1 recordings for %2, which I consider too many." msgstr "Již je %1 nahrávek pro %2, což je pÅ™ÃliÅ¡ mnoho." -#: session.cc:3987 +#: session.cc:4004 msgid "send ID %1 appears to be in use already" msgstr "Zdá se, že ID poslánà (send) %1, se již použÃvá" -#: session.cc:3999 +#: session.cc:4016 msgid "aux send ID %1 appears to be in use already" msgstr "Zdá se, že ID pomocného-poslánà (aux-send) %1, se již použÃvá" -#: session.cc:4011 +#: session.cc:4028 msgid "return ID %1 appears to be in use already" msgstr "Zdá se, že ID vrácenà (return) %1, se již použÃvá" -#: session.cc:4023 +#: session.cc:4040 msgid "insert ID %1 appears to be in use already" msgstr "Zdá se, že ID vloženà (insert) %1, se již použÃvá" -#: session.cc:4150 +#: session.cc:4167 msgid "Cannot write a range where end <= start (e.g. %1 <= %2)" msgstr "Nelze zapsat oblast s Konec <= ZaÄátek (napÅ™. %1 <= %2)" -#: session.cc:4179 +#: session.cc:4196 msgid "too many bounced versions of playlist \"%1\"" msgstr "PÅ™ÃliÅ¡ mnoho odhozených verzà seznamu skladeb \"%1\"" -#: session.cc:4189 +#: session.cc:4206 msgid "cannot create new audio file \"%1\" for %2" msgstr "Nelze vytvoÅ™it nový zvukový soubor \"%1\" pro %2" @@ -1781,7 +1799,7 @@ msgstr "Nelze vytvoÅ™it adresář se sezenÃm v cestÄ› %1. Chyba: %2" msgid "Session subdirectory does not exist at path %1" msgstr "Adresář se sezenÃm v cestÄ› %1 neexistuje" -#: session_events.cc:184 +#: session_events.cc:185 msgid "Session: cannot have two events of type %1 at the same frame (%2)." msgstr "SezenÃ: Nenà možné mÃt ve stejném snÃmku (%2) dvÄ› události typu %1." @@ -1793,7 +1811,7 @@ msgstr "%1: Polohu souboru %2 nelze vyhledat pro vyvedenÃ" msgid "Export ended unexpectedly: %1" msgstr "Vyvedenà skonÄilo neoÄekávanÄ›: %1" -#: session_ltc.cc:222 +#: session_ltc.cc:221 msgid "" "LTC encoder: invalid framerate - LTC encoding is disabled for the remainder " "of this session." @@ -1801,7 +1819,7 @@ msgstr "" "Kodér LTC: Neplatná rychlost snÃmkovánà - Kódovánà LTC je pro zbývajÃcà Äást " "tohoto sezenà zakázáno." -#: session_midi.cc:520 +#: session_midi.cc:519 msgid "Session: cannot send quarter-frame MTC message (%1)" msgstr "SezenÃ: Nelze poslat quarter-frame MTC (%1)" @@ -1813,92 +1831,88 @@ msgstr "SezenÃ: Nelze vytvoÅ™it seznam skladeb z popisu XML" msgid "Session: error in no roll for %1" msgstr "SezenÃ: Chyba v no_roll pro %1" -#: session_process.cc:1157 +#: session_process.cc:1159 msgid "Programming error: illegal event type in process_event (%1)" msgstr "Chyba v programovánÃ: Neplatný typ události v process_event (%1)" -#: session_state.cc:140 -msgid "Could not use path %1 (%2)" -msgstr "NepodaÅ™ilo se použÃt cestu %1 (%2)" - -#: session_state.cc:184 +#: session_state.cc:178 msgid "solo cut control (dB)" msgstr "Nastavenà Solo Cut (dB)" -#: session_state.cc:208 +#: session_state.cc:202 msgid "Set block size and sample rate" msgstr "Nastavit velikost bloku a vzorkovacà kmitoÄet" -#: session_state.cc:213 +#: session_state.cc:207 msgid "Using configuration" msgstr "PoužÃvané nastavenÃ" -#: session_state.cc:325 +#: session_state.cc:319 msgid "Reset Remote Controls" msgstr "Nastavit dálkové ovládánà znovu" -#: session_state.cc:417 +#: session_state.cc:411 msgid "Session: cannot create session peakfile folder \"%1\" (%2)" msgstr "SezenÃ: Nelze vytvoÅ™it složku Peakfile \"%1\" (%2)" -#: session_state.cc:424 +#: session_state.cc:418 msgid "Session: cannot create session sounds dir \"%1\" (%2)" msgstr "SezenÃ: Nelze vytvoÅ™it adresář sezenà pro zvuková data \"%1\" (%2)" -#: session_state.cc:431 +#: session_state.cc:425 msgid "Session: cannot create session midi dir \"%1\" (%2)" msgstr "SezenÃ: Nelze vytvoÅ™it adresář sezenà pro MIDI \"%1\" (%2)" -#: session_state.cc:438 +#: session_state.cc:432 msgid "Session: cannot create session dead sounds folder \"%1\" (%2)" msgstr "" "SezenÃ: Nelze vytvoÅ™it odpadkový koÅ¡ sezenà pro zahozený zvuk \"%1\" (%2)" -#: session_state.cc:445 +#: session_state.cc:439 msgid "Session: cannot create session export folder \"%1\" (%2)" msgstr "SezenÃ: Nelze vytvoÅ™it složku sezenà pro vyvedené soubory \"%1\" (%2)" -#: session_state.cc:452 +#: session_state.cc:446 msgid "Session: cannot create session analysis folder \"%1\" (%2)" msgstr "SezenÃ: Nelze vytvoÅ™it složku sezenà pro data rozboru \"%1\" (%2)" -#: session_state.cc:459 +#: session_state.cc:453 msgid "Session: cannot create session plugins folder \"%1\" (%2)" msgstr "SezenÃ: Nelze vytvoÅ™it složku sezenà pro pÅ™Ãdavné moduly \"%1\" (%2)" -#: session_state.cc:466 +#: session_state.cc:460 msgid "Session: cannot create session externals folder \"%1\" (%2)" msgstr "SezenÃ: Nelze vytvoÅ™it složku sezenà pro vnÄ›jÅ¡Ã \"%1\" (%2)" -#: session_state.cc:480 +#: session_state.cc:474 msgid "Session: cannot create session folder \"%1\" (%2)" msgstr "SezenÃ: Nelze vytvoÅ™it složku sezenà \"%1\" (%2)" -#: session_state.cc:514 +#: session_state.cc:508 msgid "Could not open %1 for writing session template" msgstr "NepodaÅ™ilo se otevÅ™Ãt %1 pro zápis pÅ™edlohy sezenÃ" -#: session_state.cc:520 +#: session_state.cc:514 msgid "Could not open session template %1 for reading" msgstr "NepodaÅ™ilo se otevÅ™Ãt pÅ™edlohu sezenà %1 pro ÄtenÃ" -#: session_state.cc:539 +#: session_state.cc:533 msgid "master" msgstr "Master" -#: session_state.cc:600 +#: session_state.cc:594 msgid "Could not remove pending capture state at path \"%1\" (%2)" msgstr "NepodaÅ™ilo se odstranit pÅ™edběžný stav nahrávánà v cestÄ› \"%1\" (%2)" -#: session_state.cc:624 +#: session_state.cc:618 msgid "could not rename snapshot %1 to %2 (%3)" msgstr "NepodaÅ™ilo se pÅ™ejmenovat snÃmek obrazovky %1 na %2 (%3)" -#: session_state.cc:652 +#: session_state.cc:646 msgid "Could not remove session file at path \"%1\" (%2)" msgstr "NepodaÅ™ilo se odstranit soubor se sezenÃm v cestÄ› \"%1\" (%2)" -#: session_state.cc:669 +#: session_state.cc:663 msgid "" "the %1 audio engine is not connected and state saving would lose all I/O " "connections. Session not saved" @@ -1906,134 +1920,134 @@ msgstr "" "Zvukový stroj %1 nenà spojen, a pÅ™i ukládánà stavu by doÅ¡lo ke ztrátÄ› vÅ¡ech " "spojenà vstup/výstup. Sezenà neuloženo" -#: session_state.cc:720 +#: session_state.cc:714 msgid "state could not be saved to %1" msgstr "Stav se do %1 uložit nepodaÅ™ilo" -#: session_state.cc:722 session_state.cc:733 +#: session_state.cc:716 session_state.cc:727 msgid "Could not remove temporary session file at path \"%1\" (%2)" msgstr "NepodaÅ™ilo se odstranit doÄasný soubor se sezenÃm v cestÄ› \"%1\" (%2)" -#: session_state.cc:730 -msgid "could not rename temporary session file %1 to %2" -msgstr "NepodaÅ™ilo se pÅ™ejmenovat doÄasný soubor se sezenÃm %1 na %2" +#: session_state.cc:724 +msgid "could not rename temporary session file %1 to %2 (%3)" +msgstr "" -#: session_state.cc:798 +#: session_state.cc:792 msgid "%1: session file \"%2\" doesn't exist!" msgstr "%1: Soubor se sezenÃm \"%2\" neexistuje!" -#: session_state.cc:810 +#: session_state.cc:804 msgid "Could not understand session file %1" msgstr "NepodaÅ™ilo se porozumÄ›t souboru se sezenÃm\"%1\"" -#: session_state.cc:819 +#: session_state.cc:813 msgid "Session file %1 is not a session" msgstr "Soubor se sezenÃm %1 nenà sezenÃm" -#: session_state.cc:1125 +#: session_state.cc:1119 msgid "programming error: Session: incorrect XML node sent to set_state()" msgstr "Chyba v programovánÃ: SezenÃ: Nesprávný uzel XML poslán set_state()" -#: session_state.cc:1179 +#: session_state.cc:1173 msgid "Session: XML state has no options section" msgstr "SezenÃ: XML nemá žádnou Äást \"options\"" -#: session_state.cc:1184 +#: session_state.cc:1178 msgid "Session: XML state has no metadata section" msgstr "SezenÃ: XML nemá žádnou Äást \"metadata\"" -#: session_state.cc:1195 +#: session_state.cc:1189 msgid "Session: XML state has no sources section" msgstr "SezenÃ: XML nemá žádnou Äást \"sources\"" -#: session_state.cc:1202 +#: session_state.cc:1196 msgid "Session: XML state has no Tempo Map section" msgstr "SezenÃ: XML nemá žádnou Äást \"Tempo Map\"" -#: session_state.cc:1209 +#: session_state.cc:1203 msgid "Session: XML state has no locations section" msgstr "SezenÃ: XML nemá žádnou Äást \"locations\"" -#: session_state.cc:1235 +#: session_state.cc:1229 msgid "Session: XML state has no Regions section" msgstr "SezenÃ: XML nemá žádnou Äást \"Regions\"" -#: session_state.cc:1242 +#: session_state.cc:1236 msgid "Session: XML state has no playlists section" msgstr "SezenÃ: XML nemá žádnou Äást \"playlists\"" -#: session_state.cc:1262 +#: session_state.cc:1256 msgid "Session: XML state has no bundles section" msgstr "SezenÃ: XML nemá žádnou Äást \"bundles\"" -#: session_state.cc:1274 +#: session_state.cc:1268 msgid "Session: XML state has no diskstreams section" msgstr "SezenÃ: XML nemá žádnou Äást \"diskstreams\"" -#: session_state.cc:1282 +#: session_state.cc:1276 msgid "Session: XML state has no routes section" msgstr "SezenÃ: XML nemá žádnou Äást \"routes\"" -#: session_state.cc:1294 +#: session_state.cc:1288 msgid "Session: XML state has no route groups section" msgstr "SezenÃ: XML nemá žádnou Äást \"route groups\"" -#: session_state.cc:1303 +#: session_state.cc:1297 msgid "Session: XML state has no edit groups section" msgstr "SezenÃ: XML nemá žádnou Äást \"edit groups\"" -#: session_state.cc:1310 +#: session_state.cc:1304 msgid "Session: XML state has no mix groups section" msgstr "SezenÃ: XML nemá žádnou Äást \"mix groups\"" -#: session_state.cc:1318 +#: session_state.cc:1312 msgid "Session: XML state has no click section" msgstr "SezenÃ: XML nemá žádnou Äást \"click\"" -#: session_state.cc:1360 +#: session_state.cc:1354 msgid "Session: cannot create Route from XML description." msgstr "SezenÃ: Nelze vytvoÅ™it cestu z popisu XML" -#: session_state.cc:1364 +#: session_state.cc:1358 msgid "Loaded track/bus %1" msgstr "Byla nahrána stopa/sbÄ›rnice %1" -#: session_state.cc:1462 +#: session_state.cc:1456 msgid "Could not find diskstream for route" msgstr "NepodaÅ™ilo se najÃt Diskstream pro cestu" -#: session_state.cc:1516 +#: session_state.cc:1510 msgid "Session: cannot create Region from XML description." msgstr "SezenÃ: Nelze vytvoÅ™it oblast z popisu XML" -#: session_state.cc:1520 +#: session_state.cc:1514 msgid "Can not load state for region '%1'" msgstr "Nelze nahrát stav pro oblast '%1'" -#: session_state.cc:1556 +#: session_state.cc:1550 msgid "Regions in compound description not found (ID's %1 and %2): ignored" msgstr "Oblasti ve spojeném popisu nenalezeny (ID %1 a %2): pÅ™ehlÞà se" -#: session_state.cc:1584 +#: session_state.cc:1578 msgid "Nested source has no ID info in session file! (ignored)" msgstr "" "VnoÅ™ený zdroj nemá v souboru se sezenÃm žádné informace ID! (pÅ™ehlÞà se)" -#: session_state.cc:1596 +#: session_state.cc:1590 msgid "Cannot reconstruct nested source for region %1" msgstr "Nelze obnovit vnoÅ™ený zdroj pro oblast %1" -#: session_state.cc:1658 +#: session_state.cc:1652 msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)" msgstr "SezenÃ: Uzel XML k popisu zvukové oblasti je neúplný (chybà zdroj)" -#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707 +#: session_state.cc:1660 session_state.cc:1681 session_state.cc:1701 msgid "" "Session: XMLNode describing a AudioRegion references an unknown source id =%1" msgstr "" "SezenÃ: Uzel XML k popisu zvukové oblasti odkazuje na ID neznámého zdroje =%1" -#: session_state.cc:1672 session_state.cc:1693 session_state.cc:1713 +#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707 msgid "" "Session: XMLNode describing a AudioRegion references a non-audio source id =" "%1" @@ -2041,7 +2055,7 @@ msgstr "" "SezenÃ: Uzel XML k popisu zvukové oblasti odkazuje na ID nezvukového zdroje =" "%1" -#: session_state.cc:1736 +#: session_state.cc:1730 msgid "" "Session: XMLNode describing an AudioRegion is missing some master sources; " "ignored" @@ -2049,23 +2063,23 @@ msgstr "" "SezenÃ: Uzlu XML k popisu zvukové oblasti chybà nÄ›které hlavnà zdroje; " "pÅ™ehlÞà se" -#: session_state.cc:1770 +#: session_state.cc:1764 msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)" msgstr "SezenÃ: Uzel XML k popisu oblasti MIDI je neúplný (chybà zdroj)" -#: session_state.cc:1778 +#: session_state.cc:1772 msgid "" "Session: XMLNode describing a MidiRegion references an unknown source id =%1" msgstr "" "SezenÃ: Uzel XML k popisu oblasti MIDI odkazuje na ID neznámého zdroje =%1" -#: session_state.cc:1784 +#: session_state.cc:1778 msgid "" "Session: XMLNode describing a MidiRegion references a non-midi source id =%1" msgstr "" "SezenÃ: Uzel XML k popisu oblasti MIDI odkazuje na ID ne-MIDI zdroje =%1" -#: session_state.cc:1852 +#: session_state.cc:1846 msgid "" "cannot create new file from region name \"%1\" with ident = \"%2\": too many " "existing files with similar names" @@ -2073,110 +2087,106 @@ msgstr "" "Nelze vytvoÅ™it nový soubor z názvu oblasti \"%1\" s ident = \"%2\": Je " "pÅ™ÃliÅ¡ mnoho souborů s podobnými názvy" -#: session_state.cc:1875 +#: session_state.cc:1869 msgid "Session: cannot create Source from XML description." msgstr "SezenÃ: Nelze vytvoÅ™it zdroj z popisu XML" -#: session_state.cc:1909 +#: session_state.cc:1903 msgid "A sound file is missing. It will be replaced by silence." msgstr "Chybà zvukový soubor. Bude nahrazen tichem." -#: session_state.cc:1932 +#: session_state.cc:1926 msgid "Found a sound file that cannot be used by %1. Talk to the progammers." msgstr "" "Byl nalezen zvukový soubor, který nenà použitelný %1. Promluvte si s " "programátory." -#: session_state.cc:1949 +#: session_state.cc:1943 msgid "Could not create templates directory \"%1\" (%2)" msgstr "NepodaÅ™ilo se vytvoÅ™it adresář s pÅ™edlohami \"%1\" (%2)" -#: session_state.cc:1962 +#: session_state.cc:1956 msgid "Template \"%1\" already exists - new version not created" msgstr "PÅ™edloha \"%1\" již existuje - nová verze nebyla vytvoÅ™ena" -#: session_state.cc:1968 +#: session_state.cc:1962 msgid "Could not create directory for Session template\"%1\" (%2)" msgstr "NepodaÅ™ilo se vytvoÅ™it adresář pro pÅ™edlohu sezenà \"%1\" (%2)" -#: session_state.cc:1978 +#: session_state.cc:1972 msgid "template not saved" msgstr "PÅ™edloha neuložena" -#: session_state.cc:1988 +#: session_state.cc:1982 msgid "Could not create directory for Session template plugin state\"%1\" (%2)" msgstr "" "NepodaÅ™ilo se vytvoÅ™it adresář pro stav pÅ™Ãdavného modulu pÅ™edlohy sezenà " "\"%1\" (%2)" -#: session_state.cc:2183 +#: session_state.cc:2225 msgid "Unknown node \"%1\" found in Bundles list from session file" msgstr "Nalezen neznámý uzel \"%1\" v seznamu svazků souboru sezenÃ" -#: session_state.cc:2725 session_state.cc:2731 -msgid "Cannot expand path %1 (%2)" -msgstr "Nelze rozÅ¡ÃÅ™it cestu %1 (%2)" - -#: session_state.cc:2784 +#: session_state.cc:2820 msgid "Session: cannot create dead file folder \"%1\" (%2)" msgstr "SezenÃ: Nelze vytvoÅ™it odpadkový koÅ¡ pro zahozen soubory \"%1\" (%2)" -#: session_state.cc:2823 +#: session_state.cc:2859 msgid "cannot rename unused file source from %1 to %2 (%3)" msgstr "Nelze pÅ™ejmenovat nepoužÃvaný souborový zdroj z %1 na %2 (%3)" -#: session_state.cc:2841 +#: session_state.cc:2877 msgid "cannot remove peakfile %1 for %2 (%3)" msgstr "Nelze odstranit vrcholový soubor %1 pro %2 (%3)" -#: session_state.cc:3143 +#: session_state.cc:3179 msgid "could not backup old history file, current history not saved" msgstr "" "NepodaÅ™ilo se vytvoÅ™it zálohu starého souboru se seznamem ÄinnostÃ, nynÄ›jÅ¡Ã " "historie neuložena" -#: session_state.cc:3156 +#: session_state.cc:3192 msgid "history could not be saved to %1" msgstr "NepodaÅ™ilo se uložit seznam Äinnostà do %1" -#: session_state.cc:3159 +#: session_state.cc:3195 msgid "Could not remove history file at path \"%1\" (%2)" msgstr "" "NepodaÅ™ilo se odstranit soubor se seznamem Äinnostà v cestÄ› \"%1\" (%2)" -#: session_state.cc:3163 +#: session_state.cc:3199 msgid "could not restore history file from backup %1 (%2)" msgstr "NepodaÅ™ilo se obnovit soubor se seznamem Äinnostà ze zálohy %1 (%2)" -#: session_state.cc:3188 +#: session_state.cc:3224 msgid "%1: no history file \"%2\" for this session." msgstr "%1: Žádný soubor se seznamem Äinnostà \"%2\" pro toto sezenÃ." -#: session_state.cc:3194 +#: session_state.cc:3230 msgid "Could not understand session history file \"%1\"" msgstr "NepodaÅ™ilo se porozumÄ›t souboru se seznamem Äinnostà sezenà \"%1\"" -#: session_state.cc:3236 +#: session_state.cc:3272 msgid "Failed to downcast MidiSource for NoteDiffCommand" msgstr "NepodaÅ™ilo se najÃt MidiSource pro NoteDiffCommand" -#: session_state.cc:3247 +#: session_state.cc:3283 msgid "Failed to downcast MidiSource for SysExDiffCommand" msgstr "NepodaÅ™ilo se najÃt MidiSource pro SysExDiffCommand" -#: session_state.cc:3258 +#: session_state.cc:3294 msgid "Failed to downcast MidiSource for PatchChangeDiffCommand" msgstr "NepodaÅ™ilo se najÃt MidiSource pro PatchChangeDiffCommand" -#: session_state.cc:3266 +#: session_state.cc:3302 msgid "Couldn't figure out how to make a Command out of a %1 XMLNode." msgstr "NepodaÅ™ilo se rozpoznat žádný pÅ™Ãkaz v uzlu XML \"%1\"." -#: session_state.cc:3502 +#: session_state.cc:3538 msgid "Session: unknown diskstream type in XML" msgstr "SezenÃ: Neznámý typ Diskstream v XML" -#: session_state.cc:3507 +#: session_state.cc:3543 msgid "Session: could not load diskstream via XML state" msgstr "SezenÃ: NepodaÅ™ilo se nahrát Diskstream pomocà stavu XML" @@ -2204,122 +2214,122 @@ msgstr "" "Celkové ovládánà výšky tónu pÅ™i promÄ›nlivé rychlosti pÅ™ehrávánà nenà možné, " "dokud je %1 spojen s transportem JACK." -#: smf_source.cc:252 +#: smf_source.cc:262 msgid "Unable to read event prefix, corrupt MIDI ring" msgstr "Nelze pÅ™eÄÃst pÅ™edponu události, poÅ¡kozen okraj MIDI" -#: smf_source.cc:265 +#: smf_source.cc:275 msgid "Event has time and size but no body, corrupt MIDI ring" msgstr "Událost má Äas a velikost, ale nemá tÄ›lo, poÅ¡kozen okraj MIDI" -#: smf_source.cc:271 +#: smf_source.cc:281 msgid "Event time is before MIDI source position" msgstr "ÄŒas události je pÅ™ed polohou zdroje MIDI" -#: smf_source.cc:306 smf_source.cc:345 +#: smf_source.cc:316 smf_source.cc:355 msgid "Skipping event with unordered time %1" msgstr "PÅ™eskakuje se událost s neuspořádaným Äasem %1" -#: smf_source.cc:410 +#: smf_source.cc:420 msgid "cannot open MIDI file %1 for write" msgstr "Nelze otevÅ™Ãt soubor MIDI %1 pro zápis" -#: sndfile_helpers.cc:32 +#: sndfile_helpers.cc:34 msgid "WAV" msgstr "WAV" -#: sndfile_helpers.cc:33 +#: sndfile_helpers.cc:35 msgid "AIFF" msgstr "AIFF" -#: sndfile_helpers.cc:34 +#: sndfile_helpers.cc:36 msgid "CAF" msgstr "CAF" -#: sndfile_helpers.cc:35 +#: sndfile_helpers.cc:37 msgid "W64 (64 bit WAV)" msgstr "W64 (64 bit WAV)" -#: sndfile_helpers.cc:36 +#: sndfile_helpers.cc:38 msgid "FLAC" msgstr "FLAC" -#: sndfile_helpers.cc:37 +#: sndfile_helpers.cc:39 msgid "Ogg/Vorbis" msgstr "Ogg/Vorbis" -#: sndfile_helpers.cc:38 +#: sndfile_helpers.cc:40 msgid "raw (no header)" msgstr "raw (no header)" -#: sndfile_helpers.cc:43 +#: sndfile_helpers.cc:45 msgid ".wav" msgstr ".wav" -#: sndfile_helpers.cc:44 +#: sndfile_helpers.cc:46 msgid ".aiff" msgstr ".aiff" -#: sndfile_helpers.cc:45 +#: sndfile_helpers.cc:47 msgid ".caf" msgstr ".caf" -#: sndfile_helpers.cc:46 +#: sndfile_helpers.cc:48 msgid ".w64" msgstr ".w64" -#: sndfile_helpers.cc:47 +#: sndfile_helpers.cc:49 msgid ".flac" msgstr ".flac" -#: sndfile_helpers.cc:48 +#: sndfile_helpers.cc:50 msgid ".ogg" msgstr ".ogg" -#: sndfile_helpers.cc:49 +#: sndfile_helpers.cc:51 msgid ".raw" msgstr ".raw" -#: sndfile_helpers.cc:64 +#: sndfile_helpers.cc:66 msgid "Signed 16 bit PCM" msgstr "Signed 16 bit PCM" -#: sndfile_helpers.cc:65 +#: sndfile_helpers.cc:67 msgid "Signed 24 bit PCM" msgstr "Signed 24 bit PCM" -#: sndfile_helpers.cc:66 +#: sndfile_helpers.cc:68 msgid "Signed 32 bit PCM" msgstr "Signed 32 bit PCM" -#: sndfile_helpers.cc:67 +#: sndfile_helpers.cc:69 msgid "Signed 8 bit PCM" msgstr "Signed 8 bit PCM" -#: sndfile_helpers.cc:68 +#: sndfile_helpers.cc:70 msgid "32 bit float" msgstr "32 bit float" -#: sndfile_helpers.cc:81 +#: sndfile_helpers.cc:83 msgid "Little-endian (Intel)" msgstr "Little-endian (Intel)" -#: sndfile_helpers.cc:82 +#: sndfile_helpers.cc:84 msgid "Big-endian (PowerPC)" msgstr "Big-endian (PowerPC)" -#: sndfilesource.cc:201 +#: sndfilesource.cc:210 msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)" msgstr "SndFileSource: Nelze otevÅ™Ãt soubor \"%1\" pro %2 (%3)" -#: sndfilesource.cc:209 +#: sndfilesource.cc:218 msgid "" "SndFileSource: file only contains %1 channels; %2 is invalid as a channel " "number" msgstr "" "SndFileSource: Soubor obsahuje jen %1 kanály, %2 je neplatným poÄtem kanálů" -#: sndfilesource.cc:255 sndfilesource.cc:571 sndfilesource.cc:595 +#: sndfilesource.cc:264 sndfilesource.cc:604 sndfilesource.cc:628 msgid "" "cannot set broadcast info for audio file %1 (%2); dropping broadcast info " "for this file" @@ -2327,68 +2337,72 @@ msgstr "" "Nelze nastavit informace o pÅ™enosu pro zvukový soubor %1 (%2); Zahazujà se " "informace o pÅ™enosu pro tento soubor" -#: sndfilesource.cc:302 +#: sndfilesource.cc:311 msgid "could not allocate file %1 for reading." msgstr "NepodaÅ™ilo se pÅ™idÄ›lit soubor %1 pro ÄtenÃ." -#: sndfilesource.cc:337 +#: sndfilesource.cc:346 msgid "SndFileSource: could not seek to frame %1 within %2 (%3)" msgstr "SndFileSource: NepodaÅ™il se vyhledat v %2 snÃmku %1 (%3)" -#: sndfilesource.cc:347 +#: sndfilesource.cc:356 msgid "" "SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)" msgstr "" "SndFileSource: @ %1 NepodaÅ™il se ÄÃst %2 uvnitÅ™ %3 (%4) (len = %5, ret byl " "%6)" -#: sndfilesource.cc:391 sndfilesource.cc:420 +#: sndfilesource.cc:400 sndfilesource.cc:429 msgid "attempt to write a non-writable audio file source (%1)" msgstr "" "Pokus o zápis zvukového zdrojového souboru chránÄ›ného proti zápisu (%1)" -#: sndfilesource.cc:396 utils.cc:510 utils.cc:534 utils.cc:548 utils.cc:567 +#: sndfilesource.cc:405 utils.cc:547 utils.cc:571 utils.cc:585 utils.cc:604 msgid "programming error: %1 %2" msgstr "Chyba v programovánÃ: %1 %2" -#: sndfilesource.cc:523 +#: sndfilesource.cc:532 sndfilesource.cc:562 msgid "attempt to flush a non-writable audio file source (%1)" msgstr "" "Pokus o uklizenà zvukového zdrojového souboru chránÄ›ného proti zápisu (%1)" -#: sndfilesource.cc:528 +#: sndfilesource.cc:537 sndfilesource.cc:557 msgid "attempt to flush an un-opened audio file source (%1)" msgstr "Pokus o uklizenà neotevÅ™eného zvukového zdrojového souboru (%1)" -#: sndfilesource.cc:534 +#: sndfilesource.cc:543 msgid "could not allocate file %1 to write header" msgstr "NepodaÅ™ilo se pÅ™idÄ›lit soubor %1 pro zapsánà hlaviÄky souboru" -#: sndfilesource.cc:548 +#: sndfilesource.cc:568 +msgid "could not allocate file %1 to flush contents" +msgstr "" + +#: sndfilesource.cc:581 msgid "" "attempt to store broadcast info in a non-writable audio file source (%1)" msgstr "" "Pokus o zápis informace o pÅ™enosu do zvukového zdrojového souboru chránÄ›ného " "proti zápisu (%1)" -#: sndfilesource.cc:553 +#: sndfilesource.cc:586 msgid "attempt to set BWF info for an un-opened audio file source (%1)" msgstr "" "Pokus o nastavenà informace BWF v neotevÅ™eném zvukovém zdrojovém souboru (%1)" -#: sndfilesource.cc:614 +#: sndfilesource.cc:647 msgid "%1: cannot seek to %2 (libsndfile error: %3)" msgstr "%1: Nelze vyhledat %2 (Chyba libsndfile: %3)" -#: sndfilesource.cc:727 +#: sndfilesource.cc:760 msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)" msgstr "SndFileSource: \"%1\" Å¡patná vrácená hodnota ÄtenÃ: %2 z %5 (%3: %4)" -#: sndfilesource.cc:740 sndfilesource.cc:790 sndfilesource.cc:797 +#: sndfilesource.cc:773 sndfilesource.cc:823 sndfilesource.cc:830 msgid "SndFileSource: \"%1\" bad write (%2)" msgstr "SndFileSource: \"%1\" Å¡patný postup zápisu (%2)" -#: sndfilesource.cc:820 +#: sndfilesource.cc:853 msgid "" "Filesource: start time is already set for existing file (%1): Cannot change " "start time." @@ -2396,18 +2410,22 @@ msgstr "" "Filesource: ZaÄáteÄnà Äas pro existujÃcà soubor je již nastaven (%1): " "ZaÄáteÄnà Äas nelze zmÄ›nit." -#: speakers.cc:239 +#: speakers.cc:280 msgid "Speaker information is missing azimuth - speaker ignored" msgstr "Údaj pro reproduktor postrádá azimut - reproduktor se pÅ™ehlÞÃ" -#: speakers.cc:245 +#: speakers.cc:286 msgid "Speaker information is missing elevation - speaker ignored" msgstr "Údaj pro reproduktor postrádá vyvýšenà - reproduktor se pÅ™ehlÞÃ" -#: speakers.cc:251 +#: speakers.cc:292 msgid "Speaker information is missing distance - speaker ignored" msgstr "Údaj pro reproduktor postrádá vzdálenost - reproduktor se pÅ™ehlÞÃ" +#: srcfilesource.cc:135 +msgid "SrcFileSource: %1" +msgstr "" + #: tape_file_matcher.cc:46 msgid "Cannot compile tape track regexp for use (%1)" msgstr "Regulárnà výraz stopy pásky nelze vyhodnotit k užÃvánà (%1)" @@ -2568,54 +2586,89 @@ msgstr "Uzel pro kanál nemá žádnou vlastnost \"type\"" msgid "Node for Port has no \"name\" property" msgstr "Uzel pro pÅ™Ãpojku nemá žádnou vlastnost \"name\"" -#: utils.cc:358 utils.cc:382 +#: utils.cc:395 utils.cc:419 msgid "Splice" msgstr "Spojit" -#: utils.cc:360 utils.cc:375 +#: utils.cc:397 utils.cc:412 msgid "Slide" msgstr "Vsunout" -#: utils.cc:362 utils.cc:378 +#: utils.cc:399 utils.cc:415 msgid "Lock" msgstr "Zamknout" -#: utils.cc:365 +#: utils.cc:402 msgid "programming error: unknown edit mode string \"%1\"" msgstr "Chyba v programovánÃ: neznámý Å™etÄ›zec pro režim úprav \"%1\"" -#: utils.cc:389 utils.cc:421 +#: utils.cc:426 utils.cc:458 msgid "MIDI Timecode" msgstr "ÄŒasový kód MIDI" -#: utils.cc:389 utils.cc:419 +#: utils.cc:426 utils.cc:456 msgid "MTC" msgstr "MTC" -#: utils.cc:393 utils.cc:428 +#: utils.cc:430 utils.cc:465 msgid "MIDI Clock" msgstr "Hodiny MIDI" -#: utils.cc:397 utils.cc:415 utils.cc:435 +#: utils.cc:434 utils.cc:452 utils.cc:472 msgid "JACK" msgstr "JACK" -#: utils.cc:401 +#: utils.cc:438 msgid "programming error: unknown sync source string \"%1\"" msgstr "Chyba v programovánÃ: neznámý Å™etÄ›zec pro zdroj seÅ™Ãzenà \"%1\"" -#: utils.cc:426 +#: utils.cc:463 msgid "M-Clock" msgstr "M-Clock" -#: utils.cc:432 +#: utils.cc:469 msgid "LTC" msgstr "LTC" -#: utils.cc:602 +#: utils.cc:639 msgid "programming error: unknown native header format: %1" msgstr "Chyba v programovánÃ: neznámý nativnà formát hlaviÄky: %1" -#: utils.cc:617 +#: utils.cc:654 msgid "cannot open directory %1 (%2)" msgstr "Nelze otevÅ™Ãt adresář %1 (%2)" + +#~ msgid "Auditioning of non-audio regions not yet supported" +#~ msgstr "Poslech nezvukových oblastà jeÅ¡tÄ› nenà podporován" + +#~ msgid "Filesource: cannot find required file (%1): while searching %2" +#~ msgstr "" +#~ "Zdroj souboru: Nelze najÃt požadovaný soubor (%1) pÅ™i prohledávánà %2" + +#~ msgid "" +#~ "FileSource: \"%1\" is ambigous when searching %2\n" +#~ "\t" +#~ msgstr "" +#~ "Zdroj souboru: \"%1\" je pÅ™i prohledávánà %2 nejednoznaÄný\n" +#~ "\t" + +#~ msgid "Could not resolve path: %1 (%2)" +#~ msgstr "NepodaÅ™ilo se vyÅ™eÅ¡it cestu: %1 (%2)" + +#~ msgid "LADSPA: cannot load module from \"%1\"" +#~ msgstr "LADSPA: Nelze nahrát modul z \"%1\"" + +#~ msgid "looking for panners in %1" +#~ msgstr "Hledánà vyváženà v %1" + +#~ msgid "Panner discovered: \"%1\" in %2" +#~ msgstr "Vyváženà nalezeno: \"%1\" v %2" + +#~ msgid "Could not use path %1 (%2)" +#~ msgstr "NepodaÅ™ilo se použÃt cestu %1 (%2)" + +#~ msgid "could not rename temporary session file %1 to %2" +#~ msgstr "NepodaÅ™ilo se pÅ™ejmenovat doÄasný soubor se sezenÃm %1 na %2" + +#~ msgid "Cannot expand path %1 (%2)" +#~ msgstr "Nelze rozÅ¡ÃÅ™it cestu %1 (%2)" diff --git a/libs/ardour/po/de.po b/libs/ardour/po/de.po index 8cf15b4488..523a11835b 100644 --- a/libs/ardour/po/de.po +++ b/libs/ardour/po/de.po @@ -1,13 +1,13 @@ # Copyright (C) YEAR "Paul Davis" # This file is distributed under the same license as the PACKAGE package. # -# Edgar Aichinger <edgar.aichinger@aon.at>, 2013. +# Edgar Aichinger <edgar.aichinger@aon.at>, 2013, 2014. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-11-05 11:11-0500\n" -"PO-Revision-Date: 2013-09-26 16:32+0200\n" +"POT-Creation-Date: 2014-02-10 17:53+0100\n" +"PO-Revision-Date: 2014-02-10 18:07+0100\n" "Last-Translator: Edgar Aichinger <edogawa@aon.at>\n" "Language-Team: German <ardour-dev@lists.ardour.org>\n" "Language: de\n" @@ -21,74 +21,74 @@ msgstr "" msgid "Fader" msgstr "Fader" -#: audio_diskstream.cc:244 +#: audio_diskstream.cc:242 msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist" msgstr "" "AudioDiskstream: Wiedergabeliste \"%1\" ist keine Audio-Wiedergabeliste" -#: audio_diskstream.cc:296 +#: audio_diskstream.cc:294 msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!" msgstr "" "AudioDiskstream %1: es gibt keine Wiedergabeliste, die kopiert werden kann!" -#: audio_diskstream.cc:848 audio_diskstream.cc:858 +#: audio_diskstream.cc:846 audio_diskstream.cc:856 msgid "" "AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3" msgstr "" "AudioDiskstream %1: Kann während des Befüllens %2 nicht aus Wiedergabeliste " "bei Frame %3 lesen" -#: audio_diskstream.cc:1014 +#: audio_diskstream.cc:1012 msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3" msgstr "" "AudioDiskstream %1: Kann %2 nicht aus Wiedergabeliste bei Frame %3 lesen" -#: audio_diskstream.cc:1383 audio_diskstream.cc:1400 +#: audio_diskstream.cc:1381 audio_diskstream.cc:1398 msgid "AudioDiskstream %1: cannot write to disk" msgstr "AudioDiskstream %1: Kann nicht auf Disk schreiben" -#: audio_diskstream.cc:1443 +#: audio_diskstream.cc:1441 msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!" msgstr "AudioDiskstream %1: Kann aufgenommene Daten nicht auf Disk schreiben!" -#: audio_diskstream.cc:1537 +#: audio_diskstream.cc:1535 msgid "%1: could not create region for complete audio file" msgstr "%1: konnte keine Region für die komplette Audiodatei erzeugen" -#: audio_diskstream.cc:1571 +#: audio_diskstream.cc:1569 msgid "AudioDiskstream: could not create region for captured audio!" msgstr "" "AudioDiskstream: konnte keine Region für das aufgenommene Audiomaterial " "erzeugen!" -#: audio_diskstream.cc:1679 +#: audio_diskstream.cc:1677 msgid "programmer error: %1" msgstr "Programmierfehler: %1" -#: audio_diskstream.cc:1905 +#: audio_diskstream.cc:1903 msgid "AudioDiskstream: channel %1 out of range" msgstr "AudioDiskstream: Kanal %1 Bereichsüberschreitung" -#: audio_diskstream.cc:1919 midi_diskstream.cc:1210 +#: audio_diskstream.cc:1917 midi_diskstream.cc:1209 msgid "%1:%2 new capture file not initialized correctly" msgstr "%1:%2 neue Aufnahmedatei nicht korrekt initialisiert" -#: audio_diskstream.cc:2200 +#: audio_diskstream.cc:2198 msgid "%1: cannot restore pending capture source file %2" msgstr "%1: kann vorläufige Aufnahme-Quelldatei %2 nicht wiederherstellen" -#: audio_diskstream.cc:2222 +#: audio_diskstream.cc:2220 msgid "%1: incorrect number of pending sources listed - ignoring them all" msgstr "" "%1: Liste enthält falsche Anzahl vorläufiger Quellen - alle werden ignoriert" -#: audio_diskstream.cc:2246 +#: audio_diskstream.cc:2244 msgid "%1: cannot create whole-file region from pending capture sources" msgstr "" "%1: kann aus vorläufigen Aufnahmequellen keine Region für die komplette " "Datei erzeugen" -#: audio_library.cc:71 +#: audio_library.cc:81 msgid "Could not open %1. Audio Library not saved" msgstr "Konnte %1 nicht öffnen. Die Audio-Bibliothek wurde nicht gesichert" @@ -134,11 +134,11 @@ msgstr "schlecht geformtes XML in importierter Wiedergabeliste" msgid "Audio Playlists (unused)" msgstr "Audio-Wiedergabelisten (unbenutzt)" -#: audio_playlist_source.cc:171 audiosource.cc:913 file_source.cc:529 +#: audio_playlist_source.cc:171 audiosource.cc:891 file_source.cc:520 #: midi_playlist_source.cc:144 midi_playlist_source.cc:152 -#: midi_playlist_source.cc:159 midi_source.cc:371 plugin_insert.cc:643 -#: rb_effect.cc:333 session.cc:2619 session.cc:2652 session.cc:3797 -#: session_handle.cc:87 sndfilesource.cc:121 +#: midi_playlist_source.cc:159 midi_source.cc:370 plugin_insert.cc:634 +#: rb_effect.cc:333 session.cc:2636 session.cc:2669 session.cc:3814 +#: session_handle.cc:87 sndfilesource.cc:122 msgid "programming error: %1" msgstr "Programmierfehler: %1" @@ -166,23 +166,23 @@ msgstr "" "\n" "Kanäle: " -#: audio_track.cc:167 +#: audio_track.cc:161 msgid "Unknown bundle \"%1\" listed for input of %2" msgstr "Unbekanntes Bündel \"%1\" für Eingang von %2 genannt" -#: audio_track.cc:169 +#: audio_track.cc:163 msgid "in 1" msgstr "in 1" -#: audio_track.cc:170 +#: audio_track.cc:164 msgid "No input bundles available as a replacement" msgstr "Es gibt keine als Ersatz geeigneten Eingangs-Bündel" -#: audio_track.cc:174 +#: audio_track.cc:168 msgid "Bundle %1 was not available - \"in 1\" used instead" msgstr "Bündel %1 war nicht verfügbar - verwende statt dessen \"in 1\"" -#: audio_track.cc:183 +#: audio_track.cc:177 msgid "improper input channel list in XML node (%1)" msgstr "XML-Knoten (%1) enthält ungeeignete Liste der Eingangskanäle" @@ -206,23 +206,23 @@ msgstr "kann VAMP-Plugin \"%1\" nicht laden" msgid "VAMP Plugin \"%1\" could not be loaded" msgstr "VAMP-Plugin \"%1\" konnte nicht geladen werden" -#: audioengine.cc:488 +#: audioengine.cc:495 msgid "looking for backends in %1\n" msgstr "Suche nach Backends in %1\n" -#: audioengine.cc:511 +#: audioengine.cc:518 msgid "AudioEngine: cannot load module \"%1\" (%2)" msgstr "AudioEngine: kann Modul \"%1\" nicht laden (%2)" -#: audioengine.cc:517 +#: audioengine.cc:524 msgid "AudioEngine: backend at \"%1\" has no descriptor function." msgstr "AudioEngine: Backend an \"%1\" hat keine Beschreibungsfunktion." -#: audioengine.cc:589 +#: audioengine.cc:596 msgid "Could not create backend for %1: %2" msgstr "Konnte Backend für %1 nicht erzeugen: %2" -#: audioregion.cc:1643 +#: audioregion.cc:1651 msgid "" "You have requested an operation that requires audio analysis.\n" "\n" @@ -248,11 +248,11 @@ msgstr "" "und zukünftigen Operation(en) zur Transienten-Bestimmung eine leichte " "Verzögerung bemerken.\n" -#: audiosource.cc:199 +#: audiosource.cc:210 msgid "cannot rename peakfile for %1 from %2 to %3 (%4)" msgstr "kann Peakfile für %1 nicht von %2 auf %3 umbenennen (%4)" -#: audiosource.cc:226 +#: audiosource.cc:239 msgid "AudioSource: cannot stat peakfile \"%1\"" msgstr "AudioSource: Peakfile \"%1\" nicht auffindbar" @@ -260,49 +260,72 @@ msgstr "AudioSource: Peakfile \"%1\" nicht auffindbar" msgid "cannot read sample data for unscaled peak computation" msgstr "kann Sampledaten für unskalierte Peaks-Berechnung nicht lesen" -#: audiosource.cc:387 +#: audiosource.cc:386 msgid "AudioSource: cannot open peakpath (a) \"%1\" (%2)" msgstr "AudioSource: kann Pfad für Peaks (a) \"%1\" nicht öffnen (%2)" -#: audiosource.cc:463 +#: audiosource.cc:395 audiosource.cc:473 +msgid "" +"AudioSource: could not seek to correct location in peak file \"%1\" (%2)" +msgstr "" +"AudioSource: konnte in der Peakdatei \"%1\" nicht an die korrekte Stelle " +"springen (%2)" + +#: audiosource.cc:453 msgid "AudioSource: cannot open peakpath (b) \"%1\" (%2)" msgstr "AudioSource: kann Pfad für Peaks (b) \"%1\" nicht öffnen (%2)" -#: audiosource.cc:587 +#: audiosource.cc:567 msgid "" "AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)" msgstr "" -"AudioSource[%1]: peak read - kann %2 Samples bei Offset %3 von %4 nicht lesen" -"(%5)" +"AudioSource[%1]: peak read - kann %2 Samples bei Offset %3 von %4 nicht " +"lesen(%5)" -#: audiosource.cc:667 +#: audiosource.cc:634 msgid "%1: could not write read raw data for peak computation (%2)" msgstr "%1: konnte Rohdaten für Peakberechnung nicht lesen/schreiben (%2)" -#: audiosource.cc:706 +#: audiosource.cc:672 msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)" msgstr "AudioSource: kann Pfad für Peaks (c) \"%1\" nicht öffnen (%2)" -#: audiosource.cc:773 audiosource.cc:886 +#: audiosource.cc:739 audiosource.cc:861 +msgid "%1: could not seek in peak file data (%2)" +msgstr "%1: konnte in den Daten der Peakdatei nicht suchen (%2)" + +#: audiosource.cc:744 audiosource.cc:870 msgid "%1: could not write peak file data (%2)" msgstr "%1: konnte Peak-Daten nicht in Datei schreiben (%2)" -#: audiosource.cc:924 +#: audiosource.cc:903 msgid "could not truncate peakfile %1 to %2 (error: %3)" msgstr "konnte Peakdatei %1 nicht auf %2 kürzen (Fehler: %3)" -#: auditioner.cc:87 +#: auditioner.cc:95 +msgid "Falling back to Reasonable Synth for Midi Audition" +msgstr "Greife fürs MIDI-Vorhören auf Reasonable Synth zurück" + +#: auditioner.cc:97 +msgid "No synth for midi-audition found." +msgstr "Keinen Synth zum MIDI-Vorhören gefunden." + +#: auditioner.cc:152 msgid "no outputs available for auditioner - manual connection required" msgstr "Keine Ausgänge für Abhöre verfügbar - manuelle Verbindung erforderlich" -#: auditioner.cc:135 -msgid "Auditioning of non-audio regions not yet supported" -msgstr "Abhören von Nicht-Audio Regionen wird noch nicht unterstützt" - -#: auditioner.cc:160 +#: auditioner.cc:392 auditioner.cc:438 msgid "Cannot setup auditioner processing flow for %1 channels" msgstr "Kann den Abhör-Signalfluss für %1 Kanäle nicht einrichten" +#: auditioner.cc:426 +msgid "Failed to load synth for MIDI-Audition." +msgstr "Konnte Synth zum MIDI-Vorhören nicht laden." + +#: auditioner.cc:445 +msgid "Auditioning of regions other than Audio or Midi is not supported." +msgstr "Vorhören anderer Regionen als Audio oder MIDI wird nicht unterstützt." + #: automatable.cc:81 msgid "Automation node has no path property" msgstr "Automationsknoten hat keine Eigenschaft \"Pfad\"" @@ -341,24 +364,24 @@ msgstr "" "AutomationList: XML-Knoten mit Namen %1, nicht \"AutomationList\" übergeben " "- ignoriert" -#: butler.cc:91 +#: butler.cc:80 msgid "Cannot create transport request signal pipe (%1)" msgstr "Kann die Signalleitung für Transport-Anforderungen nicht erzeugen (%1)" -#: butler.cc:97 butler.cc:103 +#: butler.cc:86 butler.cc:92 msgid "UI: cannot set O_NONBLOCK on butler request pipe (%1)" msgstr "" "UI: kann O_NONBLOCK für die Anforderungsleitung des Butlers nicht setzen (%1)" -#: butler.cc:109 +#: butler.cc:124 msgid "Session: could not create butler thread" msgstr "Projekt: konnte Butler-Thread nicht erzeugen" -#: butler.cc:156 +#: butler.cc:165 msgid "poll on butler request pipe failed (%1)" msgstr "poll auf die Anforderungsleitung des Butler fehlgeschlagen (%1)" -#: butler.cc:163 +#: butler.cc:172 msgid "Error on butler thread request pipe: fd=%1 err=%2" msgstr "Fehler in der Anforderungsleitung des Butler-Threads: fd=%1 err=%2" @@ -366,56 +389,56 @@ msgstr "Fehler in der Anforderungsleitung des Butler-Threads: fd=%1 err=%2" msgid "Error reading from butler request pipe" msgstr "Fehler beim Lesen der Butler-Anforderungsleitung" -#: butler.cc:248 +#: butler.cc:301 msgid "Butler read ahead failure on dstream %1" msgstr "Butler-Lesefehler bei dstream %1" -#: butler.cc:285 +#: butler.cc:338 msgid "Butler write-behind failure on dstream %1" msgstr "Butler-Schreibfehler bei dstream %1" -#: control_protocol_manager.cc:134 +#: control_protocol_manager.cc:164 msgid "control protocol name \"%1\" has no descriptor" msgstr "Kontrollprotokollname \"%1\" hat keine Beschreibung" -#: control_protocol_manager.cc:141 +#: control_protocol_manager.cc:171 msgid "control protocol name \"%1\" could not be initialized" msgstr "Kontrollprotokoll \"%1\" konnte nicht initialisiert werden" -#: control_protocol_manager.cc:201 +#: control_protocol_manager.cc:237 msgid "Instantiating mandatory control protocol %1" msgstr "Instanziere erforderliches Kontrollprotokoll %1" -#: control_protocol_manager.cc:222 +#: control_protocol_manager.cc:258 msgid "looking for control protocols in %1\n" msgstr "suche nach Kontrollprotokollen in %1\n" -#: control_protocol_manager.cc:247 +#: control_protocol_manager.cc:283 msgid "Control protocol %1 not usable" msgstr "Kontrollprotokoll %1 nicht benutzbar" -#: control_protocol_manager.cc:264 +#: control_protocol_manager.cc:300 msgid "Control surface protocol discovered: \"%1\"\n" msgstr "Protokoll für Kontrolloberfläche entdeckt: \"%1\"\n" -#: control_protocol_manager.cc:282 +#: control_protocol_manager.cc:318 msgid "ControlProtocolManager: cannot load module \"%1\" (%2)" msgstr "ControlProtocolManager: kann Modul \"%1\" nicht laden (%2)" -#: control_protocol_manager.cc:290 +#: control_protocol_manager.cc:324 msgid "ControlProtocolManager: module \"%1\" has no descriptor function." msgstr "" "ControlProtocolManager: Modul \"%1\" hat keine Funktion zur Beschreibung." -#: cycle_timer.cc:38 +#: cycle_timer.cc:40 msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo" msgstr "CycleTimer::get_mhz(): kann /proc/cpuinfo nicht öffnen" -#: cycle_timer.cc:50 +#: cycle_timer.cc:52 msgid "CycleTimer::get_mhz(): cannot locate cpu MHz in /proc/cpuinfo" msgstr "CycleTimer::get_mhz(): kann CPU-Takt in /proc/cpuinfo nicht finden" -#: cycle_timer.cc:73 +#: cycle_timer.cc:75 msgid "cannot locate cpu MHz in /proc/cpuinfo" msgstr "kann CPU-Takt in /proc/cpuinfo nicht finden" @@ -423,7 +446,7 @@ msgstr "kann CPU-Takt in /proc/cpuinfo nicht finden" msgid "audio" msgstr "Audio" -#: data_type.cc:28 session.cc:1791 session.cc:1794 +#: data_type.cc:28 session.cc:1808 session.cc:1811 msgid "MIDI" msgstr "MIDI" @@ -431,15 +454,15 @@ msgstr "MIDI" msgid "unknown" msgstr "unbekannt" -#: delivery.cc:114 +#: delivery.cc:118 msgid "main outs" msgstr "Hauptausgänge" -#: delivery.cc:117 send.cc:61 +#: delivery.cc:121 send.cc:62 msgid "listen" msgstr "hören" -#: diskstream.cc:303 +#: diskstream.cc:302 msgid "Location \"%1\" not valid for track loop (start >= end)" msgstr "Zeitpunkt \"%1\" für Spurschleife ungültig (Start >= Ende)" @@ -452,25 +475,25 @@ msgstr "" msgid "Export failed: %1" msgstr "Export fehlgeschlagen: %1" -#: export_filename.cc:118 +#: export_filename.cc:119 msgid "Existing export folder for this session (%1) does not exist - ignored" msgstr "" "genanntes Exportverzeichnis für dieses Projekt (%1) existiert nicht - " "ignoriert" -#: export_filename.cc:229 +#: export_filename.cc:230 msgid "No Time" msgstr "Keine Zeit" -#: export_filename.cc:238 +#: export_filename.cc:239 msgid "Invalid time format" msgstr "Ungültiges Zeitformat" -#: export_filename.cc:247 +#: export_filename.cc:248 msgid "No Date" msgstr "Kein Datum" -#: export_filename.cc:262 +#: export_filename.cc:263 msgid "Invalid date format" msgstr "Ungültiges Datumsformat" @@ -538,7 +561,7 @@ msgstr "Dreieck" msgid "Rectangular" msgstr "Rechteck" -#: export_formats.cc:52 session.cc:5014 session.cc:5030 +#: export_formats.cc:52 session.cc:5006 session.cc:5022 msgid "None" msgstr "Kein" @@ -578,15 +601,15 @@ msgstr "Vorbis-Sampleformat" msgid "No sample format" msgstr "Kein Sampleformat" -#: export_handler.cc:335 +#: export_handler.cc:343 msgid "Editor: cannot open \"%1\" as export file for CD marker file" msgstr "Editor: kann \"%1\" als Export-Datei für CD-Marker nicht öffnen" -#: export_handler.cc:417 export_handler.cc:420 +#: export_handler.cc:425 export_handler.cc:428 msgid "an error occured while writing a TOC/CUE file: %1" msgstr "beim Schreiben einer TOC/CUE Datei trat ein Fehler auf:%1" -#: export_handler.cc:642 export_handler.cc:700 +#: export_handler.cc:650 export_handler.cc:708 msgid "Cannot convert %1 to Latin-1 text" msgstr "Kann %1 nicht zu Latin-1 Kodierung konvertieren" @@ -652,7 +675,7 @@ msgstr "" "% unterstützt nur %2 Kanäle, in Ihrer Kanalkonfiguration befinden sich " "jedoch %3 Kanäle" -#: file_source.cc:198 session_state.cc:2807 +#: file_source.cc:198 session_state.cc:2843 msgid "" "there are already 1000 files with names like %1; versioning discontinued" msgstr "" @@ -662,32 +685,31 @@ msgstr "" msgid "cannot rename file source from %1 to %2 (%3)" msgstr "Kann Quelldatei nicht von %1 nach %2 umbenennen (%3)" -#: file_source.cc:250 file_source.cc:378 +#: file_source.cc:248 file_source.cc:372 msgid "FileSource: search path not set" msgstr "Dateiquelle: Suchpfad nicht gesetzt" -#: file_source.cc:313 file_source.cc:448 -msgid "Filesource: cannot find required file (%1): while searching %2" -msgstr "" -"Dateiquelle: kann benötigte Datei (%1) auf der Suche nach %2 nicht finden" +#: file_source.cc:309 file_source.cc:439 +msgid "Filesource: cannot find required file (%1)" +msgstr "Filesource: kann benötigte Datei (%1) nicht finden" -#: file_source.cc:440 +#: file_source.cc:432 msgid "" -"FileSource: \"%1\" is ambigous when searching %2\n" +"FileSource: \"%1\" is ambigous when searching\n" "\t" msgstr "" -"Dateiquelle: \"%1\" ist bei der Suche nach %2 mehrdeutig \n" +"FileSource: \"%1\" ist während der Suche doppeldeutig\n" "\t" -#: file_source.cc:494 +#: file_source.cc:484 msgid "Filesource: cannot find required file (%1): %2" msgstr "Dateiquelle: kann benötigte Datei (%1) nicht finden: %2" -#: file_source.cc:501 +#: file_source.cc:492 msgid "Filesource: cannot check for existing file (%1): %2" msgstr "Dateiquelle: kann Datei (%1) nicht auf Existenz überprüfen: %2" -#: file_source.cc:535 +#: file_source.cc:526 msgid "" "Programming error! %1 tried to rename a file over another file! It's safe to " "continue working, but please report this to the developers." @@ -696,7 +718,7 @@ msgstr "" "Namen umzubenennen! Sie können weiterarbeiten, aber melden Sie dies bitte " "den Entwicklern." -#: file_source.cc:540 +#: file_source.cc:531 msgid "cannot rename file %1 to %2 (%3)" msgstr "kann Datei %1 nicht nach %2 umbenennen (%3)" @@ -712,15 +734,15 @@ msgstr "" "Konfigurationsverzeichnis %1 existiert bereits, ist aber kein Verzeichnis/" "Ordner - kann nicht starten" -#: filesystem_paths.cc:91 +#: filesystem_paths.cc:96 msgid "ARDOUR_DLL_PATH not set in environment - exiting\n" msgstr "Umgebungsvariable ARDOUR_DLL_PATH ist nicht gesetzt - beende\n" -#: filesystem_paths.cc:107 +#: filesystem_paths.cc:125 msgid "ARDOUR_CONFIG_PATH not set in environment - exiting\n" msgstr "Umgebungsvariable ARDOUR_CONFIG_PATH ist nicht gesetzt - beende\n" -#: filesystem_paths.cc:127 +#: filesystem_paths.cc:148 msgid "ARDOUR_DATA_PATH not set in environment - exiting\n" msgstr "Umgebungsvariable ARDOUR_DATA_PATH ist nicht gesetzt - beende\n" @@ -732,88 +754,84 @@ msgstr "Filter: Fehler beim Erzeugen des neuen Dateinamens aus %1" msgid "filter: error creating new file %1 (%2)" msgstr "Filter: Fehler beim Erzeugen der neuen Datei %1 (%2)" -#: find_session.cc:51 -msgid "Could not resolve path: %1 (%2)" -msgstr "Konnte den Pfad: %1 nicht auflösen (%2)" - -#: find_session.cc:63 +#: find_session.cc:59 msgid "cannot check session path %1 (%2)" msgstr "Kann Projektpfad %1 nicht überprüfen (%2)" -#: find_session.cc:89 +#: find_session.cc:85 msgid "cannot check statefile %1 (%2)" msgstr "Kann die Projektdatei %1 nicht überprüfen (%2)" -#: find_session.cc:125 +#: find_session.cc:121 msgid "%1 is not a snapshot file" msgstr "%1 ist keine Schnappschussdatei" -#: find_session.cc:142 +#: find_session.cc:138 msgid "cannot determine current working directory (%1)" msgstr "kann momentanes Arbeitsverzeichnis nicht bestimmen (%1)" -#: find_session.cc:159 +#: find_session.cc:155 msgid "unknown file type for session %1" msgstr "Unbekannter Dateityp für Projekt %1" -#: globals.cc:207 +#: globals.cc:216 msgid "Could not set system open files limit to \"unlimited\"" msgstr "" "Konnte die Systemgrenze für offene Dateien nicht auf \"unbeschränkt\" setzen" -#: globals.cc:209 +#: globals.cc:218 msgid "Could not set system open files limit to %1" msgstr "Konnte die Systemgrenze für offene Dateien nicht auf %1 setzen" -#: globals.cc:213 +#: globals.cc:222 msgid "Your system is configured to limit %1 to only %2 open files" msgstr "Ihre Systemkonfiguration beschränkt %1 auf nur %2 offene Dateien" -#: globals.cc:217 +#: globals.cc:226 msgid "Could not get system open files limit (%1)" msgstr "Konnte die Grenze für offene Dateien nicht erhalten (%1)" -#: globals.cc:268 +#: globals.cc:280 msgid "Loading configuration" msgstr "Lade Konfiguration" -#: import.cc:207 +#: import.cc:208 msgid "Could not find a source for %1 even though we are updating this file!" msgstr "Konte keine Quelle für %1 finden, obwohl wir diese Datei updaten!" -#: import.cc:236 +#: import.cc:237 msgid "Unable to create file %1 during import" msgstr "Kann Datei %1 während des Importierens nicht erzeugen" -#: import.cc:262 +#: import.cc:263 msgid "Resampling %1 from %2kHz to %3kHz" msgstr "Resample %1 von %2kHz nach %3kHz" -#: import.cc:268 +#: import.cc:269 msgid "Copying %1" msgstr "Kopiere %1" -#: import.cc:446 +#: import.cc:455 msgid "Track %1 of %2 contained no usable MIDI data" msgstr "Spur %1 von %2 beinhaltet keine brauchbaren MIDI-Daten" -#: import.cc:453 +#: import.cc:462 msgid "MIDI file %1 was not readable (no reason available)" msgstr "MIDI-Datei %1 war unlesbar (keine Ursache ermittelbar)" -#: import.cc:499 +#: import.cc:508 msgid "Import: cannot open input sound file \"%1\"" msgstr "Import: kann Audiodatei \"%1\" nicht öffnen" -#: import.cc:510 +#: import.cc:519 msgid "Import: error opening MIDI file" msgstr "Import: Fehler beim Öffnen der MIDI-Datei" -#: import.cc:549 +#: import.cc:558 msgid "Loading MIDI file %1" msgstr "Lade MIDI-Datei %1" -#: import.cc:614 +#: import.cc:623 msgid "Failed to remove some files after failed/cancelled import operation" msgstr "" "Konnte einige Dateien nach fehlgeschlagenem/abgebrochenem Import nicht " @@ -827,121 +845,125 @@ msgstr "Unbekannt" msgid "preset %1 (bank %2)" msgstr "Preset %1 (Bank %2)" -#: internal_send.cc:278 internal_send.cc:279 +#: internal_send.cc:300 internal_send.cc:301 msgid "%1 - cannot find any track/bus with the ID %2 to connect to" msgstr "%1 - kann Spur/Bus mit der ID %2 zum Verbinden finden" -#: io.cc:208 +#: io.cc:209 msgid "IO: cannot disconnect port %1 from %2" msgstr "IO: kann Port %1 nicht von %2 trennen" -#: io.cc:343 io.cc:428 +#: io.cc:344 io.cc:431 msgid "IO: cannot register input port %1" msgstr "IO: kann Eingangsport %1 nicht registrieren" -#: io.cc:348 io.cc:433 +#: io.cc:349 io.cc:436 msgid "IO: cannot register output port %1" msgstr "IO: kann Ausgangsport %1 nicht registrieren" -#: io.cc:591 io.cc:647 +#: io.cc:598 io.cc:654 msgid "incorrect XML node \"%1\" passed to IO object" msgstr "unkorrekter XML-Knoten \"%1\" an IO Objekt weitergereicht" -#: io.cc:706 +#: io.cc:713 msgid "in" msgstr "in" -#: io.cc:706 +#: io.cc:713 msgid "out" msgstr "out" -#: io.cc:707 +#: io.cc:714 msgid "input" msgstr "Eingang" -#: io.cc:707 +#: io.cc:714 msgid "output" msgstr "Ausgang" -#: io.cc:717 +#: io.cc:724 msgid "Unknown bundle \"%1\" listed for %2 of %3" msgstr "Unbekanntes Bündel \"%1\" für %2 von %3 genannt" -#: io.cc:783 +#: io.cc:790 msgid "Bundle %1 was not available - \"%2\" used instead" msgstr "Bündel %1 war nicht verfügbar - verwende stattdessen \"%2\" " -#: io.cc:786 +#: io.cc:793 msgid "No %1 bundles available as a replacement" msgstr "%1 Bündel nicht als Ersatz verfügbar" -#: io.cc:889 +#: io.cc:896 msgid "%1: cannot create I/O ports" msgstr "%1: kann keine E/A-Ports erzeugen" -#: io.cc:1017 io.cc:1121 +#: io.cc:1024 io.cc:1128 msgid "IO: badly formed string in XML node for inputs \"%1\"" msgstr "IO: schlecht geformte Zeichenkette in XML-Knoten für Eingänge \"%1\"" -#: io.cc:1022 io.cc:1126 +#: io.cc:1029 io.cc:1133 msgid "bad input string in XML node \"%1\"" msgstr "IO: schlechte Zeichenkette für Eingang in XML-Knoten \"%1\"" -#: io.cc:1060 +#: io.cc:1067 msgid "IO: badly formed string in XML node for outputs \"%1\"" msgstr "IO: schlecht geformte Zeichenkette in XML-Knoten für Ausgänge \"%1\"" -#: io.cc:1065 +#: io.cc:1072 msgid "IO: bad output string in XML node \"%1\"" msgstr "IO: schlechte Zeichenkette für Ausgang in XML-Knoten \"%1\"" -#: io.cc:1411 +#: io.cc:1417 #, c-format msgid "%s %u" msgstr "%s %u" -#: io.cc:1458 +#: io.cc:1464 #, c-format msgid "%s in" msgstr "%s in" -#: io.cc:1460 +#: io.cc:1466 #, c-format msgid "%s out" msgstr "%s out" -#: io.cc:1535 session.cc:686 session.cc:715 +#: io.cc:1541 session.cc:689 session.cc:718 msgid "mono" msgstr "Mono" -#: io.cc:1537 session.cc:699 session.cc:729 +#: io.cc:1543 session.cc:702 session.cc:732 msgid "L" msgstr "L" -#: io.cc:1537 session.cc:701 session.cc:731 +#: io.cc:1543 session.cc:704 session.cc:734 msgid "R" msgstr "R" -#: io.cc:1539 io.cc:1545 +#: io.cc:1545 io.cc:1551 #, c-format msgid "%d" msgstr "%d" -#: ladspa_plugin.cc:86 +#: ladspa_plugin.cc:93 +msgid "LADSPA: Unable to open module: " +msgstr "LADSPA: Kann Modul nicht öffnen: " + +#: ladspa_plugin.cc:99 msgid "LADSPA: module has no descriptor function." msgstr "LADSPA: Modul hat keine Beschreibungsfunktion" -#: ladspa_plugin.cc:91 +#: ladspa_plugin.cc:106 msgid "LADSPA: plugin has gone away since discovery!" msgstr "LADSPA: Plugin ist nicht mehr auffindbar!" -#: ladspa_plugin.cc:98 +#: ladspa_plugin.cc:113 msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing" msgstr "" "LADSPA: \"%1\" kann nicht verwendet werdeen, da es kein \"inplace processing" "\" beherrscht" -#: ladspa_plugin.cc:297 +#: ladspa_plugin.cc:311 msgid "" "illegal parameter number used with plugin \"%1\". This may indicate a change " "in the plugin design, and presets may be invalid" @@ -949,35 +971,31 @@ msgstr "" "Falsche Parameterzahl für Plugin \"%1\". Das auf eine Änderung im Plugin-" "Design hindeuten, und Presets sind eventuell ungültig" -#: ladspa_plugin.cc:376 ladspa_plugin.cc:426 +#: ladspa_plugin.cc:390 ladspa_plugin.cc:440 msgid "Bad node sent to LadspaPlugin::set_state" msgstr "Schlechter Knoten an LadspaPlugin::set_state gesendet" -#: ladspa_plugin.cc:391 ladspa_plugin.cc:440 +#: ladspa_plugin.cc:405 ladspa_plugin.cc:454 msgid "LADSPA: no ladspa port number" msgstr "LADSPA: keine LADSPA-Portnummer" -#: ladspa_plugin.cc:397 ladspa_plugin.cc:446 +#: ladspa_plugin.cc:411 ladspa_plugin.cc:460 msgid "LADSPA: no ladspa port data" msgstr "LADSPA: keine LADSPA-Portdaten" -#: ladspa_plugin.cc:717 -msgid "LADSPA: cannot load module from \"%1\"" -msgstr "LADSPA: kann Modul nicht aus \"%1\" laden" - -#: ladspa_plugin.cc:827 +#: ladspa_plugin.cc:840 msgid "Could not locate HOME. Preset not removed." msgstr "Konnte HOME nicht eruieren. Preset nicht entfernt." -#: ladspa_plugin.cc:864 ladspa_plugin.cc:870 +#: ladspa_plugin.cc:879 ladspa_plugin.cc:885 msgid "Could not create %1. Preset not saved. (%2)" msgstr "Konnte %1 nicht erzeugen. Preset nicht gesichert. (%2)" -#: ladspa_plugin.cc:877 +#: ladspa_plugin.cc:892 msgid "Error saving presets file %1." msgstr "Fehler beim Sichern der Preset-Datei %1." -#: ladspa_plugin.cc:915 +#: ladspa_plugin.cc:934 msgid "Could not locate HOME. Preset not saved." msgstr "Konnte HOME nicht eruieren. Preset nicht gesichert." @@ -1019,7 +1037,7 @@ msgstr "" msgid "incorrect XML mode passed to Locations::set_state" msgstr "unkorrekter XML-Modus an Locations::set_state weitergereicht" -#: location.cc:842 session.cc:4516 session_state.cc:1031 +#: location.cc:842 session.cc:4533 session_state.cc:1025 msgid "session" msgstr "Projekt" @@ -1087,43 +1105,42 @@ msgstr "" "Die Frameraten von Projekt und LTC unterscheiden sich: LTC: %1 Projekt: %2." #: ltc_slave.cc:591 -#, c-format msgid "flywheel" msgstr "Schwungrad" -#: midi_diskstream.cc:167 +#: midi_diskstream.cc:166 msgid "" "%1: I/O configuration change %4 requested to use %2, but channel setup is %3" msgstr "" "%1: E/A-Konfigurationsänderung %4 will %2 verwenden, aber Kanalzahl ist %3" -#: midi_diskstream.cc:219 +#: midi_diskstream.cc:218 msgid "MidiDiskstream: Playlist \"%1\" isn't a midi playlist" msgstr "MidiDiskstream: Wiedergabeliste \"%1\" ist keine MIDI-Wiedergabeliste" -#: midi_diskstream.cc:270 +#: midi_diskstream.cc:269 msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!" msgstr "MidiDiskstream %1: es gibt keine Wiedergabeliste zum Kopieren!" -#: midi_diskstream.cc:699 +#: midi_diskstream.cc:698 msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3" msgstr "" "MidiDiskstream %1: kann %2 nicht von Wiedergabeliste bei Frame %3 lesen" -#: midi_diskstream.cc:834 +#: midi_diskstream.cc:833 msgid "MidiDiskstream %1: cannot write to disk" msgstr "MidiDiskstream %1: kann nicht auf Disk schreiben" -#: midi_diskstream.cc:868 +#: midi_diskstream.cc:867 msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!" msgstr "" "MidiDiskstream \"%1\": kann aufgenommene Daten nicht auf Disk schreiben!" -#: midi_diskstream.cc:955 +#: midi_diskstream.cc:954 msgid "%1: could not create region for complete midi file" msgstr "%1: konnte Region für die komplette MIDI-Datei nicht erzeugen" -#: midi_diskstream.cc:992 +#: midi_diskstream.cc:991 msgid "MidiDiskstream: could not create region for captured midi!" msgstr "MidiDiskstream: konnte Region für aufgenommenes MIDI nicht erzeugen" @@ -1138,27 +1155,27 @@ msgstr "" "Keine SysExID für die Änderung der Eigenschaft \"sys-ex\" gefunden - " "ignoriert" -#: midi_model.cc:2010 +#: midi_model.cc:2012 msgid "transpose" msgstr "transponieren" -#: midi_patch_manager.cc:126 +#: midi_patch_manager.cc:127 msgid "Duplicate MIDI device `%1' in `%2' ignored" msgstr "Doppeltes MIDI-Gerät '%1' in '%2' ignoriert" -#: midi_source.cc:125 +#: midi_source.cc:124 msgid "Missing parameter property on InterpolationStyle" msgstr "Fehlende Eigenschaft \"parameter\" bei InterpolationStyle" -#: midi_source.cc:132 +#: midi_source.cc:131 msgid "Missing style property on InterpolationStyle" msgstr "Fehlende Eigenschaft \"style\" bei InterpolationStyle" -#: midi_source.cc:144 +#: midi_source.cc:143 msgid "Missing parameter property on AutomationState" msgstr "Fehlende Eigenschaft \"parameter\" bei AutomationState" -#: midi_source.cc:151 +#: midi_source.cc:150 msgid "Missing state property on AutomationState" msgstr "Fehlende Eigenschaft \"state\" bei AutomationState" @@ -1202,11 +1219,11 @@ msgstr "Polaritätsschalter" msgid "solo control" msgstr "Solo-Schalter" -#: mtc_slave.cc:238 +#: mtc_slave.cc:240 msgid "MTC Slave: atomic read of current time failed, sleeping!" msgstr "MTC Slave: Fehler beim atomisches Lesen der momentanen Zeit, schlafe!" -#: mtc_slave.cc:361 +#: mtc_slave.cc:362 msgid "" "Unknown rate/drop value %1 in incoming MTC stream, session values used " "instead" @@ -1214,11 +1231,11 @@ msgstr "" "Unbekannter Wert %1 für Rate/Abfall in eingehendem MTC-Datenstrom, verwende " "Projektwerte" -#: mtc_slave.cc:381 +#: mtc_slave.cc:382 msgid "Session framerate adjusted from %1 TO: MTC's %2." msgstr "Projekt-Framerate von %1 auf die von MTC: %2 geändert" -#: mtc_slave.cc:395 +#: mtc_slave.cc:396 msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3." msgstr "Framerate von Projekt und MTC stimmen nicht überein: MTC: %1 %2: %3" @@ -1278,31 +1295,35 @@ msgstr "Region mit fixierter Zeit kopieren" msgid "Pannable given XML data for %1 - ignored" msgstr "Pannerziel bekam XML-Daten für %1 übergeben - ignoriert" -#: panner_manager.cc:76 -msgid "looking for panners in %1" -msgstr "Suche nach Pannern in %1" +#: panner_manager.cc:80 +msgid "looking for panners in %1\n" +msgstr "suche nach Pannern in %1\n" -#: panner_manager.cc:100 -msgid "Panner discovered: \"%1\" in %2" -msgstr "Panner gefunden: \"%1\" in %2" +#: panner_manager.cc:108 +msgid "Panner discovered: \"%1\" in %2\n" +msgstr "Panner gefunden: \"%1\" in %2\n" -#: panner_manager.cc:117 +#: panner_manager.cc:125 msgid "PannerManager: cannot load module \"%1\" (%2)" msgstr "PannerManager: kann Modul \"%1\" nicht laden (%2)" -#: panner_manager.cc:124 +#: panner_manager.cc:132 msgid "PannerManager: module \"%1\" has no descriptor function." msgstr "PannerManager: Modul \"%1\" hat keine Beschreibungsfunktion" -#: panner_manager.cc:187 +#: panner_manager.cc:219 msgid "no panner discovered for in/out = %1/%2" msgstr "keinen Panner für %1/%2 Ein/Ausgänge gefunden" -#: panner_shell.cc:179 +#: panner_shell.cc:126 +msgid "select panner: %1\n" +msgstr "wähle Panner: %1\n" + +#: panner_shell.cc:245 msgid "Unknown panner plugin \"%1\" found in pan state - ignored" msgstr "Unbekanntes Panner-Plugin \"%1\" in Pan-Status gefunden - ignoriert" -#: panner_shell.cc:185 +#: panner_shell.cc:251 msgid "panner plugin node has no type information!" msgstr "Panner Plugin-Knoten hat keine Typinformation!" @@ -1324,7 +1345,7 @@ msgstr "" "Konnte die Wiedergabeliste nicht aus den Quelldaten des Projekts " "konstruieren!" -#: plugin.cc:324 +#: plugin.cc:328 msgid "" "Plugin presets are not supported in this build of %1. Consider paying for a " "full version" @@ -1332,7 +1353,7 @@ msgstr "" "Pluginpresets werden in diesem %1-Binärpaket nicht unterstützt. Erwägen Sie, " "für die Vollversion zu bezahlen" -#: plugin.cc:398 +#: plugin.cc:402 msgid "" "Saving plugin settings is not supported in this build of %1. Consider paying " "for the full version" @@ -1340,7 +1361,7 @@ msgstr "" "Das Speichern von Pluginpresets werden in diesem %1-Binärpaket nicht " "unterstützt. Erwägen Sie, für die Vollversion zu bezahlen" -#: plugin_insert.cc:598 +#: plugin_insert.cc:589 msgid "programming error: " msgstr "Programmierfehler:" @@ -1377,23 +1398,23 @@ msgid "PluginInsert: automatable control %1 not found - ignored" msgstr "" "PluginInsert: automatisierbares Kontrollelement %1 nicht gefunden - ignoriert" -#: plugin_manager.cc:161 +#: plugin_manager.cc:165 msgid "Discovering Plugins" msgstr "Finde Plugins" -#: plugin_manager.cc:335 +#: plugin_manager.cc:286 msgid "Could not parse rdf file: %1" msgstr "Konnte RDF-Datei: %1 nicht parsen" -#: plugin_manager.cc:374 +#: plugin_manager.cc:330 msgid "LADSPA: cannot load module \"%1\" (%2)" msgstr "LADSPA: kann Modul \"%1\" nicht laden (%2)" -#: plugin_manager.cc:381 +#: plugin_manager.cc:337 msgid "LADSPA: module \"%1\" has no descriptor function." msgstr "LADSPA: Modul \"%1\" hat keine Beschreibungsfunktion." -#: plugin_manager.cc:602 +#: plugin_manager.cc:567 msgid "" "VST plugin %1 does not support processReplacing, and so cannot be used in %2 " "at this time" @@ -1401,7 +1422,7 @@ msgstr "" "VST-Plugin %1 unterstützt kein processReplacing und kann daher zur Zeit " "nicht mit %2 benützt werden" -#: plugin_manager.cc:709 +#: plugin_manager.cc:680 msgid "" "linuxVST plugin %1 does not support processReplacing, and so cannot be used " "in %2 at this time" @@ -1409,15 +1430,15 @@ msgstr "" "linuxVST-Plugin %1 unterstützt kein processReplacing und kann daher zur Zeit " "nicht mit %2 benützt werden" -#: plugin_manager.cc:870 +#: plugin_manager.cc:841 msgid "unknown plugin status type \"%1\" - all entries ignored" msgstr "unbekannter Plugin-Statustyp \"%1\" - alle Einträge ignoriert" -#: plugin_manager.cc:887 +#: plugin_manager.cc:858 msgid "unknown plugin type \"%1\" - ignored" msgstr "unbekannter Plugintyp \"%1\" - ignoriert" -#: port.cc:410 +#: port.cc:412 msgid "could not reregister %1" msgstr "konnte %1 nicht erneut registrieren" @@ -1425,12 +1446,12 @@ msgstr "konnte %1 nicht erneut registrieren" msgid "insert %1" msgstr "%1 einfügen" -#: port_insert.cc:198 +#: port_insert.cc:197 msgid "XML node describing port insert is missing the `type' field" msgstr "" "Dem XML-Knoten zur Beschreibung des Port-Insert fehlt das Feld \"type\"" -#: port_insert.cc:203 +#: port_insert.cc:202 msgid "non-port insert XML used for port plugin insert" msgstr "Nicht-Port-Insert XML zum Einfügen eines Port-Plugin benutzt" @@ -1466,11 +1487,11 @@ msgstr "AudioEngine: kann %1 (%2) nicht mit %3 (%4) verbinden" msgid "Re-establising port %1 failed" msgstr "Portwiederherstellung fehlgeschlagen" -#: processor.cc:207 +#: processor.cc:208 msgid "No %1 property flag in element %2" msgstr "Kein Flag für Eigenschaft \"%1\" in Element %2" -#: processor.cc:216 +#: processor.cc:217 msgid "No child node with active property" msgstr "Kein Kindknoten mit der Eigenschaft \"aktiv\"" @@ -1538,11 +1559,11 @@ msgstr "%1 verbunden-%2.1 (%3)" msgid "cannot create new name for region \"%1\"" msgstr "kann keinen neuen Namen für Region \"%1\" erzeugen" -#: resampled_source.cc:98 +#: resampled_source.cc:102 msgid "Import: %1" msgstr "Import: %1" -#: resampled_source.cc:128 +#: resampled_source.cc:132 srcfilesource.cc:76 msgid "Import: src_new() failed : %1" msgstr "Import: Fehler in src_new() : %1" @@ -1550,31 +1571,33 @@ msgstr "Import: Fehler in src_new() : %1" msgid "return %1" msgstr "Rückgabewert: %1" -#: route.cc:1075 route.cc:2528 +#: route.cc:1081 route.cc:2541 msgid "unknown Processor type \"%1\"; ignored" msgstr "unbekannter Prozessortyp \"%1\"; ignoriert" -#: route.cc:1087 +#: route.cc:1093 msgid "processor could not be created. Ignored." msgstr "Prozessor konnte nicht erzeugt werden. Ignoriert." -#: route.cc:1962 route.cc:2187 +#: route.cc:1975 route.cc:2200 msgid "Bad node sent to Route::set_state() [%1]" msgstr "Schlechter Knoten an Route::set_state() gesendet [%1]" -#: route.cc:2022 +#: route.cc:2035 msgid "Pannable state found for route (%1) without a panner!" msgstr "Pannerziel-Status für Route (%1) ohne Panner gefunden!" -#: route.cc:2096 route.cc:2100 route.cc:2301 route.cc:2305 +#: route.cc:2109 route.cc:2113 route.cc:2314 route.cc:2318 msgid "badly formed order key string in state file! [%1] ... ignored." msgstr "" "schlecht geformte Zeichenkette für den Schlüssel der Sortierreihenfolge in " "der Projektdatei! [%1] ... ignoriert" -#: route.cc:2311 +#: route.cc:2324 msgid "Converting deprecated order key for %1 using Editor order %2" msgstr "" +"Konvertiere veralteten Sortierschlüssel für %1 unter Nutzung der " +"Editorreihenfolge %2" #: route_group.cc:459 msgid "You cannot subgroup MIDI tracks at this time" @@ -1590,15 +1613,15 @@ msgstr "" msgid "error writing tempo-adjusted data to %1" msgstr "Fehler beim Schreiben der tempo-angepassten Daten nach %1" -#: send.cc:59 +#: send.cc:60 msgid "aux %1" msgstr "Aux %1" -#: send.cc:63 +#: send.cc:64 msgid "send %1" msgstr "Send %1" -#: send.cc:65 +#: send.cc:66 msgid "programming error: send created using role %1" msgstr "Programmierfehler: Send erzeugt mittels Rolle %1" @@ -1622,62 +1645,62 @@ msgstr "Klick einrichten" msgid "Set up standard connections" msgstr "Richte Standard-Verbindungen ein" -#: session.cc:635 +#: session.cc:638 msgid "could not setup Click I/O" msgstr "konnte Metronom-E/A nicht einrichten" -#: session.cc:683 +#: session.cc:686 #, c-format msgid "out %<PRIu32>" msgstr "out %<PRIu32>" -#: session.cc:697 +#: session.cc:700 #, c-format msgid "out %<PRIu32>+%<PRIu32>" msgstr "out %<PRIu32>+%<PRIu32>" -#: session.cc:712 +#: session.cc:715 #, c-format msgid "in %<PRIu32>" msgstr "in %<PRIu32>" -#: session.cc:726 +#: session.cc:729 #, c-format msgid "in %<PRIu32>+%<PRIu32>" msgstr "in %<PRIu32>+%<PRIu32>" -#: session.cc:790 +#: session.cc:793 msgid "cannot connect master output %1 to %2" msgstr "kann Master-Ausgang %1 nicht mit %2 verbinden" -#: session.cc:849 +#: session.cc:862 msgid "monitor" msgstr "Monitor" -#: session.cc:894 +#: session.cc:907 msgid "cannot connect control input %1 to %2" msgstr "kann Kontrolleingang %1 nicht mit %2 verbinden" -#: session.cc:914 +#: session.cc:927 msgid "The preferred I/O for the monitor bus (%1) cannot be found" msgstr "Bevorzugte E/A für den Monitorbus (%1) kann nicht gefunden werden" -#: session.cc:945 +#: session.cc:958 msgid "cannot connect control output %1 to %2" msgstr "kann Kontrollausgang %1 nicht mit %2 verbinden" -#: session.cc:1009 +#: session.cc:1026 msgid "cannot create Auditioner: no auditioning of regions possible" msgstr "" "Kann das Vorhör-System nicht einrichten: kein Vorhören von Regionen möglich" -#: session.cc:1193 +#: session.cc:1210 msgid "Session: you can't use that location for auto punch (start <= end)" msgstr "" "Session: Sie können diese Position nicht für Auto-Punch verwenden (Start <= " "Ende) " -#: session.cc:1233 +#: session.cc:1250 msgid "" "You cannot use this location for auto-loop because it has zero or negative " "length" @@ -1685,15 +1708,15 @@ msgstr "" "Sie können diese Position nicht für \"automatische Schleife\" verwenden, da " "sie keine oder eine negative Länge hat" -#: session.cc:1547 +#: session.cc:1564 msgid "feedback loop setup between %1 and %2" msgstr "Feedbackschleife zwischen %1 und %2 erkannt" -#: session.cc:1843 +#: session.cc:1860 msgid "Session: could not create new midi track." msgstr "Session: konnte keine neue MIDI-Spur erzeugen." -#: session.cc:1849 +#: session.cc:1866 msgid "" "No more JACK ports are available. You will need to stop %1 and restart JACK " "with more ports if you need this many tracks." @@ -1701,76 +1724,76 @@ msgstr "" "Keine JACK-Ports mehr verfügbar. Wenn Sie so viele Spuren benötigen, müssen " "Sie %1 stoppen und JACK mit mehr Ports neu starten." -#: session.cc:2026 session.cc:2029 +#: session.cc:2043 session.cc:2046 msgid "Audio" msgstr "Audio" -#: session.cc:2053 session.cc:2061 session.cc:2138 session.cc:2146 +#: session.cc:2070 session.cc:2078 session.cc:2155 session.cc:2163 msgid "cannot configure %1 in/%2 out configuration for new audio track" msgstr "kann %1 ein/%2 aus für neue Audiospur nicht konfigurieren" -#: session.cc:2084 +#: session.cc:2101 msgid "Session: could not create new audio track." msgstr "Session: konnte keine neue Audios.pur erzeugen" -#: session.cc:2116 session.cc:2119 +#: session.cc:2133 session.cc:2136 msgid "Bus" msgstr "Bus" -#: session.cc:2169 +#: session.cc:2186 msgid "Session: could not create new audio route." msgstr "Session: konnte keine neueAudio-Route erzeugen" -#: session.cc:2228 session.cc:2238 +#: session.cc:2245 session.cc:2255 msgid "Session: UINT_MAX routes? impossible!" msgstr "Session: UINT_MAX Routen? unmöglich!" -#: session.cc:2260 +#: session.cc:2277 msgid "Session: cannot create track/bus from template description" msgstr "Session: Kann die Route aus der Vorlagenbeschreibung nicht erzeugen" -#: session.cc:2286 +#: session.cc:2303 msgid "Session: could not create new route from template" msgstr "Session: konnte keine neue Route aus der Vorlage erzeugen." -#: session.cc:2315 +#: session.cc:2332 msgid "Adding new tracks/busses failed" msgstr "Fehler beim Hinzufügen neuer Spuren/Busse" -#: session.cc:3419 +#: session.cc:3436 msgid "FATAL ERROR! Could not find a suitable version of %1 for a rename" msgstr "" "FATALER FEHLER! Konnte keine passende Version von %1 zum Umbenennen finden" -#: session.cc:3539 session.cc:3597 +#: session.cc:3556 session.cc:3614 msgid "There are already %1 recordings for %2, which I consider too many." msgstr "Es gibt bereits %1 Aufnahmen für %2, was ich als zu viele erachte." -#: session.cc:3987 +#: session.cc:4004 msgid "send ID %1 appears to be in use already" msgstr "Send ID %1 ist offenbar schon in Gebrauch" -#: session.cc:3999 +#: session.cc:4016 msgid "aux send ID %1 appears to be in use already" msgstr "Aux-Send ID %1 ist offenbar schon in Gebrauch" -#: session.cc:4011 +#: session.cc:4028 msgid "return ID %1 appears to be in use already" msgstr "Return ID %1 ist offenbar schon in Gebrauch" -#: session.cc:4023 +#: session.cc:4040 msgid "insert ID %1 appears to be in use already" msgstr "Insert ID %1 ist offenbar schon in Gebrauch" -#: session.cc:4150 +#: session.cc:4167 msgid "Cannot write a range where end <= start (e.g. %1 <= %2)" msgstr "Kann einen Bereich mit Ende <= Start nicht schreiben (z.B. %1 <= %2)" -#: session.cc:4179 +#: session.cc:4196 msgid "too many bounced versions of playlist \"%1\"" msgstr "zu viele gebouncete Versionen der Wiedergabeliste \"%1\"" -#: session.cc:4189 +#: session.cc:4206 msgid "cannot create new audio file \"%1\" for %2" msgstr "kann keine neue Audiodatei \"%1\" für %2 erzeugen" @@ -1811,7 +1834,7 @@ msgstr "Kann Projektverzeichnis im Pfad %1 nicht erzeugen. Fehler: %2" msgid "Session subdirectory does not exist at path %1" msgstr "Projektunterverzeichnis im Pfad %1 existiert nicht" -#: session_events.cc:184 +#: session_events.cc:185 msgid "Session: cannot have two events of type %1 at the same frame (%2)." msgstr "" "Session: zwei Ereignisse des Typs %1 können nicht im selben Frame existieren " @@ -1825,7 +1848,7 @@ msgstr "%1: kann für Export nicht Dateiposition %2 aufsuchen" msgid "Export ended unexpectedly: %1" msgstr "Export endet unerwartet: %1" -#: session_ltc.cc:222 +#: session_ltc.cc:221 msgid "" "LTC encoder: invalid framerate - LTC encoding is disabled for the remainder " "of this session." @@ -1833,7 +1856,7 @@ msgstr "" "LTC-Kodierer: ungültige Framerate - das Kodieren von LTC wird für den " "restlichen Teil dieses Projekts ausgesetzt." -#: session_midi.cc:520 +#: session_midi.cc:519 msgid "Session: cannot send quarter-frame MTC message (%1)" msgstr "Session: kann quarter-frame MTC-Nachricht nicht senden (%1)" @@ -1845,97 +1868,93 @@ msgstr "Session: kann Wiedergabeliste nicht aus der XML-Beschreibung erzeugen" msgid "Session: error in no roll for %1" msgstr "Session: Fehler in no_roll für %1" -#: session_process.cc:1157 +#: session_process.cc:1159 msgid "Programming error: illegal event type in process_event (%1)" msgstr "Programmierfehler: illegaler Ereignistyp in process_event (%1)" -#: session_state.cc:140 -msgid "Could not use path %1 (%2)" -msgstr "Konnte Pfad %1 nicht benutzen (%2)" - -#: session_state.cc:184 +#: session_state.cc:178 msgid "solo cut control (dB)" msgstr "Solo Cut Einstellung (dB)" -#: session_state.cc:208 +#: session_state.cc:202 msgid "Set block size and sample rate" msgstr "Setze Blockgröße und Samplerate" -#: session_state.cc:213 +#: session_state.cc:207 msgid "Using configuration" msgstr "Benutze Konfiguration" -#: session_state.cc:325 +#: session_state.cc:319 msgid "Reset Remote Controls" msgstr "Fernbedienungen zurücksetzen" -#: session_state.cc:417 +#: session_state.cc:411 msgid "Session: cannot create session peakfile folder \"%1\" (%2)" msgstr "Session: kann den Peakfile Ordner \"%1\" nicht erzeugen (%2)" -#: session_state.cc:424 +#: session_state.cc:418 msgid "Session: cannot create session sounds dir \"%1\" (%2)" msgstr "" "Session: kann das Projektverzeichnis für Sounddateien \"%1\" nicht erzeugen " "(%2)" -#: session_state.cc:431 +#: session_state.cc:425 msgid "Session: cannot create session midi dir \"%1\" (%2)" msgstr "" "Session: kann das Projektverzeichnis für MIDI \"%1\" nicht erzeugen (%2)" -#: session_state.cc:438 +#: session_state.cc:432 msgid "Session: cannot create session dead sounds folder \"%1\" (%2)" msgstr "Session: kann den Mülleimer des Projektes \"%1\" nicht erzeugen (%2)" -#: session_state.cc:445 +#: session_state.cc:439 msgid "Session: cannot create session export folder \"%1\" (%2)" msgstr "" "Session: kann den Projektordner für Exportdateien \"%1\" nicht erzeugen (%2)" -#: session_state.cc:452 +#: session_state.cc:446 msgid "Session: cannot create session analysis folder \"%1\" (%2)" msgstr "" "Session: kann den Projektordner für Analysedaten \"%1\" nicht erzeugen (%2)" -#: session_state.cc:459 +#: session_state.cc:453 msgid "Session: cannot create session plugins folder \"%1\" (%2)" msgstr "Session: kann den Projektordner für Plugins \"%1\" nicht erzeugen (%2)" -#: session_state.cc:466 +#: session_state.cc:460 msgid "Session: cannot create session externals folder \"%1\" (%2)" msgstr "" "Session: kann den Projektordner für Externals \"%1\" nicht erzeugen (%2)" -#: session_state.cc:480 +#: session_state.cc:474 msgid "Session: cannot create session folder \"%1\" (%2)" msgstr "Session: kann den Projektordner \"%1\" nicht erzeugen (%2)" -#: session_state.cc:514 +#: session_state.cc:508 msgid "Could not open %1 for writing session template" msgstr "Konnte %1 nicht zum Schreiben der Projektvorlage öffnen" -#: session_state.cc:520 +#: session_state.cc:514 msgid "Could not open session template %1 for reading" msgstr "Konnte Projektvorlage %1 nicht zum Lesen öffnen" -#: session_state.cc:539 +#: session_state.cc:533 msgid "master" msgstr "Master" -#: session_state.cc:600 +#: session_state.cc:594 msgid "Could not remove pending capture state at path \"%1\" (%2)" msgstr "Konnte vorläufigen Aufnahmestatus im Pfad \"%1\" nicht entfernen (%2)" -#: session_state.cc:624 +#: session_state.cc:618 msgid "could not rename snapshot %1 to %2 (%3)" msgstr "Konnte Schnappschuss %1 nicht auf %2 umbenennen (%3)" -#: session_state.cc:652 +#: session_state.cc:646 msgid "Could not remove session file at path \"%1\" (%2)" msgstr "Konnte Projektdatei im Pfad \"%1\" nicht entfernen (%2)" -#: session_state.cc:669 +#: session_state.cc:663 msgid "" "the %1 audio engine is not connected and state saving would lose all I/O " "connections. Session not saved" @@ -1943,140 +1962,140 @@ msgstr "" "die %1 Audio-Engine ist nicht verbunden, beim Sichern würden Sie daher alle " "E/A-Verbindungen verlieren. Projekt nicht gesichert" -#: session_state.cc:720 +#: session_state.cc:714 msgid "state could not be saved to %1" msgstr "Status konnte nicht nach %1 gesichert werden" -#: session_state.cc:722 session_state.cc:733 +#: session_state.cc:716 session_state.cc:727 msgid "Could not remove temporary session file at path \"%1\" (%2)" msgstr "Konnte temporäre Projektdatei im Pfad \"%1\" nicht entfernen (%2)" -#: session_state.cc:730 -msgid "could not rename temporary session file %1 to %2" -msgstr "Konnte temporäre Projektdatei %1 nicht nach %2 umbenennen" +#: session_state.cc:724 +msgid "could not rename temporary session file %1 to %2 (%3)" +msgstr "konnte temporäre Projektdatei %1 nicht nach %2 umbenennen(%3)" -#: session_state.cc:798 +#: session_state.cc:792 msgid "%1: session file \"%2\" doesn't exist!" msgstr "%1: Projektdatei \"%2\" existiert nicht!" -#: session_state.cc:810 +#: session_state.cc:804 msgid "Could not understand session file %1" msgstr "Konnte Projektdatei \"%1\" nicht verstehen" -#: session_state.cc:819 +#: session_state.cc:813 msgid "Session file %1 is not a session" msgstr "Projektdatei %1 ist kein Projekt" -#: session_state.cc:1125 +#: session_state.cc:1119 msgid "programming error: Session: incorrect XML node sent to set_state()" msgstr "" "Programmierfehler: Session: Inkorrekter XML-Knoten an send_state() gesendet" -#: session_state.cc:1179 +#: session_state.cc:1173 msgid "Session: XML state has no options section" msgstr "Session: XML hat keinen Abschnitt \"options\"" -#: session_state.cc:1184 +#: session_state.cc:1178 msgid "Session: XML state has no metadata section" msgstr "Session: XML hat keinen Abschnitt \"metadata\"" -#: session_state.cc:1195 +#: session_state.cc:1189 msgid "Session: XML state has no sources section" msgstr "Session: XML hat keinen Abschnitt \"sources\"" -#: session_state.cc:1202 +#: session_state.cc:1196 msgid "Session: XML state has no Tempo Map section" msgstr "Session: XML hat keinen Abschnitt \"Tempo Map\"" -#: session_state.cc:1209 +#: session_state.cc:1203 msgid "Session: XML state has no locations section" msgstr "Session: XML hat keinen Abschnitt \"locations\"" -#: session_state.cc:1235 +#: session_state.cc:1229 msgid "Session: XML state has no Regions section" msgstr "Session: XML hat keinen Abschnitt \"Regions\"" -#: session_state.cc:1242 +#: session_state.cc:1236 msgid "Session: XML state has no playlists section" msgstr "Session: XML hat keinen Abschnitt \"playlists\"" -#: session_state.cc:1262 +#: session_state.cc:1256 msgid "Session: XML state has no bundles section" msgstr "Session: XML hat keinen Abschnitt \"bundles\"" -#: session_state.cc:1274 +#: session_state.cc:1268 msgid "Session: XML state has no diskstreams section" msgstr "Session: XML hat keinen Abschnitt \"diskstreams\"" -#: session_state.cc:1282 +#: session_state.cc:1276 msgid "Session: XML state has no routes section" msgstr "Session: XML hat keinen Abschnitt \"routes\"" -#: session_state.cc:1294 +#: session_state.cc:1288 msgid "Session: XML state has no route groups section" msgstr "Session: XML hat keinen Abschnitt \"route groups\"" -#: session_state.cc:1303 +#: session_state.cc:1297 msgid "Session: XML state has no edit groups section" msgstr "Session: XML hat keinen Abschnitt \"edit groups\"" -#: session_state.cc:1310 +#: session_state.cc:1304 msgid "Session: XML state has no mix groups section" msgstr "Session: XML hat keinen Abschnitt \"mix groups\"" -#: session_state.cc:1318 +#: session_state.cc:1312 msgid "Session: XML state has no click section" msgstr "Session: XML hat keinen Abschnitt \"click\"" -#: session_state.cc:1360 +#: session_state.cc:1354 msgid "Session: cannot create Route from XML description." msgstr "Session: Kann die Route aus der XML-Beschreibung nicht erzeugen" -#: session_state.cc:1364 +#: session_state.cc:1358 msgid "Loaded track/bus %1" msgstr "Spur/Bus %1 wurde geladen" -#: session_state.cc:1462 +#: session_state.cc:1456 msgid "Could not find diskstream for route" msgstr "Konnte Diskstream für Route nicht finden" -#: session_state.cc:1516 +#: session_state.cc:1510 msgid "Session: cannot create Region from XML description." msgstr "Session: kann Region nicht aus XML-Beschreibung erzeugen" -#: session_state.cc:1520 +#: session_state.cc:1514 msgid "Can not load state for region '%1'" msgstr "Kann Status für Region '%1' nicht laden" -#: session_state.cc:1556 +#: session_state.cc:1550 msgid "Regions in compound description not found (ID's %1 and %2): ignored" msgstr "" "Regionen der Verbindungsbeschreibung nicht gefunden (IDs %1 and %2): " "ignoriert" -#: session_state.cc:1584 +#: session_state.cc:1578 msgid "Nested source has no ID info in session file! (ignored)" msgstr "" "Verschachtelte Quelle hat keine ID-Information in Projektdatei! (ignoriert)" -#: session_state.cc:1596 +#: session_state.cc:1590 msgid "Cannot reconstruct nested source for region %1" msgstr "Kann verschachtelte Quelle für Region %1 nicht wiederherstellen" -#: session_state.cc:1658 +#: session_state.cc:1652 msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)" msgstr "" "Session: XML-Knoten zur Beschreibung einer Audioregion ist unvollständig " "(Quelle fehlt)" -#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707 +#: session_state.cc:1660 session_state.cc:1681 session_state.cc:1701 msgid "" "Session: XMLNode describing a AudioRegion references an unknown source id =%1" msgstr "" "Session: XML-Knoten zur Beschreibung einer Audioregion referenziert eine " "unbekannte Quell-ID =%1" -#: session_state.cc:1672 session_state.cc:1693 session_state.cc:1713 +#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707 msgid "" "Session: XMLNode describing a AudioRegion references a non-audio source id =" "%1" @@ -2084,7 +2103,7 @@ msgstr "" "Session: XML-Knoten zur Beschreibung einer Audioregion referenziert eine " "Nicht-Audio Quell-ID =%1" -#: session_state.cc:1736 +#: session_state.cc:1730 msgid "" "Session: XMLNode describing an AudioRegion is missing some master sources; " "ignored" @@ -2092,27 +2111,27 @@ msgstr "" "Session: dem XML-Knoten zur Beschreibung einer Audioregion fehlen einige " "Hauptquellen; ignoriert" -#: session_state.cc:1770 +#: session_state.cc:1764 msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)" msgstr "" "Session: XML-Knoten zur Beschreibung einer MIDI-Region ist unvollständig " "(Quelle fehlt)" -#: session_state.cc:1778 +#: session_state.cc:1772 msgid "" "Session: XMLNode describing a MidiRegion references an unknown source id =%1" msgstr "" "Session: XML-Knoten zur Beschreibung einer MIDI-Region referenziert eine " "unbekannte Quell-ID =%1" -#: session_state.cc:1784 +#: session_state.cc:1778 msgid "" "Session: XMLNode describing a MidiRegion references a non-midi source id =%1" msgstr "" "Session: XML-Knoten zur Beschreibung einer MIDI-Region referenziert eine " "Nicht-MIDI Quell-ID =%1" -#: session_state.cc:1852 +#: session_state.cc:1846 msgid "" "cannot create new file from region name \"%1\" with ident = \"%2\": too many " "existing files with similar names" @@ -2120,109 +2139,105 @@ msgstr "" "kann keine neue Datei aus dem Regionennamen \"%1\" mit ident = \"%2\" " "erzeugen: zu viele Dateien mit ähnlichen Namen existieren" -#: session_state.cc:1875 +#: session_state.cc:1869 msgid "Session: cannot create Source from XML description." msgstr "Session: Kann Quelle aus der XML-Beschreibung nicht erzeugen" -#: session_state.cc:1909 +#: session_state.cc:1903 msgid "A sound file is missing. It will be replaced by silence." msgstr "Eine Audiodatei fehlt. Sie wird durch Stille ersetzt werden." -#: session_state.cc:1932 +#: session_state.cc:1926 msgid "Found a sound file that cannot be used by %1. Talk to the progammers." msgstr "" "Eine nicht mit %1 benutzbare Audiodatei wurde gefunden. Sprechen Sie mit den " "Programmierern." -#: session_state.cc:1949 +#: session_state.cc:1943 msgid "Could not create templates directory \"%1\" (%2)" msgstr "Konnte Vorlagenverzeichnis \"%1\" nicht erzeugen (%2)" -#: session_state.cc:1962 +#: session_state.cc:1956 msgid "Template \"%1\" already exists - new version not created" msgstr "Vorlage \"%1\" existiert bereits - neue Version wurde nicht erzeugt" -#: session_state.cc:1968 +#: session_state.cc:1962 msgid "Could not create directory for Session template\"%1\" (%2)" msgstr "Konnte kein Verzeichnis für Projektvorlage \"%1\" erzeugen (%2)" -#: session_state.cc:1978 +#: session_state.cc:1972 msgid "template not saved" msgstr "Vorlage nicht gesichert" -#: session_state.cc:1988 +#: session_state.cc:1982 msgid "Could not create directory for Session template plugin state\"%1\" (%2)" msgstr "" "Konnte Verzeichnis für Projektvorlagen-Pluginstatus \"%1\" nicht erzeugen " "(%2)" -#: session_state.cc:2183 +#: session_state.cc:2225 msgid "Unknown node \"%1\" found in Bundles list from session file" msgstr "Unbekannter Knoten \"%1\" in Bündelliste der Projektdatei gefunden" -#: session_state.cc:2725 session_state.cc:2731 -msgid "Cannot expand path %1 (%2)" -msgstr "Kann Pfad %1 nicht expandieren (%2)" - -#: session_state.cc:2784 +#: session_state.cc:2820 msgid "Session: cannot create dead file folder \"%1\" (%2)" msgstr "Session: kann den Mülleimer \"%1\" nicht erzeugen (%2)" -#: session_state.cc:2823 +#: session_state.cc:2859 msgid "cannot rename unused file source from %1 to %2 (%3)" msgstr "kann unbenutzte Dateiquelle nicht von %1 nach %2 umbenennen (%3)" -#: session_state.cc:2841 +#: session_state.cc:2877 msgid "cannot remove peakfile %1 for %2 (%3)" msgstr "kann Peakdatei %1 für %2 nicht entfernen (%3)" -#: session_state.cc:3143 +#: session_state.cc:3179 msgid "could not backup old history file, current history not saved" msgstr "" "konnte kein Backup der alten Aktionsliste erstellen, momentane Aktionsliste " "ungesichert" -#: session_state.cc:3156 +#: session_state.cc:3192 msgid "history could not be saved to %1" msgstr "Aktionsliste konnte nicht nach %1 gesichert werden" -#: session_state.cc:3159 +#: session_state.cc:3195 msgid "Could not remove history file at path \"%1\" (%2)" msgstr "Konnte Aktionslistendatei im Pfad \"%1\" nicht entfernen (%2)" -#: session_state.cc:3163 +#: session_state.cc:3199 msgid "could not restore history file from backup %1 (%2)" msgstr "konnte Aktionslistendatei nicht aus dem Backup %1 restaurieren (%2)" -#: session_state.cc:3188 +#: session_state.cc:3224 msgid "%1: no history file \"%2\" for this session." msgstr "%1: keine Aktionslistendatei \"%2\" für dieses Projekt." -#: session_state.cc:3194 +#: session_state.cc:3230 msgid "Could not understand session history file \"%1\"" msgstr "Konnte Projekt-Aktionslistendatei \"%1\" nicht verstehen" -#: session_state.cc:3236 +#: session_state.cc:3272 msgid "Failed to downcast MidiSource for NoteDiffCommand" msgstr "MidiSource für NoteDiffCommand nicht auffindbar" -#: session_state.cc:3247 +#: session_state.cc:3283 msgid "Failed to downcast MidiSource for SysExDiffCommand" msgstr "MidiSource für SysExDiffCommand nicht auffindbar" -#: session_state.cc:3258 +#: session_state.cc:3294 msgid "Failed to downcast MidiSource for PatchChangeDiffCommand" msgstr "MidiSource für PatchChangeDiffCommand nicht auffindbar" -#: session_state.cc:3266 +#: session_state.cc:3302 msgid "Couldn't figure out how to make a Command out of a %1 XMLNode." msgstr "Konnte im XML-Knoten \"%1\" keinen Befehl erkennen." -#: session_state.cc:3502 +#: session_state.cc:3538 msgid "Session: unknown diskstream type in XML" msgstr "Session: Unbekannter Diskstream im XML" -#: session_state.cc:3507 +#: session_state.cc:3543 msgid "Session: could not load diskstream via XML state" msgstr "Session: konnte Diskstream nicht via XML-Status laden" @@ -2251,122 +2266,122 @@ msgstr "" "Globales Varispeed ist nicht möglich, solange %1 mit JACK Transport " "verbunden ist." -#: smf_source.cc:252 +#: smf_source.cc:262 msgid "Unable to read event prefix, corrupt MIDI ring" msgstr "Kann Ereignisprefix nicht lesen, korrupter MIDI-Ringbuffer" -#: smf_source.cc:265 +#: smf_source.cc:275 msgid "Event has time and size but no body, corrupt MIDI ring" msgstr "time/size gelesen, aber nicht buffer, korrupter MIDI-Ringbuffer" -#: smf_source.cc:271 +#: smf_source.cc:281 msgid "Event time is before MIDI source position" msgstr "Event-Zeitpunkt befindet sich vor MIDI Quellposition" -#: smf_source.cc:306 smf_source.cc:345 +#: smf_source.cc:316 smf_source.cc:355 msgid "Skipping event with unordered time %1" msgstr "Ãœberspringe Event mit Zeitpunkt %1 ausserhalb der Reihenfolge" -#: smf_source.cc:410 +#: smf_source.cc:420 msgid "cannot open MIDI file %1 for write" msgstr "kann MIDI-Datei %1 nicht zum Schreiben öffnen" -#: sndfile_helpers.cc:32 +#: sndfile_helpers.cc:34 msgid "WAV" msgstr "WAV" -#: sndfile_helpers.cc:33 +#: sndfile_helpers.cc:35 msgid "AIFF" msgstr "AIFF" -#: sndfile_helpers.cc:34 +#: sndfile_helpers.cc:36 msgid "CAF" msgstr "CAF" -#: sndfile_helpers.cc:35 +#: sndfile_helpers.cc:37 msgid "W64 (64 bit WAV)" msgstr "W64 (64 bit WAV)" -#: sndfile_helpers.cc:36 +#: sndfile_helpers.cc:38 msgid "FLAC" msgstr "FLAC" -#: sndfile_helpers.cc:37 +#: sndfile_helpers.cc:39 msgid "Ogg/Vorbis" msgstr "Ogg/Vorbis" -#: sndfile_helpers.cc:38 +#: sndfile_helpers.cc:40 msgid "raw (no header)" msgstr "raw (no header)" -#: sndfile_helpers.cc:43 +#: sndfile_helpers.cc:45 msgid ".wav" msgstr ".wav" -#: sndfile_helpers.cc:44 +#: sndfile_helpers.cc:46 msgid ".aiff" msgstr ".aiff" -#: sndfile_helpers.cc:45 +#: sndfile_helpers.cc:47 msgid ".caf" msgstr ".caf" -#: sndfile_helpers.cc:46 +#: sndfile_helpers.cc:48 msgid ".w64" msgstr ".w64" -#: sndfile_helpers.cc:47 +#: sndfile_helpers.cc:49 msgid ".flac" msgstr ".flac" -#: sndfile_helpers.cc:48 +#: sndfile_helpers.cc:50 msgid ".ogg" msgstr ".ogg" -#: sndfile_helpers.cc:49 +#: sndfile_helpers.cc:51 msgid ".raw" msgstr ".raw" -#: sndfile_helpers.cc:64 +#: sndfile_helpers.cc:66 msgid "Signed 16 bit PCM" msgstr "Signed 16 bit PCM" -#: sndfile_helpers.cc:65 +#: sndfile_helpers.cc:67 msgid "Signed 24 bit PCM" msgstr "Signed 24 bit PCM" -#: sndfile_helpers.cc:66 +#: sndfile_helpers.cc:68 msgid "Signed 32 bit PCM" msgstr "Signed 32 bit PCM" -#: sndfile_helpers.cc:67 +#: sndfile_helpers.cc:69 msgid "Signed 8 bit PCM" msgstr "Signed 8 bit PCM" -#: sndfile_helpers.cc:68 +#: sndfile_helpers.cc:70 msgid "32 bit float" msgstr "32 bit float" -#: sndfile_helpers.cc:81 +#: sndfile_helpers.cc:83 msgid "Little-endian (Intel)" msgstr "Little-endian (Intel)" -#: sndfile_helpers.cc:82 +#: sndfile_helpers.cc:84 msgid "Big-endian (PowerPC)" msgstr "Big-endian (PowerPC)" -#: sndfilesource.cc:201 +#: sndfilesource.cc:210 msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)" msgstr "SndFileSource: kann Datei \"%1\" nicht für %2 öffnen (%3)" -#: sndfilesource.cc:209 +#: sndfilesource.cc:218 msgid "" "SndFileSource: file only contains %1 channels; %2 is invalid as a channel " "number" msgstr "" "SndFileSource: Datei enthält nur %1 Kanäle, %2 ist eine ungültige Kanalzahl" -#: sndfilesource.cc:255 sndfilesource.cc:571 sndfilesource.cc:595 +#: sndfilesource.cc:264 sndfilesource.cc:604 sndfilesource.cc:628 msgid "" "cannot set broadcast info for audio file %1 (%2); dropping broadcast info " "for this file" @@ -2374,67 +2389,71 @@ msgstr "" "kann Broadcast-Informationen für die Audiodatei %1 nicht setzen (%2); " "verwerfe Broadcast-Informationen für diese Datei" -#: sndfilesource.cc:302 +#: sndfilesource.cc:311 msgid "could not allocate file %1 for reading." msgstr "konnte Datei %1 nicht zum Lesen allozieren" -#: sndfilesource.cc:337 +#: sndfilesource.cc:346 msgid "SndFileSource: could not seek to frame %1 within %2 (%3)" msgstr "SndFileSource: Konnte in %2 Frame %1 nicht aufsuchen (%3)" -#: sndfilesource.cc:347 +#: sndfilesource.cc:356 msgid "" "SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)" msgstr "" "SndFileSource: @ %1 konnte %2 innerhalb %3 nicht lesen (%4) (len = %5, ret " "war %6)" -#: sndfilesource.cc:391 sndfilesource.cc:420 +#: sndfilesource.cc:400 sndfilesource.cc:429 msgid "attempt to write a non-writable audio file source (%1)" msgstr "Versuch, in eine schreibgeschützte Audio-Dateiquelle zu schreiben (%1)" -#: sndfilesource.cc:396 utils.cc:510 utils.cc:534 utils.cc:548 utils.cc:567 +#: sndfilesource.cc:405 utils.cc:547 utils.cc:571 utils.cc:585 utils.cc:604 msgid "programming error: %1 %2" msgstr "Programmierfehler: %1 %2" -#: sndfilesource.cc:523 +#: sndfilesource.cc:532 sndfilesource.cc:562 msgid "attempt to flush a non-writable audio file source (%1)" msgstr "Versuch, eine schreibgeschützte Audio-Dateiquelle zu leeren (%1)" -#: sndfilesource.cc:528 +#: sndfilesource.cc:537 sndfilesource.cc:557 msgid "attempt to flush an un-opened audio file source (%1)" msgstr "Versuch, eine nicht geöffnete Audio-Dateiquelle zu leeren (%1)" -#: sndfilesource.cc:534 +#: sndfilesource.cc:543 msgid "could not allocate file %1 to write header" msgstr "konnte Datei %1 nicht allozieren, um den Dateikopf zu schreiben" -#: sndfilesource.cc:548 +#: sndfilesource.cc:568 +msgid "could not allocate file %1 to flush contents" +msgstr "konnte Datei %1 nicht allozieren, um Inhalte zu löschen" + +#: sndfilesource.cc:581 msgid "" "attempt to store broadcast info in a non-writable audio file source (%1)" msgstr "" "Versuch, Broadcast-Informationen in eine schreibgeschützte Audio-Dateiquelle " "zu schreiben (%1)" -#: sndfilesource.cc:553 +#: sndfilesource.cc:586 msgid "attempt to set BWF info for an un-opened audio file source (%1)" msgstr "" "Versuch, BWF-Informationen in einer nicht geöffnete Audio-Dateiquelle zu " "setzen (%1)" -#: sndfilesource.cc:614 +#: sndfilesource.cc:647 msgid "%1: cannot seek to %2 (libsndfile error: %3)" msgstr "%1: kann %2 nicht aufsuchen (libsndfile Fehler: %3)" -#: sndfilesource.cc:727 +#: sndfilesource.cc:760 msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)" msgstr "SndFileSource: \"%1\" schlechter Lese-Rückgabewert: %2 von %5 (%3: %4)" -#: sndfilesource.cc:740 sndfilesource.cc:790 sndfilesource.cc:797 +#: sndfilesource.cc:773 sndfilesource.cc:823 sndfilesource.cc:830 msgid "SndFileSource: \"%1\" bad write (%2)" msgstr "SndFileSource: \"%1\" schlechter Schreibvorgang (%2)" -#: sndfilesource.cc:820 +#: sndfilesource.cc:853 msgid "" "Filesource: start time is already set for existing file (%1): Cannot change " "start time." @@ -2442,18 +2461,22 @@ msgstr "" "Filesource: Startzeit für existierende Datei (%1) ist bereits gesetzt: Kann " "Startzeit nicht ändern." -#: speakers.cc:239 +#: speakers.cc:280 msgid "Speaker information is missing azimuth - speaker ignored" msgstr "Lautsprecher-Information ohne Azimut - Lautsprecher ignoriert" -#: speakers.cc:245 +#: speakers.cc:286 msgid "Speaker information is missing elevation - speaker ignored" msgstr "Lautsprecher-Information ohne Elevation - Lautsprecher ignoriert" -#: speakers.cc:251 +#: speakers.cc:292 msgid "Speaker information is missing distance - speaker ignored" msgstr "Lautsprecher-Information ohne Distanz - Lautsprecher ignoriert" +#: srcfilesource.cc:135 +msgid "SrcFileSource: %1" +msgstr "video_server_dialog.cc:140" + #: tape_file_matcher.cc:46 msgid "Cannot compile tape track regexp for use (%1)" msgstr "Kann regulären Ausdruck der Bandspur nicht zum Gebrauch auswerten (%1)" @@ -2615,54 +2638,93 @@ msgstr "Knoten für Kanal hat keine Eigenschaft \"type\"" msgid "Node for Port has no \"name\" property" msgstr "Knoten für Port hat keine Eigenschaft \"name\"" -#: utils.cc:358 utils.cc:382 +#: utils.cc:395 utils.cc:419 msgid "Splice" msgstr "Schneiden" -#: utils.cc:360 utils.cc:375 +#: utils.cc:397 utils.cc:412 msgid "Slide" msgstr "Gleiten" -#: utils.cc:362 utils.cc:378 +#: utils.cc:399 utils.cc:415 msgid "Lock" msgstr "Sperren" -#: utils.cc:365 +#: utils.cc:402 msgid "programming error: unknown edit mode string \"%1\"" msgstr "Programmierfehler: unbekannte Zeichenkette für Editiermodus \"%1\"" -#: utils.cc:389 utils.cc:421 +#: utils.cc:426 utils.cc:458 msgid "MIDI Timecode" msgstr "MIDI Timecode" -#: utils.cc:389 utils.cc:419 +#: utils.cc:426 utils.cc:456 msgid "MTC" msgstr "MTC" -#: utils.cc:393 utils.cc:428 +#: utils.cc:430 utils.cc:465 msgid "MIDI Clock" msgstr "MIDI Clock" -#: utils.cc:397 utils.cc:415 utils.cc:435 +#: utils.cc:434 utils.cc:452 utils.cc:472 msgid "JACK" msgstr "JACK" -#: utils.cc:401 +#: utils.cc:438 msgid "programming error: unknown sync source string \"%1\"" msgstr "Programmierfehler: unbekannte Zeichenkette für Sync-Quelle \"%1\"" -#: utils.cc:426 +#: utils.cc:463 msgid "M-Clock" msgstr "M-Clock" -#: utils.cc:432 +#: utils.cc:469 msgid "LTC" msgstr "LTC" -#: utils.cc:602 +#: utils.cc:639 msgid "programming error: unknown native header format: %1" msgstr "Programmierfehler: unbekanntes natives Dateikopfformat: %1" -#: utils.cc:617 +#: utils.cc:654 msgid "cannot open directory %1 (%2)" msgstr "kann Verzeichnis %1 nicht öffnen (%2)" + +#~ msgid "Filesource: cannot find required file (%1): while searching" +#~ msgstr "" +#~ "Filesource: kann benötigte Datei (%1) während dieser Suche nicht finden" + +#~ msgid "Auditioning of non-audio regions not yet supported" +#~ msgstr "Abhören von Nicht-Audio Regionen wird noch nicht unterstützt" + +#~ msgid "Filesource: cannot find required file (%1): while searching %2" +#~ msgstr "" +#~ "Dateiquelle: kann benötigte Datei (%1) auf der Suche nach %2 nicht finden" + +#~ msgid "" +#~ "FileSource: \"%1\" is ambigous when searching %2\n" +#~ "\t" +#~ msgstr "" +#~ "Dateiquelle: \"%1\" ist bei der Suche nach %2 mehrdeutig \n" +#~ "\t" + +#~ msgid "Could not resolve path: %1 (%2)" +#~ msgstr "Konnte den Pfad: %1 nicht auflösen (%2)" + +#~ msgid "LADSPA: cannot load module from \"%1\"" +#~ msgstr "LADSPA: kann Modul nicht aus \"%1\" laden" + +#~ msgid "looking for panners in %1" +#~ msgstr "Suche nach Pannern in %1" + +#~ msgid "Panner discovered: \"%1\" in %2" +#~ msgstr "Panner gefunden: \"%1\" in %2" + +#~ msgid "Could not use path %1 (%2)" +#~ msgstr "Konnte Pfad %1 nicht benutzen (%2)" + +#~ msgid "could not rename temporary session file %1 to %2" +#~ msgstr "Konnte temporäre Projektdatei %1 nicht nach %2 umbenennen" + +#~ msgid "Cannot expand path %1 (%2)" +#~ msgstr "Kann Pfad %1 nicht expandieren (%2)" diff --git a/libs/ardour/po/el.po b/libs/ardour/po/el.po index b7b350bdd9..d1fe4d67e0 100644 --- a/libs/ardour/po/el.po +++ b/libs/ardour/po/el.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: libardour 0.664.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-11-05 11:11-0500\n" +"POT-Creation-Date: 2014-02-10 17:53+0100\n" "PO-Revision-Date: 2007-04-16 00:38+0200\n" "Last-Translator: Klearchos Gourgourinis <muadib@in.gr>\n" "Language-Team: Hellenic(Greek)\n" @@ -20,74 +20,74 @@ msgstr "" msgid "Fader" msgstr "" -#: audio_diskstream.cc:244 +#: audio_diskstream.cc:242 msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist" msgstr "AudioDiskStream: Η Λίστα \"%1\" δεν είναι ηχητική λίστα αναπαÏ/γής" -#: audio_diskstream.cc:296 +#: audio_diskstream.cc:294 msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!" msgstr "" "AudioDiskstream %1: δεν υπάÏχει λίστα αναπαÏ/γής για να γίνει αντιγÏαφή!" -#: audio_diskstream.cc:848 audio_diskstream.cc:858 +#: audio_diskstream.cc:846 audio_diskstream.cc:856 msgid "" "AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3" msgstr "" "AudioDiskstream %1: κατα την αναγόμωση, δεν μπόÏεσα να διαβάσω %2 από τη " "λίστα αναπαÏ/γής στο frame %3" -#: audio_diskstream.cc:1014 +#: audio_diskstream.cc:1012 msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3" msgstr "" "AudioDiskstream %1: δεν μπόÏεσα να διαβάσω %2 από τη λίστα αναπαÏ/γής στο " "frame %3" -#: audio_diskstream.cc:1383 audio_diskstream.cc:1400 +#: audio_diskstream.cc:1381 audio_diskstream.cc:1398 msgid "AudioDiskstream %1: cannot write to disk" msgstr "AudioDiskstream %1: δεν μποÏÏŽ να γÏάψω στο δίσκο" -#: audio_diskstream.cc:1443 +#: audio_diskstream.cc:1441 msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!" msgstr "" "AudioDiskstream \"%1\": αδÏνατη η εκκαθάÏιση δειγματοληπτικών δεδομÎνων στο " "δίσκο!" -#: audio_diskstream.cc:1537 +#: audio_diskstream.cc:1535 msgid "%1: could not create region for complete audio file" msgstr "%1: δεν μπόÏεσα να δημιουÏγήσω πεÏιοχή για ολόκληÏο audio file" -#: audio_diskstream.cc:1571 +#: audio_diskstream.cc:1569 msgid "AudioDiskstream: could not create region for captured audio!" msgstr "" "AudioDiskstream: δεν μπόÏεσα να δημιουÏγήσω πεÏιοχή για δειγματοληψίες!" -#: audio_diskstream.cc:1679 +#: audio_diskstream.cc:1677 msgid "programmer error: %1" msgstr "σφάλμα Ï€ÏογÏαμματιστή: %1" -#: audio_diskstream.cc:1905 +#: audio_diskstream.cc:1903 msgid "AudioDiskstream: channel %1 out of range" msgstr "AudioDiskstream: κανάλι %1 εκτός διαστήματος" -#: audio_diskstream.cc:1919 midi_diskstream.cc:1210 +#: audio_diskstream.cc:1917 midi_diskstream.cc:1209 msgid "%1:%2 new capture file not initialized correctly" msgstr "%1:%2 νÎα δειγματοληψία δεν εκκινήθη σωστά" -#: audio_diskstream.cc:2200 +#: audio_diskstream.cc:2198 msgid "%1: cannot restore pending capture source file %2" msgstr "%1: δεν μποÏÏŽ να ανοίξω το αÏχείο %2 από την απαιτοÏμενη πηγή" -#: audio_diskstream.cc:2222 +#: audio_diskstream.cc:2220 msgid "%1: incorrect number of pending sources listed - ignoring them all" msgstr "%1: ετυπώθη λανθασμÎνος αÏιθμός απαιτοÏμενων πηγών - αγνοήθηκαν όλες" -#: audio_diskstream.cc:2246 +#: audio_diskstream.cc:2244 msgid "%1: cannot create whole-file region from pending capture sources" msgstr "" "%1: αδÏνατη η δημιουÏγία ακÎÏαιας πεÏιοχής από τις απαιτοÏμενες πηγÎÏ‚ " "ηχοληψίας" -#: audio_library.cc:71 +#: audio_library.cc:81 msgid "Could not open %1. Audio Library not saved" msgstr "Δεν μπόÏεσα να ανοίξω το %1. Η Audio Library δεν αποθηκεÏθηκε" @@ -127,11 +127,11 @@ msgstr "" msgid "Audio Playlists (unused)" msgstr "" -#: audio_playlist_source.cc:171 audiosource.cc:913 file_source.cc:529 +#: audio_playlist_source.cc:171 audiosource.cc:891 file_source.cc:520 #: midi_playlist_source.cc:144 midi_playlist_source.cc:152 -#: midi_playlist_source.cc:159 midi_source.cc:371 plugin_insert.cc:643 -#: rb_effect.cc:333 session.cc:2619 session.cc:2652 session.cc:3797 -#: session_handle.cc:87 sndfilesource.cc:121 +#: midi_playlist_source.cc:159 midi_source.cc:370 plugin_insert.cc:634 +#: rb_effect.cc:333 session.cc:2636 session.cc:2669 session.cc:3814 +#: session_handle.cc:87 sndfilesource.cc:122 msgid "programming error: %1" msgstr "σφάλμα Ï€ÏογÏαμματισμοÏ: %1" @@ -155,23 +155,23 @@ msgid "" "Channels: " msgstr "" -#: audio_track.cc:167 +#: audio_track.cc:161 msgid "Unknown bundle \"%1\" listed for input of %2" msgstr "" -#: audio_track.cc:169 +#: audio_track.cc:163 msgid "in 1" msgstr "" -#: audio_track.cc:170 +#: audio_track.cc:164 msgid "No input bundles available as a replacement" msgstr "" -#: audio_track.cc:174 +#: audio_track.cc:168 msgid "Bundle %1 was not available - \"in 1\" used instead" msgstr "" -#: audio_track.cc:183 +#: audio_track.cc:177 msgid "improper input channel list in XML node (%1)" msgstr "ακατάλληλη λίστα καναλιών εισόδου στον κόμβο XML (%1)" @@ -195,23 +195,23 @@ msgstr "" msgid "VAMP Plugin \"%1\" could not be loaded" msgstr "" -#: audioengine.cc:488 +#: audioengine.cc:495 msgid "looking for backends in %1\n" msgstr "" -#: audioengine.cc:511 +#: audioengine.cc:518 msgid "AudioEngine: cannot load module \"%1\" (%2)" msgstr "" -#: audioengine.cc:517 +#: audioengine.cc:524 msgid "AudioEngine: backend at \"%1\" has no descriptor function." msgstr "" -#: audioengine.cc:589 +#: audioengine.cc:596 msgid "Could not create backend for %1: %2" msgstr "" -#: audioregion.cc:1643 +#: audioregion.cc:1651 msgid "" "You have requested an operation that requires audio analysis.\n" "\n" @@ -226,11 +226,11 @@ msgid "" "this and future transient-detection operations.\n" msgstr "" -#: audiosource.cc:199 +#: audiosource.cc:210 msgid "cannot rename peakfile for %1 from %2 to %3 (%4)" msgstr "αδÏνατη η μετονομασία του peakfile για %1 από %2 σε %3 (%4)" -#: audiosource.cc:226 +#: audiosource.cc:239 msgid "AudioSource: cannot stat peakfile \"%1\"" msgstr "" @@ -239,49 +239,70 @@ msgid "cannot read sample data for unscaled peak computation" msgstr "" "δεν μποÏÏŽ να διαβάσω δεδομÎνα δείγματος για υπολογισμό μη-κλιμακώτου peak" -#: audiosource.cc:387 +#: audiosource.cc:386 msgid "AudioSource: cannot open peakpath (a) \"%1\" (%2)" msgstr "" -#: audiosource.cc:463 +#: audiosource.cc:395 audiosource.cc:473 +msgid "" +"AudioSource: could not seek to correct location in peak file \"%1\" (%2)" +msgstr "" + +#: audiosource.cc:453 msgid "AudioSource: cannot open peakpath (b) \"%1\" (%2)" msgstr "" -#: audiosource.cc:587 +#: audiosource.cc:567 msgid "" "AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)" msgstr "" -#: audiosource.cc:667 +#: audiosource.cc:634 msgid "%1: could not write read raw data for peak computation (%2)" msgstr "" "%1: δεν μποÏεσα να γÏάψω ανεγνωσμÎνα raw δεδομÎνα για τον υπολογισμό του " "peak (%2)" -#: audiosource.cc:706 +#: audiosource.cc:672 msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)" msgstr "" -#: audiosource.cc:773 audiosource.cc:886 +#: audiosource.cc:739 audiosource.cc:861 +msgid "%1: could not seek in peak file data (%2)" +msgstr "" + +#: audiosource.cc:744 audiosource.cc:870 msgid "%1: could not write peak file data (%2)" msgstr "%1: δεν μπόÏεσα να γÏάψω δεδομÎνα του αÏχείου peak (%2)" -#: audiosource.cc:924 +#: audiosource.cc:903 msgid "could not truncate peakfile %1 to %2 (error: %3)" msgstr "" -#: auditioner.cc:87 -msgid "no outputs available for auditioner - manual connection required" +#: auditioner.cc:95 +msgid "Falling back to Reasonable Synth for Midi Audition" +msgstr "" + +#: auditioner.cc:97 +msgid "No synth for midi-audition found." msgstr "" -#: auditioner.cc:135 -msgid "Auditioning of non-audio regions not yet supported" +#: auditioner.cc:152 +msgid "no outputs available for auditioner - manual connection required" msgstr "" -#: auditioner.cc:160 +#: auditioner.cc:392 auditioner.cc:438 msgid "Cannot setup auditioner processing flow for %1 channels" msgstr "" +#: auditioner.cc:426 +msgid "Failed to load synth for MIDI-Audition." +msgstr "" + +#: auditioner.cc:445 +msgid "Auditioning of regions other than Audio or Midi is not supported." +msgstr "" + #: automatable.cc:81 msgid "Automation node has no path property" msgstr "" @@ -317,23 +338,23 @@ msgid "" "AutomationList: passed XML node called %1, not \"AutomationList\" - ignored" msgstr "" -#: butler.cc:91 +#: butler.cc:80 msgid "Cannot create transport request signal pipe (%1)" msgstr "Δεν μποÏÏŽ να δημιουÏγήσω transport request signal pipe (%1)" -#: butler.cc:97 butler.cc:103 +#: butler.cc:86 butler.cc:92 msgid "UI: cannot set O_NONBLOCK on butler request pipe (%1)" msgstr "UI: δεν μποÏÏŽ να θÎσω O_NONBLOCK στο butler request pipe (%1)" -#: butler.cc:109 +#: butler.cc:124 msgid "Session: could not create butler thread" msgstr "ΣυνεδÏία: δεν μπόÏεσα να δημιουÏγήσω δÎσμη με τον butler" -#: butler.cc:156 +#: butler.cc:165 msgid "poll on butler request pipe failed (%1)" msgstr "" -#: butler.cc:163 +#: butler.cc:172 msgid "Error on butler thread request pipe: fd=%1 err=%2" msgstr "" @@ -341,55 +362,55 @@ msgstr "" msgid "Error reading from butler request pipe" msgstr "Σφάλμα στην ανάγνωση από butler request pipe" -#: butler.cc:248 +#: butler.cc:301 msgid "Butler read ahead failure on dstream %1" msgstr "Αποτυχία Ï€Ïοανάγνωσης Butler στο dstream %1" -#: butler.cc:285 +#: butler.cc:338 msgid "Butler write-behind failure on dstream %1" msgstr "Αποτυχία οπισθεγγÏαφής Butler στο dstream %1" -#: control_protocol_manager.cc:134 +#: control_protocol_manager.cc:164 msgid "control protocol name \"%1\" has no descriptor" msgstr "Το όνομα Ï€Ïωτοκόλλου ελÎγχου \"%1\" δεν Îχει descriptor" -#: control_protocol_manager.cc:141 +#: control_protocol_manager.cc:171 msgid "control protocol name \"%1\" could not be initialized" msgstr "Το όνομα Ï€Ïωτοκόλλου ελÎγχου \"%1\" ήταν αδÏνατο να αÏχίσει" -#: control_protocol_manager.cc:201 +#: control_protocol_manager.cc:237 msgid "Instantiating mandatory control protocol %1" msgstr "" -#: control_protocol_manager.cc:222 +#: control_protocol_manager.cc:258 msgid "looking for control protocols in %1\n" msgstr "" -#: control_protocol_manager.cc:247 +#: control_protocol_manager.cc:283 msgid "Control protocol %1 not usable" msgstr "Î Ïωτόκολλο ελÎγχου %1 μη χÏησιμοποιήσιμο" -#: control_protocol_manager.cc:264 +#: control_protocol_manager.cc:300 msgid "Control surface protocol discovered: \"%1\"\n" msgstr "" -#: control_protocol_manager.cc:282 +#: control_protocol_manager.cc:318 msgid "ControlProtocolManager: cannot load module \"%1\" (%2)" msgstr "ControlProtocolManager: δεν μποÏÏŽ να φοÏτώσω το module \"%1\" (%2)" -#: control_protocol_manager.cc:290 +#: control_protocol_manager.cc:324 msgid "ControlProtocolManager: module \"%1\" has no descriptor function." msgstr "ControlProtocolManager: το module \"%1\" δεν Îχει descriptor function." -#: cycle_timer.cc:38 +#: cycle_timer.cc:40 msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo" msgstr "CycleTimer::get_mhz(): δεν ανοίγει το /proc/cpuinfo" -#: cycle_timer.cc:50 +#: cycle_timer.cc:52 msgid "CycleTimer::get_mhz(): cannot locate cpu MHz in /proc/cpuinfo" msgstr "CycleTimer::get_mhz(): δεν ευÏÎθη το cpu MHz στο /proc/cpuinfo" -#: cycle_timer.cc:73 +#: cycle_timer.cc:75 msgid "cannot locate cpu MHz in /proc/cpuinfo" msgstr "δεν ευÏÎθη το cpu MHz στο /proc/cpuinfo" @@ -397,7 +418,7 @@ msgstr "δεν ευÏÎθη το cpu MHz στο /proc/cpuinfo" msgid "audio" msgstr "" -#: data_type.cc:28 session.cc:1791 session.cc:1794 +#: data_type.cc:28 session.cc:1808 session.cc:1811 msgid "MIDI" msgstr "" @@ -405,15 +426,15 @@ msgstr "" msgid "unknown" msgstr "" -#: delivery.cc:114 +#: delivery.cc:118 msgid "main outs" msgstr "" -#: delivery.cc:117 send.cc:61 +#: delivery.cc:121 send.cc:62 msgid "listen" msgstr "" -#: diskstream.cc:303 +#: diskstream.cc:302 msgid "Location \"%1\" not valid for track loop (start >= end)" msgstr "Η Τοποθεσία \"%1\" δεν είναι ικανή για track loop (αÏχή >= Ï„Îλος)" @@ -425,23 +446,23 @@ msgstr "" msgid "Export failed: %1" msgstr "" -#: export_filename.cc:118 +#: export_filename.cc:119 msgid "Existing export folder for this session (%1) does not exist - ignored" msgstr "" -#: export_filename.cc:229 +#: export_filename.cc:230 msgid "No Time" msgstr "" -#: export_filename.cc:238 +#: export_filename.cc:239 msgid "Invalid time format" msgstr "" -#: export_filename.cc:247 +#: export_filename.cc:248 msgid "No Date" msgstr "" -#: export_filename.cc:262 +#: export_filename.cc:263 msgid "Invalid date format" msgstr "" @@ -509,7 +530,7 @@ msgstr "" msgid "Rectangular" msgstr "" -#: export_formats.cc:52 session.cc:5014 session.cc:5030 +#: export_formats.cc:52 session.cc:5006 session.cc:5022 msgid "None" msgstr "" @@ -549,15 +570,15 @@ msgstr "" msgid "No sample format" msgstr "" -#: export_handler.cc:335 +#: export_handler.cc:343 msgid "Editor: cannot open \"%1\" as export file for CD marker file" msgstr "" -#: export_handler.cc:417 export_handler.cc:420 +#: export_handler.cc:425 export_handler.cc:428 msgid "an error occured while writing a TOC/CUE file: %1" msgstr "" -#: export_handler.cc:642 export_handler.cc:700 +#: export_handler.cc:650 export_handler.cc:708 msgid "Cannot convert %1 to Latin-1 text" msgstr "" @@ -619,7 +640,7 @@ msgid "" "configuration" msgstr "" -#: file_source.cc:198 session_state.cc:2807 +#: file_source.cc:198 session_state.cc:2843 msgid "" "there are already 1000 files with names like %1; versioning discontinued" msgstr "ΥπάÏχουν ήδη 1000 αÏχεία με ονόματα όπως %1; μη-συνεχÎÏ‚ versioning" @@ -628,38 +649,35 @@ msgstr "ΥπάÏχουν ήδη 1000 αÏχεία με ονόματα όπως % msgid "cannot rename file source from %1 to %2 (%3)" msgstr "" -#: file_source.cc:250 file_source.cc:378 +#: file_source.cc:248 file_source.cc:372 msgid "FileSource: search path not set" msgstr "FileSource: μονοπάτι αναζητήσεως δεν ετÎθη" -#: file_source.cc:313 file_source.cc:448 -msgid "Filesource: cannot find required file (%1): while searching %2" +#: file_source.cc:309 file_source.cc:439 +msgid "Filesource: cannot find required file (%1)" msgstr "" -"Filesource: δεν ευÏÎθη το απαιτοÏμενο αÏχείο (%1): κατά την αναζήτηση του %2" -#: file_source.cc:440 +#: file_source.cc:432 msgid "" -"FileSource: \"%1\" is ambigous when searching %2\n" +"FileSource: \"%1\" is ambigous when searching\n" "\t" msgstr "" -"FileSource: \"%1\" είναι αμφίβολο κατά την αναζήτηση του %2\n" -"\t" -#: file_source.cc:494 +#: file_source.cc:484 msgid "Filesource: cannot find required file (%1): %2" msgstr "Filesource: δεν ευÏÎθη το απαιτοÏμενο αÏχείο (%1): %2" -#: file_source.cc:501 +#: file_source.cc:492 msgid "Filesource: cannot check for existing file (%1): %2" msgstr "Filesource: δεν μποÏÏŽ να ελÎγξω για το υπάÏχον αÏχείο (%1): %2" -#: file_source.cc:535 +#: file_source.cc:526 msgid "" "Programming error! %1 tried to rename a file over another file! It's safe to " "continue working, but please report this to the developers." msgstr "" -#: file_source.cc:540 +#: file_source.cc:531 msgid "cannot rename file %1 to %2 (%3)" msgstr "" @@ -673,15 +691,15 @@ msgid "" "cannot run" msgstr "" -#: filesystem_paths.cc:91 +#: filesystem_paths.cc:96 msgid "ARDOUR_DLL_PATH not set in environment - exiting\n" msgstr "" -#: filesystem_paths.cc:107 +#: filesystem_paths.cc:125 msgid "ARDOUR_CONFIG_PATH not set in environment - exiting\n" msgstr "" -#: filesystem_paths.cc:127 +#: filesystem_paths.cc:148 msgid "ARDOUR_DATA_PATH not set in environment - exiting\n" msgstr "" @@ -693,87 +711,83 @@ msgstr "" msgid "filter: error creating new file %1 (%2)" msgstr "" -#: find_session.cc:51 -msgid "Could not resolve path: %1 (%2)" -msgstr "ΑδÏνατη η εÏÏεση path: %1 (%2)" - -#: find_session.cc:63 +#: find_session.cc:59 msgid "cannot check session path %1 (%2)" msgstr "δεν μποÏÏŽ να ελÎγξω το μονοπάτι συνεδÏίας %1 (%2)" -#: find_session.cc:89 +#: find_session.cc:85 msgid "cannot check statefile %1 (%2)" msgstr "δεν μποÏÏŽ να ελÎγξω το αÏχείο κατάστασεως %1 (%2)" -#: find_session.cc:125 +#: find_session.cc:121 msgid "%1 is not a snapshot file" msgstr "" -#: find_session.cc:142 +#: find_session.cc:138 msgid "cannot determine current working directory (%1)" msgstr "δεν μποÏÏŽ να καθοÏίσω τον Ï„ÏÎχοντα ενεÏγό φάκελο(directory) (%1)" -#: find_session.cc:159 +#: find_session.cc:155 msgid "unknown file type for session %1" msgstr "άγνωστος Ï„Ïπος αÏχείου για την συνεδÏία %1" -#: globals.cc:207 +#: globals.cc:216 msgid "Could not set system open files limit to \"unlimited\"" msgstr "" -#: globals.cc:209 +#: globals.cc:218 msgid "Could not set system open files limit to %1" msgstr "" -#: globals.cc:213 +#: globals.cc:222 msgid "Your system is configured to limit %1 to only %2 open files" msgstr "" -#: globals.cc:217 +#: globals.cc:226 msgid "Could not get system open files limit (%1)" msgstr "" -#: globals.cc:268 +#: globals.cc:280 msgid "Loading configuration" msgstr "" -#: import.cc:207 +#: import.cc:208 msgid "Could not find a source for %1 even though we are updating this file!" msgstr "" -#: import.cc:236 +#: import.cc:237 msgid "Unable to create file %1 during import" msgstr "" -#: import.cc:262 +#: import.cc:263 msgid "Resampling %1 from %2kHz to %3kHz" msgstr "" -#: import.cc:268 +#: import.cc:269 msgid "Copying %1" msgstr "" -#: import.cc:446 +#: import.cc:455 msgid "Track %1 of %2 contained no usable MIDI data" msgstr "" -#: import.cc:453 +#: import.cc:462 msgid "MIDI file %1 was not readable (no reason available)" msgstr "" -#: import.cc:499 +#: import.cc:508 msgid "Import: cannot open input sound file \"%1\"" msgstr "Εισαγωγή: δεν μποÏÏŽ να ανοίξω το εισαγμÎνο αÏχείο ήχου \"%1\"" -#: import.cc:510 +#: import.cc:519 msgid "Import: error opening MIDI file" msgstr "" -#: import.cc:549 +#: import.cc:558 msgid "Loading MIDI file %1" msgstr "" -#: import.cc:614 +#: import.cc:623 msgid "Failed to remove some files after failed/cancelled import operation" msgstr "" @@ -785,155 +799,155 @@ msgstr "" msgid "preset %1 (bank %2)" msgstr "" -#: internal_send.cc:278 internal_send.cc:279 +#: internal_send.cc:300 internal_send.cc:301 msgid "%1 - cannot find any track/bus with the ID %2 to connect to" msgstr "" -#: io.cc:208 +#: io.cc:209 msgid "IO: cannot disconnect port %1 from %2" msgstr "" -#: io.cc:343 io.cc:428 +#: io.cc:344 io.cc:431 msgid "IO: cannot register input port %1" msgstr "IO: δεν μποÏεί να καταχώÏηθεί η θÏÏα εισόδου %1" -#: io.cc:348 io.cc:433 +#: io.cc:349 io.cc:436 msgid "IO: cannot register output port %1" msgstr "IO: δεν μποÏει να καταχώÏηθεί η θÏÏα εξόδου %1" -#: io.cc:591 io.cc:647 +#: io.cc:598 io.cc:654 msgid "incorrect XML node \"%1\" passed to IO object" msgstr "μη-σωστός κόμβος XML \"%1\" Ï€ÎÏασε στο IO αντικείμενο" -#: io.cc:706 +#: io.cc:713 msgid "in" msgstr "" -#: io.cc:706 +#: io.cc:713 msgid "out" msgstr "" -#: io.cc:707 +#: io.cc:714 msgid "input" msgstr "" -#: io.cc:707 +#: io.cc:714 msgid "output" msgstr "" -#: io.cc:717 +#: io.cc:724 msgid "Unknown bundle \"%1\" listed for %2 of %3" msgstr "" -#: io.cc:783 +#: io.cc:790 msgid "Bundle %1 was not available - \"%2\" used instead" msgstr "" -#: io.cc:786 +#: io.cc:793 msgid "No %1 bundles available as a replacement" msgstr "" -#: io.cc:889 +#: io.cc:896 msgid "%1: cannot create I/O ports" msgstr "%1: θÏÏες I/O δεν μποÏοÏν να δημιουÏγηθοÏν" -#: io.cc:1017 io.cc:1121 +#: io.cc:1024 io.cc:1128 msgid "IO: badly formed string in XML node for inputs \"%1\"" msgstr "IO: κακοφτιαγμÎνη γÏαμμή στον XML κόμβο για εισόδους \"%1\"" -#: io.cc:1022 io.cc:1126 +#: io.cc:1029 io.cc:1133 msgid "bad input string in XML node \"%1\"" msgstr "κακή γÏαμμή εισόδου στον XML κόμβο \"%1\"" -#: io.cc:1060 +#: io.cc:1067 msgid "IO: badly formed string in XML node for outputs \"%1\"" msgstr "IO: δÏσμοÏφη γÏαμμή στον κόμβο XML για τις εξόδους \"%1\"" -#: io.cc:1065 +#: io.cc:1072 msgid "IO: bad output string in XML node \"%1\"" msgstr "IO: κακή γÏαμμή εξόδουστον κόμβο XML \"%1\"" -#: io.cc:1411 +#: io.cc:1417 #, c-format msgid "%s %u" msgstr "" -#: io.cc:1458 +#: io.cc:1464 #, c-format msgid "%s in" msgstr "" -#: io.cc:1460 +#: io.cc:1466 #, c-format msgid "%s out" msgstr "" -#: io.cc:1535 session.cc:686 session.cc:715 +#: io.cc:1541 session.cc:689 session.cc:718 msgid "mono" msgstr "" -#: io.cc:1537 session.cc:699 session.cc:729 +#: io.cc:1543 session.cc:702 session.cc:732 msgid "L" msgstr "" -#: io.cc:1537 session.cc:701 session.cc:731 +#: io.cc:1543 session.cc:704 session.cc:734 msgid "R" msgstr "" -#: io.cc:1539 io.cc:1545 +#: io.cc:1545 io.cc:1551 #, c-format msgid "%d" msgstr "" -#: ladspa_plugin.cc:86 +#: ladspa_plugin.cc:93 +msgid "LADSPA: Unable to open module: " +msgstr "" + +#: ladspa_plugin.cc:99 msgid "LADSPA: module has no descriptor function." msgstr "LADSPA: το module δεν Îχει ενδεικτική λειτουÏγία." -#: ladspa_plugin.cc:91 +#: ladspa_plugin.cc:106 msgid "LADSPA: plugin has gone away since discovery!" msgstr "LADSPA: το plugin την 'κοπάνισε' μετά την ανακάλυψη του!" -#: ladspa_plugin.cc:98 +#: ladspa_plugin.cc:113 msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing" msgstr "" "LADSPA: \"%1\" δεν μποÏεί να χÏησιμοποιηθεί, εφ'όσον δεν μποÏεί να κάνει επι " "τόπου επεξεÏγασία" -#: ladspa_plugin.cc:297 +#: ladspa_plugin.cc:311 msgid "" "illegal parameter number used with plugin \"%1\". This may indicate a change " "in the plugin design, and presets may be invalid" msgstr "" -#: ladspa_plugin.cc:376 ladspa_plugin.cc:426 +#: ladspa_plugin.cc:390 ladspa_plugin.cc:440 msgid "Bad node sent to LadspaPlugin::set_state" msgstr "Κακός κόμβος εστάλη στο LadspaPlugin::set_state" -#: ladspa_plugin.cc:391 ladspa_plugin.cc:440 +#: ladspa_plugin.cc:405 ladspa_plugin.cc:454 msgid "LADSPA: no ladspa port number" msgstr "LADSPA: κανείς αÏιθμός θÏÏας ladspa" -#: ladspa_plugin.cc:397 ladspa_plugin.cc:446 +#: ladspa_plugin.cc:411 ladspa_plugin.cc:460 msgid "LADSPA: no ladspa port data" msgstr "LADSPA: κανÎνα δεδομÎνο θÏÏας ladspa" -#: ladspa_plugin.cc:717 -msgid "LADSPA: cannot load module from \"%1\"" -msgstr "LADSPA: δεν μποÏÏŽ να φοÏτώσω module από \"%1\"" - -#: ladspa_plugin.cc:827 +#: ladspa_plugin.cc:840 msgid "Could not locate HOME. Preset not removed." msgstr "" -#: ladspa_plugin.cc:864 ladspa_plugin.cc:870 +#: ladspa_plugin.cc:879 ladspa_plugin.cc:885 msgid "Could not create %1. Preset not saved. (%2)" msgstr "Δεν μπόÏεσα να δημιουÏγήσω το %1. Î Ïο-ÏÏθμιση δεν αποθηκεÏθηκε. (%2)" -#: ladspa_plugin.cc:877 +#: ladspa_plugin.cc:892 msgid "Error saving presets file %1." msgstr "Σφάλμα στην αποθήκευση αÏχείου Ï€Ïο-Ïυθμίσεων %1." -#: ladspa_plugin.cc:915 +#: ladspa_plugin.cc:934 msgid "Could not locate HOME. Preset not saved." msgstr "Δεν μπόÏεσα να βÏÏŽ το HOME. Î Ïο-ÏÏθμιση δεν αποθηκεÏθηκε." @@ -975,7 +989,7 @@ msgstr "" msgid "incorrect XML mode passed to Locations::set_state" msgstr "λανθασμÎνο XML mode Ï€ÎÏασε στις Τοποθεσίες::set_state" -#: location.cc:842 session.cc:4516 session_state.cc:1031 +#: location.cc:842 session.cc:4533 session_state.cc:1025 msgid "session" msgstr "" @@ -1030,40 +1044,39 @@ msgid "Session and LTC framerate mismatch: LTC:%1 Session:%2." msgstr "" #: ltc_slave.cc:591 -#, c-format msgid "flywheel" msgstr "" -#: midi_diskstream.cc:167 +#: midi_diskstream.cc:166 msgid "" "%1: I/O configuration change %4 requested to use %2, but channel setup is %3" msgstr "" -#: midi_diskstream.cc:219 +#: midi_diskstream.cc:218 msgid "MidiDiskstream: Playlist \"%1\" isn't a midi playlist" msgstr "" -#: midi_diskstream.cc:270 +#: midi_diskstream.cc:269 msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!" msgstr "" -#: midi_diskstream.cc:699 +#: midi_diskstream.cc:698 msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3" msgstr "" -#: midi_diskstream.cc:834 +#: midi_diskstream.cc:833 msgid "MidiDiskstream %1: cannot write to disk" msgstr "" -#: midi_diskstream.cc:868 +#: midi_diskstream.cc:867 msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!" msgstr "" -#: midi_diskstream.cc:955 +#: midi_diskstream.cc:954 msgid "%1: could not create region for complete midi file" msgstr "" -#: midi_diskstream.cc:992 +#: midi_diskstream.cc:991 msgid "MidiDiskstream: could not create region for captured midi!" msgstr "" @@ -1075,27 +1088,27 @@ msgstr "" msgid "No SysExID found for sys-ex property change - ignored" msgstr "" -#: midi_model.cc:2010 +#: midi_model.cc:2012 msgid "transpose" msgstr "" -#: midi_patch_manager.cc:126 +#: midi_patch_manager.cc:127 msgid "Duplicate MIDI device `%1' in `%2' ignored" msgstr "" -#: midi_source.cc:125 +#: midi_source.cc:124 msgid "Missing parameter property on InterpolationStyle" msgstr "" -#: midi_source.cc:132 +#: midi_source.cc:131 msgid "Missing style property on InterpolationStyle" msgstr "" -#: midi_source.cc:144 +#: midi_source.cc:143 msgid "Missing parameter property on AutomationState" msgstr "" -#: midi_source.cc:151 +#: midi_source.cc:150 msgid "Missing state property on AutomationState" msgstr "" @@ -1139,22 +1152,22 @@ msgstr "" msgid "solo control" msgstr "" -#: mtc_slave.cc:238 +#: mtc_slave.cc:240 msgid "MTC Slave: atomic read of current time failed, sleeping!" msgstr "" "MTC Slave: ατομική ανάγνωση του Ï„ÏÎχοντος χÏόνου απÎτυχε, πίσω για Ïπνο!" -#: mtc_slave.cc:361 +#: mtc_slave.cc:362 msgid "" "Unknown rate/drop value %1 in incoming MTC stream, session values used " "instead" msgstr "" -#: mtc_slave.cc:381 +#: mtc_slave.cc:382 msgid "Session framerate adjusted from %1 TO: MTC's %2." msgstr "" -#: mtc_slave.cc:395 +#: mtc_slave.cc:396 msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3." msgstr "" @@ -1214,31 +1227,35 @@ msgstr "" msgid "Pannable given XML data for %1 - ignored" msgstr "" -#: panner_manager.cc:76 -msgid "looking for panners in %1" +#: panner_manager.cc:80 +msgid "looking for panners in %1\n" msgstr "" -#: panner_manager.cc:100 -msgid "Panner discovered: \"%1\" in %2" +#: panner_manager.cc:108 +msgid "Panner discovered: \"%1\" in %2\n" msgstr "" -#: panner_manager.cc:117 +#: panner_manager.cc:125 msgid "PannerManager: cannot load module \"%1\" (%2)" msgstr "" -#: panner_manager.cc:124 +#: panner_manager.cc:132 msgid "PannerManager: module \"%1\" has no descriptor function." msgstr "" -#: panner_manager.cc:187 +#: panner_manager.cc:219 msgid "no panner discovered for in/out = %1/%2" msgstr "" -#: panner_shell.cc:179 +#: panner_shell.cc:126 +msgid "select panner: %1\n" +msgstr "" + +#: panner_shell.cc:245 msgid "Unknown panner plugin \"%1\" found in pan state - ignored" msgstr "Άγνωστο plugin για panner \"%1\" ευÏÎθη στην κατάσταση pan - αγνοήθηκε" -#: panner_shell.cc:185 +#: panner_shell.cc:251 msgid "panner plugin node has no type information!" msgstr "ο κόμβος για τα plugin του panner δεν Îχει πληÏοφοÏίες Ï„Ïπου!" @@ -1258,19 +1275,19 @@ msgstr "" msgid "Could not construct playlist for PlaylistSource from session data!" msgstr "" -#: plugin.cc:324 +#: plugin.cc:328 msgid "" "Plugin presets are not supported in this build of %1. Consider paying for a " "full version" msgstr "" -#: plugin.cc:398 +#: plugin.cc:402 msgid "" "Saving plugin settings is not supported in this build of %1. Consider paying " "for the full version" msgstr "" -#: plugin_insert.cc:598 +#: plugin_insert.cc:589 msgid "programming error: " msgstr "σφάλμα Ï€ÏογÏαμματισμοÏ: " @@ -1306,43 +1323,43 @@ msgstr "PluginInsert: Auto: το id θÏÏας είναι εκτός Ï€ÎµÎ´Î¯Î¿Ï msgid "PluginInsert: automatable control %1 not found - ignored" msgstr "" -#: plugin_manager.cc:161 +#: plugin_manager.cc:165 msgid "Discovering Plugins" msgstr "" -#: plugin_manager.cc:335 +#: plugin_manager.cc:286 msgid "Could not parse rdf file: %1" msgstr "Δεν μπόÏεσα να αναλÏσω το αÏχείο rdf: %1" -#: plugin_manager.cc:374 +#: plugin_manager.cc:330 msgid "LADSPA: cannot load module \"%1\" (%2)" msgstr "LADSPA: δεν μποÏÏŽ να φοÏτώσω το module \"%1\" (%2)" -#: plugin_manager.cc:381 +#: plugin_manager.cc:337 msgid "LADSPA: module \"%1\" has no descriptor function." msgstr "LADSPA: το module \"%1\" δεν Îχει λειτουÏγία πεÏιγÏαφής." -#: plugin_manager.cc:602 +#: plugin_manager.cc:567 msgid "" "VST plugin %1 does not support processReplacing, and so cannot be used in %2 " "at this time" msgstr "" -#: plugin_manager.cc:709 +#: plugin_manager.cc:680 msgid "" "linuxVST plugin %1 does not support processReplacing, and so cannot be used " "in %2 at this time" msgstr "" -#: plugin_manager.cc:870 +#: plugin_manager.cc:841 msgid "unknown plugin status type \"%1\" - all entries ignored" msgstr "" -#: plugin_manager.cc:887 +#: plugin_manager.cc:858 msgid "unknown plugin type \"%1\" - ignored" msgstr "" -#: port.cc:410 +#: port.cc:412 msgid "could not reregister %1" msgstr "αδÏνατη η επανακαταγÏαφή %1" @@ -1350,11 +1367,11 @@ msgstr "αδÏνατη η επανακαταγÏαφή %1" msgid "insert %1" msgstr "" -#: port_insert.cc:198 +#: port_insert.cc:197 msgid "XML node describing port insert is missing the `type' field" msgstr "" -#: port_insert.cc:203 +#: port_insert.cc:202 msgid "non-port insert XML used for port plugin insert" msgstr "εισαγωγή μη-θÏÏας XML για χÏήση σε εισαγωγή plugin θÏÏας" @@ -1386,11 +1403,11 @@ msgstr "AudioEngine: αδÏνατη η σÏνδεση %1 (%2) σε %3 (%4)" msgid "Re-establising port %1 failed" msgstr "" -#: processor.cc:207 +#: processor.cc:208 msgid "No %1 property flag in element %2" msgstr "" -#: processor.cc:216 +#: processor.cc:217 msgid "No child node with active property" msgstr "" @@ -1454,11 +1471,11 @@ msgstr "" msgid "cannot create new name for region \"%1\"" msgstr "δεν μποÏÏŽ να δημιουÏγήσω νÎο όνομα για την πεÏιοχή \"%1\"" -#: resampled_source.cc:98 +#: resampled_source.cc:102 msgid "Import: %1" msgstr "Εισαγωγή: %1" -#: resampled_source.cc:128 +#: resampled_source.cc:132 srcfilesource.cc:76 msgid "Import: src_new() failed : %1" msgstr "Εισαγωγή: src_new() απÎτυχε : %1" @@ -1466,29 +1483,29 @@ msgstr "Εισαγωγή: src_new() απÎτυχε : %1" msgid "return %1" msgstr "" -#: route.cc:1075 route.cc:2528 +#: route.cc:1081 route.cc:2541 msgid "unknown Processor type \"%1\"; ignored" msgstr "" -#: route.cc:1087 +#: route.cc:1093 msgid "processor could not be created. Ignored." msgstr "" -#: route.cc:1962 route.cc:2187 +#: route.cc:1975 route.cc:2200 msgid "Bad node sent to Route::set_state() [%1]" msgstr "Κακός κόμβος εστάλη στο Route::set_state() [%1]" -#: route.cc:2022 +#: route.cc:2035 msgid "Pannable state found for route (%1) without a panner!" msgstr "" -#: route.cc:2096 route.cc:2100 route.cc:2301 route.cc:2305 +#: route.cc:2109 route.cc:2113 route.cc:2314 route.cc:2318 msgid "badly formed order key string in state file! [%1] ... ignored." msgstr "" "δÏσμοÏφη γÏαμμή ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Ï„Î±Î¾Î¹Î½Î¿Î¼Î®ÏƒÎµÏ‰Ï‚ στο αÏχείο καταστάσεως ! [%1] ... " "αγνοήθηκε." -#: route.cc:2311 +#: route.cc:2324 msgid "Converting deprecated order key for %1 using Editor order %2" msgstr "" @@ -1504,15 +1521,15 @@ msgstr "" msgid "error writing tempo-adjusted data to %1" msgstr "σφάλμα στην εγγÏαφή χÏονο-ÏυθμισμÎνων δεδομÎνων στο %1" -#: send.cc:59 +#: send.cc:60 msgid "aux %1" msgstr "" -#: send.cc:63 +#: send.cc:64 msgid "send %1" msgstr "" -#: send.cc:65 +#: send.cc:66 msgid "programming error: send created using role %1" msgstr "" @@ -1536,149 +1553,149 @@ msgstr "" msgid "Set up standard connections" msgstr "" -#: session.cc:635 +#: session.cc:638 msgid "could not setup Click I/O" msgstr "Δεν μπόÏεσα να διαμοÏφώσω το I/O του ΜετÏονόμου(click)" -#: session.cc:683 +#: session.cc:686 #, c-format msgid "out %<PRIu32>" msgstr "" -#: session.cc:697 +#: session.cc:700 #, c-format msgid "out %<PRIu32>+%<PRIu32>" msgstr "" -#: session.cc:712 +#: session.cc:715 #, c-format msgid "in %<PRIu32>" msgstr "" -#: session.cc:726 +#: session.cc:729 #, c-format msgid "in %<PRIu32>+%<PRIu32>" msgstr "" -#: session.cc:790 +#: session.cc:793 msgid "cannot connect master output %1 to %2" msgstr "" -#: session.cc:849 +#: session.cc:862 msgid "monitor" msgstr "monitor" -#: session.cc:894 +#: session.cc:907 msgid "cannot connect control input %1 to %2" msgstr "" -#: session.cc:914 +#: session.cc:927 msgid "The preferred I/O for the monitor bus (%1) cannot be found" msgstr "" -#: session.cc:945 +#: session.cc:958 msgid "cannot connect control output %1 to %2" msgstr "" -#: session.cc:1009 +#: session.cc:1026 msgid "cannot create Auditioner: no auditioning of regions possible" msgstr "δεν μποÏÏŽ να δημιουÏγήσω τον ΑκÏοατή: καμία ακÏόαση πεÏιοχών δυνατή" -#: session.cc:1193 +#: session.cc:1210 msgid "Session: you can't use that location for auto punch (start <= end)" msgstr "" "ΣυνεδÏία: δεν μποÏείτε να χÏησιμοποιήσετε αυτήν την τοποθεσία για auto punch " "(αÏχή <= Ï„Îλος)" -#: session.cc:1233 +#: session.cc:1250 msgid "" "You cannot use this location for auto-loop because it has zero or negative " "length" msgstr "" -#: session.cc:1547 +#: session.cc:1564 msgid "feedback loop setup between %1 and %2" msgstr "διαμόÏφωση feedback loop ανάμεσα σε %1 και %2" -#: session.cc:1843 +#: session.cc:1860 msgid "Session: could not create new midi track." msgstr "" -#: session.cc:1849 +#: session.cc:1866 msgid "" "No more JACK ports are available. You will need to stop %1 and restart JACK " "with more ports if you need this many tracks." msgstr "" -#: session.cc:2026 session.cc:2029 +#: session.cc:2043 session.cc:2046 msgid "Audio" msgstr "" -#: session.cc:2053 session.cc:2061 session.cc:2138 session.cc:2146 +#: session.cc:2070 session.cc:2078 session.cc:2155 session.cc:2163 msgid "cannot configure %1 in/%2 out configuration for new audio track" msgstr "δεν μποÏÏŽ να διαμοÏφώσω %1 in/%2 out διάταξη για νÎο κανάλι ήχου" -#: session.cc:2084 +#: session.cc:2101 msgid "Session: could not create new audio track." msgstr "ΣυνεδÏία: δεν μπόÏεσα να δημιουÏγήσω νÎο κανάλι ήχου." -#: session.cc:2116 session.cc:2119 +#: session.cc:2133 session.cc:2136 msgid "Bus" msgstr "" -#: session.cc:2169 +#: session.cc:2186 msgid "Session: could not create new audio route." msgstr "" -#: session.cc:2228 session.cc:2238 +#: session.cc:2245 session.cc:2255 msgid "Session: UINT_MAX routes? impossible!" msgstr "" -#: session.cc:2260 +#: session.cc:2277 msgid "Session: cannot create track/bus from template description" msgstr "" -#: session.cc:2286 +#: session.cc:2303 msgid "Session: could not create new route from template" msgstr "" -#: session.cc:2315 +#: session.cc:2332 msgid "Adding new tracks/busses failed" msgstr "" -#: session.cc:3419 +#: session.cc:3436 msgid "FATAL ERROR! Could not find a suitable version of %1 for a rename" msgstr "" -#: session.cc:3539 session.cc:3597 +#: session.cc:3556 session.cc:3614 msgid "There are already %1 recordings for %2, which I consider too many." msgstr "ΥπάÏχουν ήδη %1 εγγÏαφÎÏ‚ για %2, τις οποίες θεωÏÏŽ πάÏα πολλÎÏ‚." -#: session.cc:3987 +#: session.cc:4004 msgid "send ID %1 appears to be in use already" msgstr "" -#: session.cc:3999 +#: session.cc:4016 msgid "aux send ID %1 appears to be in use already" msgstr "" -#: session.cc:4011 +#: session.cc:4028 msgid "return ID %1 appears to be in use already" msgstr "" -#: session.cc:4023 +#: session.cc:4040 msgid "insert ID %1 appears to be in use already" msgstr "" -#: session.cc:4150 +#: session.cc:4167 msgid "Cannot write a range where end <= start (e.g. %1 <= %2)" msgstr "" -#: session.cc:4179 +#: session.cc:4196 msgid "too many bounced versions of playlist \"%1\"" msgstr "πάÏα πολλÎÏ‚ bounced εκδόσεις της Playlist \"%1\"" -#: session.cc:4189 +#: session.cc:4206 msgid "cannot create new audio file \"%1\" for %2" msgstr "δεν μποÏÏŽ να δημιουÏγήσω νÎο αÏχείο ήχου \"%1\" για %2" @@ -1713,7 +1730,7 @@ msgstr "" msgid "Session subdirectory does not exist at path %1" msgstr "" -#: session_events.cc:184 +#: session_events.cc:185 msgid "Session: cannot have two events of type %1 at the same frame (%2)." msgstr "" "ΣυνεδÏία: δεν γίνεται να υπάÏχουν δÏο συμβάντα του Ï„Ïπου %1 στο ίδιο frame " @@ -1727,13 +1744,13 @@ msgstr "%1: δεν μποÏÏŽ να αναζητήσω στο %2 για ÎµÎ¾Î±Î³Ï msgid "Export ended unexpectedly: %1" msgstr "" -#: session_ltc.cc:222 +#: session_ltc.cc:221 msgid "" "LTC encoder: invalid framerate - LTC encoding is disabled for the remainder " "of this session." msgstr "" -#: session_midi.cc:520 +#: session_midi.cc:519 msgid "Session: cannot send quarter-frame MTC message (%1)" msgstr "ΣυνεδÏία: δεν μποÏÏŽ να στείλω Ï„ÎταÏτο-frame MTC μήνυμα (%1)" @@ -1745,228 +1762,224 @@ msgstr "ΣυνεδÏία: δεν μποÏÏŽ να δημιουÏγήσω την P msgid "Session: error in no roll for %1" msgstr "ΣυνεδÏία: σφάλμα στο no roll για %1" -#: session_process.cc:1157 +#: session_process.cc:1159 msgid "Programming error: illegal event type in process_event (%1)" msgstr "" "Σφάλμα Ï€ÏογÏαμματισμοÏ: παÏάνομος Ï„Ïπος συμβάντος στο process_event (%1)" -#: session_state.cc:140 -msgid "Could not use path %1 (%2)" -msgstr "" - -#: session_state.cc:184 +#: session_state.cc:178 msgid "solo cut control (dB)" msgstr "" -#: session_state.cc:208 +#: session_state.cc:202 msgid "Set block size and sample rate" msgstr "" -#: session_state.cc:213 +#: session_state.cc:207 msgid "Using configuration" msgstr "" -#: session_state.cc:325 +#: session_state.cc:319 msgid "Reset Remote Controls" msgstr "" -#: session_state.cc:417 +#: session_state.cc:411 msgid "Session: cannot create session peakfile folder \"%1\" (%2)" msgstr "" -#: session_state.cc:424 +#: session_state.cc:418 msgid "Session: cannot create session sounds dir \"%1\" (%2)" msgstr "ΣυνεδÏία: δεν μποÏÏŽ να δημιουÏγήσω φάκελο ήχων συνεδÏίας \"%1\" (%2)" -#: session_state.cc:431 +#: session_state.cc:425 msgid "Session: cannot create session midi dir \"%1\" (%2)" msgstr "" -#: session_state.cc:438 +#: session_state.cc:432 msgid "Session: cannot create session dead sounds folder \"%1\" (%2)" msgstr "" -#: session_state.cc:445 +#: session_state.cc:439 msgid "Session: cannot create session export folder \"%1\" (%2)" msgstr "" -#: session_state.cc:452 +#: session_state.cc:446 msgid "Session: cannot create session analysis folder \"%1\" (%2)" msgstr "" -#: session_state.cc:459 +#: session_state.cc:453 msgid "Session: cannot create session plugins folder \"%1\" (%2)" msgstr "" -#: session_state.cc:466 +#: session_state.cc:460 msgid "Session: cannot create session externals folder \"%1\" (%2)" msgstr "" -#: session_state.cc:480 +#: session_state.cc:474 msgid "Session: cannot create session folder \"%1\" (%2)" msgstr "" -#: session_state.cc:514 +#: session_state.cc:508 msgid "Could not open %1 for writing session template" msgstr "" -#: session_state.cc:520 +#: session_state.cc:514 msgid "Could not open session template %1 for reading" msgstr "" -#: session_state.cc:539 +#: session_state.cc:533 msgid "master" msgstr "master" -#: session_state.cc:600 +#: session_state.cc:594 msgid "Could not remove pending capture state at path \"%1\" (%2)" msgstr "" -#: session_state.cc:624 +#: session_state.cc:618 msgid "could not rename snapshot %1 to %2 (%3)" msgstr "" -#: session_state.cc:652 +#: session_state.cc:646 msgid "Could not remove session file at path \"%1\" (%2)" msgstr "" -#: session_state.cc:669 +#: session_state.cc:663 msgid "" "the %1 audio engine is not connected and state saving would lose all I/O " "connections. Session not saved" msgstr "" -#: session_state.cc:720 +#: session_state.cc:714 msgid "state could not be saved to %1" msgstr "η κατάσταση δεν μποÏοÏσε να σωθεί στο %1" -#: session_state.cc:722 session_state.cc:733 +#: session_state.cc:716 session_state.cc:727 msgid "Could not remove temporary session file at path \"%1\" (%2)" msgstr "" -#: session_state.cc:730 -msgid "could not rename temporary session file %1 to %2" +#: session_state.cc:724 +msgid "could not rename temporary session file %1 to %2 (%3)" msgstr "" -#: session_state.cc:798 +#: session_state.cc:792 msgid "%1: session file \"%2\" doesn't exist!" msgstr "" -#: session_state.cc:810 +#: session_state.cc:804 msgid "Could not understand session file %1" msgstr "" -#: session_state.cc:819 +#: session_state.cc:813 msgid "Session file %1 is not a session" msgstr "" -#: session_state.cc:1125 +#: session_state.cc:1119 msgid "programming error: Session: incorrect XML node sent to set_state()" msgstr "" "σφάλμα Ï€ÏογÏαμματισμοÏ: ΣυνεδÏία: λανθασμÎνος κόμβος XML εστάλη στην " "set_state()" -#: session_state.cc:1179 +#: session_state.cc:1173 msgid "Session: XML state has no options section" msgstr "ΣυνεδÏία: η XML κατάσταση δεν Îχει τομÎα επιλογών(options)" -#: session_state.cc:1184 +#: session_state.cc:1178 msgid "Session: XML state has no metadata section" msgstr "" -#: session_state.cc:1195 +#: session_state.cc:1189 msgid "Session: XML state has no sources section" msgstr "ΣυνεδÏία: η XML κατάσταση δεν Îχει τομÎα πηγών" -#: session_state.cc:1202 +#: session_state.cc:1196 msgid "Session: XML state has no Tempo Map section" msgstr "ΣυνεδÏία: η XML κατάσταση δεν Îχει τομÎα Tempo Map" -#: session_state.cc:1209 +#: session_state.cc:1203 msgid "Session: XML state has no locations section" msgstr "ΣυνεδÏία: η XML κατάσταση δεν Îχει τομÎα τοποθεσιών" -#: session_state.cc:1235 +#: session_state.cc:1229 msgid "Session: XML state has no Regions section" msgstr "ΣυνεδÏία: η XML κατάσταση δεν Îχει τομÎα ΠεÏιοχών" -#: session_state.cc:1242 +#: session_state.cc:1236 msgid "Session: XML state has no playlists section" msgstr "ΣυνεδÏία: η XML κατάσταση δεν Îχει τομÎα playlists" -#: session_state.cc:1262 +#: session_state.cc:1256 msgid "Session: XML state has no bundles section" msgstr "" -#: session_state.cc:1274 +#: session_state.cc:1268 msgid "Session: XML state has no diskstreams section" msgstr "ΣυνεδÏία: η XML κατάσταση δεν Îχει τομÎα diskstreams" -#: session_state.cc:1282 +#: session_state.cc:1276 msgid "Session: XML state has no routes section" msgstr "ΣυνεδÏία: η XML κατάσταση δεν Îχει τομÎα διαδÏομών" -#: session_state.cc:1294 +#: session_state.cc:1288 msgid "Session: XML state has no route groups section" msgstr "" -#: session_state.cc:1303 +#: session_state.cc:1297 msgid "Session: XML state has no edit groups section" msgstr "ΣυνεδÏία: η XML κατάσταση δεν Îχει τομÎα επεξεÏ/σίας ομάδων" -#: session_state.cc:1310 +#: session_state.cc:1304 msgid "Session: XML state has no mix groups section" msgstr "ΣυνεδÏία: η XML κατάσταση δεν Îχει τομÎα μίξεως ομάδων" -#: session_state.cc:1318 +#: session_state.cc:1312 msgid "Session: XML state has no click section" msgstr "ΣυνεδÏία: η XML κατάσταση δεν Îχει τομÎα μετÏονόμου" -#: session_state.cc:1360 +#: session_state.cc:1354 msgid "Session: cannot create Route from XML description." msgstr "ΣυνεδÏία: δεν μποÏÏŽ να δημιουÏγήσω ΔιαδÏομή από XML πεÏιγÏαφή." -#: session_state.cc:1364 +#: session_state.cc:1358 msgid "Loaded track/bus %1" msgstr "" -#: session_state.cc:1462 +#: session_state.cc:1456 msgid "Could not find diskstream for route" msgstr "" -#: session_state.cc:1516 +#: session_state.cc:1510 msgid "Session: cannot create Region from XML description." msgstr "ΣυνεδÏία: δεν μποÏÏŽ να δημιουÏγήσω ΠεÏιοχή από XML πεÏιγÏαφή." -#: session_state.cc:1520 +#: session_state.cc:1514 msgid "Can not load state for region '%1'" msgstr "" -#: session_state.cc:1556 +#: session_state.cc:1550 msgid "Regions in compound description not found (ID's %1 and %2): ignored" msgstr "" -#: session_state.cc:1584 +#: session_state.cc:1578 msgid "Nested source has no ID info in session file! (ignored)" msgstr "" -#: session_state.cc:1596 +#: session_state.cc:1590 msgid "Cannot reconstruct nested source for region %1" msgstr "" -#: session_state.cc:1658 +#: session_state.cc:1652 msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)" msgstr "" "ΣυνεδÏία: Ο XMLΚόμβος που πεÏιγÏάφει AudioΠεÏιοχή είναι ημιτελής (δίχως πηγή)" -#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707 +#: session_state.cc:1660 session_state.cc:1681 session_state.cc:1701 msgid "" "Session: XMLNode describing a AudioRegion references an unknown source id =%1" msgstr "" "ΣυνεδÏία: Ο XMLΚόμβος που πεÏιγÏάφει AudioΠεÏιοχή αναφÎÏει άγνωστο id πηγής =" "%1" -#: session_state.cc:1672 session_state.cc:1693 session_state.cc:1713 +#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707 msgid "" "Session: XMLNode describing a AudioRegion references a non-audio source id =" "%1" @@ -1974,129 +1987,125 @@ msgstr "" "ΣυνεδÏία: Ο XMLNode που πεÏιγÏάφει AudioRegion αναφÎÏει μη-ηχητική πηγή με " "id =%1" -#: session_state.cc:1736 +#: session_state.cc:1730 msgid "" "Session: XMLNode describing an AudioRegion is missing some master sources; " "ignored" msgstr "" -#: session_state.cc:1770 +#: session_state.cc:1764 msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)" msgstr "" -#: session_state.cc:1778 +#: session_state.cc:1772 msgid "" "Session: XMLNode describing a MidiRegion references an unknown source id =%1" msgstr "" -#: session_state.cc:1784 +#: session_state.cc:1778 msgid "" "Session: XMLNode describing a MidiRegion references a non-midi source id =%1" msgstr "" -#: session_state.cc:1852 +#: session_state.cc:1846 msgid "" "cannot create new file from region name \"%1\" with ident = \"%2\": too many " "existing files with similar names" msgstr "" -#: session_state.cc:1875 +#: session_state.cc:1869 msgid "Session: cannot create Source from XML description." msgstr "ΣυνεδÏία: δεν μποÏÏŽ να δημιουÏγήσω Πηγή από XML πεÏιγÏαφή." -#: session_state.cc:1909 +#: session_state.cc:1903 msgid "A sound file is missing. It will be replaced by silence." msgstr "" -#: session_state.cc:1932 +#: session_state.cc:1926 msgid "Found a sound file that cannot be used by %1. Talk to the progammers." msgstr "" -#: session_state.cc:1949 +#: session_state.cc:1943 msgid "Could not create templates directory \"%1\" (%2)" msgstr "" -#: session_state.cc:1962 +#: session_state.cc:1956 msgid "Template \"%1\" already exists - new version not created" msgstr "Το Ï€ÏοσχÎδιο \"%1\" ήδη υπάÏχει - νÎα Îκδοση δεν δημιουÏγήθηκε" -#: session_state.cc:1968 +#: session_state.cc:1962 msgid "Could not create directory for Session template\"%1\" (%2)" msgstr "" -#: session_state.cc:1978 +#: session_state.cc:1972 msgid "template not saved" msgstr "" -#: session_state.cc:1988 +#: session_state.cc:1982 msgid "Could not create directory for Session template plugin state\"%1\" (%2)" msgstr "" -#: session_state.cc:2183 +#: session_state.cc:2225 msgid "Unknown node \"%1\" found in Bundles list from session file" msgstr "" -#: session_state.cc:2725 session_state.cc:2731 -msgid "Cannot expand path %1 (%2)" -msgstr "" - -#: session_state.cc:2784 +#: session_state.cc:2820 msgid "Session: cannot create dead file folder \"%1\" (%2)" msgstr "" -#: session_state.cc:2823 +#: session_state.cc:2859 msgid "cannot rename unused file source from %1 to %2 (%3)" msgstr "" -#: session_state.cc:2841 +#: session_state.cc:2877 msgid "cannot remove peakfile %1 for %2 (%3)" msgstr "δεν μποÏÏŽ να απαλοίψω το peakfile %1 για %2 (%3)" -#: session_state.cc:3143 +#: session_state.cc:3179 msgid "could not backup old history file, current history not saved" msgstr "" -#: session_state.cc:3156 +#: session_state.cc:3192 msgid "history could not be saved to %1" msgstr "" -#: session_state.cc:3159 +#: session_state.cc:3195 msgid "Could not remove history file at path \"%1\" (%2)" msgstr "" -#: session_state.cc:3163 +#: session_state.cc:3199 msgid "could not restore history file from backup %1 (%2)" msgstr "" -#: session_state.cc:3188 +#: session_state.cc:3224 msgid "%1: no history file \"%2\" for this session." msgstr "" -#: session_state.cc:3194 +#: session_state.cc:3230 msgid "Could not understand session history file \"%1\"" msgstr "" -#: session_state.cc:3236 +#: session_state.cc:3272 msgid "Failed to downcast MidiSource for NoteDiffCommand" msgstr "" -#: session_state.cc:3247 +#: session_state.cc:3283 msgid "Failed to downcast MidiSource for SysExDiffCommand" msgstr "" -#: session_state.cc:3258 +#: session_state.cc:3294 msgid "Failed to downcast MidiSource for PatchChangeDiffCommand" msgstr "" -#: session_state.cc:3266 +#: session_state.cc:3302 msgid "Couldn't figure out how to make a Command out of a %1 XMLNode." msgstr "" -#: session_state.cc:3502 +#: session_state.cc:3538 msgid "Session: unknown diskstream type in XML" msgstr "" -#: session_state.cc:3507 +#: session_state.cc:3543 msgid "Session: could not load diskstream via XML state" msgstr "ΣυνεδÏία: δεν μπόÏεσα να φοÏτώσω diskstream μÎσω καταστάσεως XML" @@ -2120,115 +2129,115 @@ msgid "" "control" msgstr "" -#: smf_source.cc:252 +#: smf_source.cc:262 msgid "Unable to read event prefix, corrupt MIDI ring" msgstr "" -#: smf_source.cc:265 +#: smf_source.cc:275 msgid "Event has time and size but no body, corrupt MIDI ring" msgstr "" -#: smf_source.cc:271 +#: smf_source.cc:281 msgid "Event time is before MIDI source position" msgstr "" -#: smf_source.cc:306 smf_source.cc:345 +#: smf_source.cc:316 smf_source.cc:355 msgid "Skipping event with unordered time %1" msgstr "" -#: smf_source.cc:410 +#: smf_source.cc:420 msgid "cannot open MIDI file %1 for write" msgstr "" -#: sndfile_helpers.cc:32 +#: sndfile_helpers.cc:34 msgid "WAV" msgstr "WAV" -#: sndfile_helpers.cc:33 +#: sndfile_helpers.cc:35 msgid "AIFF" msgstr "AIFF" -#: sndfile_helpers.cc:34 +#: sndfile_helpers.cc:36 msgid "CAF" msgstr "" -#: sndfile_helpers.cc:35 +#: sndfile_helpers.cc:37 msgid "W64 (64 bit WAV)" msgstr "W64 (64 bit WAV)" -#: sndfile_helpers.cc:36 +#: sndfile_helpers.cc:38 msgid "FLAC" msgstr "" -#: sndfile_helpers.cc:37 +#: sndfile_helpers.cc:39 msgid "Ogg/Vorbis" msgstr "" -#: sndfile_helpers.cc:38 +#: sndfile_helpers.cc:40 msgid "raw (no header)" msgstr "raw (no header)" -#: sndfile_helpers.cc:43 +#: sndfile_helpers.cc:45 msgid ".wav" msgstr "" -#: sndfile_helpers.cc:44 +#: sndfile_helpers.cc:46 msgid ".aiff" msgstr "" -#: sndfile_helpers.cc:45 +#: sndfile_helpers.cc:47 msgid ".caf" msgstr "" -#: sndfile_helpers.cc:46 +#: sndfile_helpers.cc:48 msgid ".w64" msgstr "" -#: sndfile_helpers.cc:47 +#: sndfile_helpers.cc:49 msgid ".flac" msgstr "" -#: sndfile_helpers.cc:48 +#: sndfile_helpers.cc:50 msgid ".ogg" msgstr "" -#: sndfile_helpers.cc:49 +#: sndfile_helpers.cc:51 msgid ".raw" msgstr "" -#: sndfile_helpers.cc:64 +#: sndfile_helpers.cc:66 msgid "Signed 16 bit PCM" msgstr "" -#: sndfile_helpers.cc:65 +#: sndfile_helpers.cc:67 msgid "Signed 24 bit PCM" msgstr "" -#: sndfile_helpers.cc:66 +#: sndfile_helpers.cc:68 msgid "Signed 32 bit PCM" msgstr "" -#: sndfile_helpers.cc:67 +#: sndfile_helpers.cc:69 msgid "Signed 8 bit PCM" msgstr "" -#: sndfile_helpers.cc:68 +#: sndfile_helpers.cc:70 msgid "32 bit float" msgstr "" -#: sndfile_helpers.cc:81 +#: sndfile_helpers.cc:83 msgid "Little-endian (Intel)" msgstr "Little-endian (Intel)" -#: sndfile_helpers.cc:82 +#: sndfile_helpers.cc:84 msgid "Big-endian (PowerPC)" msgstr "" -#: sndfilesource.cc:201 +#: sndfilesource.cc:210 msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)" msgstr "SndFileSource: δεν μποÏÏŽ να ανοίξω το αÏχείο \"%1\" για %2 (%3)" -#: sndfilesource.cc:209 +#: sndfilesource.cc:218 msgid "" "SndFileSource: file only contains %1 channels; %2 is invalid as a channel " "number" @@ -2236,7 +2245,7 @@ msgstr "" "SndFileSource: το αÏχείο πεÏιÎχει μόνο %1 κανάλια; %2 δεν Îχει αξία σαν " "κανάλι number" -#: sndfilesource.cc:255 sndfilesource.cc:571 sndfilesource.cc:595 +#: sndfilesource.cc:264 sndfilesource.cc:604 sndfilesource.cc:628 msgid "" "cannot set broadcast info for audio file %1 (%2); dropping broadcast info " "for this file" @@ -2244,78 +2253,86 @@ msgstr "" "Δεν ετÎθησαν broadcast info για το audio file %1 (%2); απόÏÏιψη broadcast " "info για αυτό το αÏχείο" -#: sndfilesource.cc:302 +#: sndfilesource.cc:311 msgid "could not allocate file %1 for reading." msgstr "" -#: sndfilesource.cc:337 +#: sndfilesource.cc:346 msgid "SndFileSource: could not seek to frame %1 within %2 (%3)" msgstr "SndFileSource: δεν μποÏοÏσα να αναζητήσω στο frame %1 μÎσα στο %2 (%3)" -#: sndfilesource.cc:347 +#: sndfilesource.cc:356 msgid "" "SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)" msgstr "" -#: sndfilesource.cc:391 sndfilesource.cc:420 +#: sndfilesource.cc:400 sndfilesource.cc:429 msgid "attempt to write a non-writable audio file source (%1)" msgstr "" -#: sndfilesource.cc:396 utils.cc:510 utils.cc:534 utils.cc:548 utils.cc:567 +#: sndfilesource.cc:405 utils.cc:547 utils.cc:571 utils.cc:585 utils.cc:604 msgid "programming error: %1 %2" msgstr "σφάλμα Ï€ÏογÏαμματισμοÏ: %1 %2" -#: sndfilesource.cc:523 +#: sndfilesource.cc:532 sndfilesource.cc:562 msgid "attempt to flush a non-writable audio file source (%1)" msgstr "" -#: sndfilesource.cc:528 +#: sndfilesource.cc:537 sndfilesource.cc:557 msgid "attempt to flush an un-opened audio file source (%1)" msgstr "" -#: sndfilesource.cc:534 +#: sndfilesource.cc:543 msgid "could not allocate file %1 to write header" msgstr "" -#: sndfilesource.cc:548 +#: sndfilesource.cc:568 +msgid "could not allocate file %1 to flush contents" +msgstr "" + +#: sndfilesource.cc:581 msgid "" "attempt to store broadcast info in a non-writable audio file source (%1)" msgstr "" -#: sndfilesource.cc:553 +#: sndfilesource.cc:586 msgid "attempt to set BWF info for an un-opened audio file source (%1)" msgstr "" -#: sndfilesource.cc:614 +#: sndfilesource.cc:647 msgid "%1: cannot seek to %2 (libsndfile error: %3)" msgstr "" -#: sndfilesource.cc:727 +#: sndfilesource.cc:760 msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)" msgstr "" -#: sndfilesource.cc:740 sndfilesource.cc:790 sndfilesource.cc:797 +#: sndfilesource.cc:773 sndfilesource.cc:823 sndfilesource.cc:830 msgid "SndFileSource: \"%1\" bad write (%2)" msgstr "" -#: sndfilesource.cc:820 +#: sndfilesource.cc:853 msgid "" "Filesource: start time is already set for existing file (%1): Cannot change " "start time." msgstr "" -#: speakers.cc:239 +#: speakers.cc:280 msgid "Speaker information is missing azimuth - speaker ignored" msgstr "" -#: speakers.cc:245 +#: speakers.cc:286 msgid "Speaker information is missing elevation - speaker ignored" msgstr "" -#: speakers.cc:251 +#: speakers.cc:292 msgid "Speaker information is missing distance - speaker ignored" msgstr "" +#: srcfilesource.cc:135 +msgid "SrcFileSource: %1" +msgstr "" + #: tape_file_matcher.cc:46 msgid "Cannot compile tape track regexp for use (%1)" msgstr "" @@ -2464,54 +2481,72 @@ msgstr "" msgid "Node for Port has no \"name\" property" msgstr "" -#: utils.cc:358 utils.cc:382 +#: utils.cc:395 utils.cc:419 msgid "Splice" msgstr "" -#: utils.cc:360 utils.cc:375 +#: utils.cc:397 utils.cc:412 msgid "Slide" msgstr "" -#: utils.cc:362 utils.cc:378 +#: utils.cc:399 utils.cc:415 msgid "Lock" msgstr "" -#: utils.cc:365 +#: utils.cc:402 msgid "programming error: unknown edit mode string \"%1\"" msgstr "" -#: utils.cc:389 utils.cc:421 +#: utils.cc:426 utils.cc:458 msgid "MIDI Timecode" msgstr "" -#: utils.cc:389 utils.cc:419 +#: utils.cc:426 utils.cc:456 msgid "MTC" msgstr "" -#: utils.cc:393 utils.cc:428 +#: utils.cc:430 utils.cc:465 msgid "MIDI Clock" msgstr "" -#: utils.cc:397 utils.cc:415 utils.cc:435 +#: utils.cc:434 utils.cc:452 utils.cc:472 msgid "JACK" msgstr "" -#: utils.cc:401 +#: utils.cc:438 msgid "programming error: unknown sync source string \"%1\"" msgstr "" -#: utils.cc:426 +#: utils.cc:463 msgid "M-Clock" msgstr "" -#: utils.cc:432 +#: utils.cc:469 msgid "LTC" msgstr "" -#: utils.cc:602 +#: utils.cc:639 msgid "programming error: unknown native header format: %1" msgstr "" -#: utils.cc:617 +#: utils.cc:654 msgid "cannot open directory %1 (%2)" msgstr "" + +#~ msgid "Filesource: cannot find required file (%1): while searching %2" +#~ msgstr "" +#~ "Filesource: δεν ευÏÎθη το απαιτοÏμενο αÏχείο (%1): κατά την αναζήτηση του " +#~ "%2" + +#~ msgid "" +#~ "FileSource: \"%1\" is ambigous when searching %2\n" +#~ "\t" +#~ msgstr "" +#~ "FileSource: \"%1\" είναι αμφίβολο κατά την αναζήτηση του %2\n" +#~ "\t" + +#~ msgid "Could not resolve path: %1 (%2)" +#~ msgstr "ΑδÏνατη η εÏÏεση path: %1 (%2)" + +#~ msgid "LADSPA: cannot load module from \"%1\"" +#~ msgstr "LADSPA: δεν μποÏÏŽ να φοÏτώσω module από \"%1\"" diff --git a/libs/ardour/po/es.po b/libs/ardour/po/es.po index 758dcd2bbb..1a2648d872 100644 --- a/libs/ardour/po/es.po +++ b/libs/ardour/po/es.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: libardour\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-11-05 11:11-0500\n" +"POT-Creation-Date: 2014-02-10 17:53+0100\n" "PO-Revision-Date: \n" "Last-Translator: Pablo Fernández <pablo.fbus@gmail.com>\n" "Language-Team: Grupo de Traducción al Español <traductores@teklibre.com>\n" @@ -22,73 +22,73 @@ msgstr "" msgid "Fader" msgstr "" -#: audio_diskstream.cc:244 +#: audio_diskstream.cc:242 msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist" msgstr "" "AudioDiskstream: La lista de reproducción \"%1\" no es una lista de " "reproducción de audio." -#: audio_diskstream.cc:296 +#: audio_diskstream.cc:294 msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!" msgstr "AudioDiskstream %1: ¡No hay ninguna lista de reproducción para copiar!" -#: audio_diskstream.cc:848 audio_diskstream.cc:858 +#: audio_diskstream.cc:846 audio_diskstream.cc:856 msgid "" "AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3" msgstr "" "AudioDiskstream %1: al rellenar, no se puede leer %2 de la lista de " "reproducción en el cuadro %3." -#: audio_diskstream.cc:1014 +#: audio_diskstream.cc:1012 msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3" msgstr "" "AudioDiskstream %1: no se puede leer %2 de la lista de reproducción en el " "cuadro %3." -#: audio_diskstream.cc:1383 audio_diskstream.cc:1400 +#: audio_diskstream.cc:1381 audio_diskstream.cc:1398 msgid "AudioDiskstream %1: cannot write to disk" msgstr "AudioDiskstream %1: no se puede escribir en el disco." -#: audio_diskstream.cc:1443 +#: audio_diskstream.cc:1441 msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!" msgstr "" -#: audio_diskstream.cc:1537 +#: audio_diskstream.cc:1535 msgid "%1: could not create region for complete audio file" msgstr "%1: no se pudo crear la región para el archivo de audio completo" -#: audio_diskstream.cc:1571 +#: audio_diskstream.cc:1569 msgid "AudioDiskstream: could not create region for captured audio!" msgstr "AudioDiskstream: ¡No se pudo crear región para el audio capturado!" -#: audio_diskstream.cc:1679 +#: audio_diskstream.cc:1677 msgid "programmer error: %1" msgstr "error de programador: %1" -#: audio_diskstream.cc:1905 +#: audio_diskstream.cc:1903 msgid "AudioDiskstream: channel %1 out of range" msgstr "AudioDiskstream: canal %1 fuera de rango" -#: audio_diskstream.cc:1919 midi_diskstream.cc:1210 +#: audio_diskstream.cc:1917 midi_diskstream.cc:1209 msgid "%1:%2 new capture file not initialized correctly" msgstr "%1:%2 archivo de captura nuevo no inicializado correctamente" -#: audio_diskstream.cc:2200 +#: audio_diskstream.cc:2198 msgid "%1: cannot restore pending capture source file %2" msgstr "%1: no se puede restaurar el archivo de captura pendiente %2" -#: audio_diskstream.cc:2222 +#: audio_diskstream.cc:2220 msgid "%1: incorrect number of pending sources listed - ignoring them all" msgstr "" "%1: cantidad listada de fuentes pendientes incorrecta - se ignorarán todas" -#: audio_diskstream.cc:2246 +#: audio_diskstream.cc:2244 msgid "%1: cannot create whole-file region from pending capture sources" msgstr "" "%1: no se puede crear la región del archivo entero desde las fuentes de " "captura pendientes" -#: audio_library.cc:71 +#: audio_library.cc:81 msgid "Could not open %1. Audio Library not saved" msgstr "No se pudo abrir %1. Biblioteca de Audio no guardada." @@ -128,11 +128,11 @@ msgstr "" msgid "Audio Playlists (unused)" msgstr "" -#: audio_playlist_source.cc:171 audiosource.cc:913 file_source.cc:529 +#: audio_playlist_source.cc:171 audiosource.cc:891 file_source.cc:520 #: midi_playlist_source.cc:144 midi_playlist_source.cc:152 -#: midi_playlist_source.cc:159 midi_source.cc:371 plugin_insert.cc:643 -#: rb_effect.cc:333 session.cc:2619 session.cc:2652 session.cc:3797 -#: session_handle.cc:87 sndfilesource.cc:121 +#: midi_playlist_source.cc:159 midi_source.cc:370 plugin_insert.cc:634 +#: rb_effect.cc:333 session.cc:2636 session.cc:2669 session.cc:3814 +#: session_handle.cc:87 sndfilesource.cc:122 msgid "programming error: %1" msgstr "error de programación: %1" @@ -160,23 +160,23 @@ msgstr "" "\n" "Canales: " -#: audio_track.cc:167 +#: audio_track.cc:161 msgid "Unknown bundle \"%1\" listed for input of %2" msgstr "" -#: audio_track.cc:169 +#: audio_track.cc:163 msgid "in 1" msgstr "" -#: audio_track.cc:170 +#: audio_track.cc:164 msgid "No input bundles available as a replacement" msgstr "" -#: audio_track.cc:174 +#: audio_track.cc:168 msgid "Bundle %1 was not available - \"in 1\" used instead" msgstr "" -#: audio_track.cc:183 +#: audio_track.cc:177 msgid "improper input channel list in XML node (%1)" msgstr "Lista de entrada de canales inválida en el nodo XML (%1)" @@ -200,23 +200,23 @@ msgstr "no se puede cargar el plugin VAMP \"%1\"" msgid "VAMP Plugin \"%1\" could not be loaded" msgstr "el plugin VAMP \"%1\" no pudo ser cargado" -#: audioengine.cc:488 +#: audioengine.cc:495 msgid "looking for backends in %1\n" msgstr "" -#: audioengine.cc:511 +#: audioengine.cc:518 msgid "AudioEngine: cannot load module \"%1\" (%2)" msgstr "" -#: audioengine.cc:517 +#: audioengine.cc:524 msgid "AudioEngine: backend at \"%1\" has no descriptor function." msgstr "" -#: audioengine.cc:589 +#: audioengine.cc:596 msgid "Could not create backend for %1: %2" msgstr "" -#: audioregion.cc:1643 +#: audioregion.cc:1651 msgid "" "You have requested an operation that requires audio analysis.\n" "\n" @@ -242,11 +242,11 @@ msgstr "" "puedes notar un ligero retraso en ésta y en futuras\n" "operaciones de detección de transitorios.\n" -#: audiosource.cc:199 +#: audiosource.cc:210 msgid "cannot rename peakfile for %1 from %2 to %3 (%4)" msgstr "" -#: audiosource.cc:226 +#: audiosource.cc:239 msgid "AudioSource: cannot stat peakfile \"%1\"" msgstr "" @@ -254,47 +254,68 @@ msgstr "" msgid "cannot read sample data for unscaled peak computation" msgstr "" -#: audiosource.cc:387 +#: audiosource.cc:386 msgid "AudioSource: cannot open peakpath (a) \"%1\" (%2)" msgstr "" -#: audiosource.cc:463 +#: audiosource.cc:395 audiosource.cc:473 +msgid "" +"AudioSource: could not seek to correct location in peak file \"%1\" (%2)" +msgstr "" + +#: audiosource.cc:453 msgid "AudioSource: cannot open peakpath (b) \"%1\" (%2)" msgstr "" -#: audiosource.cc:587 +#: audiosource.cc:567 msgid "" "AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)" msgstr "" -#: audiosource.cc:667 +#: audiosource.cc:634 msgid "%1: could not write read raw data for peak computation (%2)" msgstr "" -#: audiosource.cc:706 +#: audiosource.cc:672 msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)" msgstr "" -#: audiosource.cc:773 audiosource.cc:886 +#: audiosource.cc:739 audiosource.cc:861 +msgid "%1: could not seek in peak file data (%2)" +msgstr "" + +#: audiosource.cc:744 audiosource.cc:870 msgid "%1: could not write peak file data (%2)" msgstr "" -#: audiosource.cc:924 +#: audiosource.cc:903 msgid "could not truncate peakfile %1 to %2 (error: %3)" msgstr "" -#: auditioner.cc:87 +#: auditioner.cc:95 +msgid "Falling back to Reasonable Synth for Midi Audition" +msgstr "" + +#: auditioner.cc:97 +msgid "No synth for midi-audition found." +msgstr "" + +#: auditioner.cc:152 msgid "no outputs available for auditioner - manual connection required" msgstr "No hay salidas disponibles para Audición - se requiere conexión manual" -#: auditioner.cc:135 -msgid "Auditioning of non-audio regions not yet supported" -msgstr "Aún no está soportada la audición de regiones no audio" - -#: auditioner.cc:160 +#: auditioner.cc:392 auditioner.cc:438 msgid "Cannot setup auditioner processing flow for %1 channels" msgstr "" +#: auditioner.cc:426 +msgid "Failed to load synth for MIDI-Audition." +msgstr "" + +#: auditioner.cc:445 +msgid "Auditioning of regions other than Audio or Midi is not supported." +msgstr "" + #: automatable.cc:81 msgid "Automation node has no path property" msgstr "" @@ -332,23 +353,23 @@ msgid "" "AutomationList: passed XML node called %1, not \"AutomationList\" - ignored" msgstr "" -#: butler.cc:91 +#: butler.cc:80 msgid "Cannot create transport request signal pipe (%1)" msgstr "" -#: butler.cc:97 butler.cc:103 +#: butler.cc:86 butler.cc:92 msgid "UI: cannot set O_NONBLOCK on butler request pipe (%1)" msgstr "" -#: butler.cc:109 +#: butler.cc:124 msgid "Session: could not create butler thread" msgstr "" -#: butler.cc:156 +#: butler.cc:165 msgid "poll on butler request pipe failed (%1)" msgstr "" -#: butler.cc:163 +#: butler.cc:172 msgid "Error on butler thread request pipe: fd=%1 err=%2" msgstr "" @@ -356,55 +377,55 @@ msgstr "" msgid "Error reading from butler request pipe" msgstr "" -#: butler.cc:248 +#: butler.cc:301 msgid "Butler read ahead failure on dstream %1" msgstr "" -#: butler.cc:285 +#: butler.cc:338 msgid "Butler write-behind failure on dstream %1" msgstr "" -#: control_protocol_manager.cc:134 +#: control_protocol_manager.cc:164 msgid "control protocol name \"%1\" has no descriptor" msgstr "control protocol name \"%1\" has no descriptor" -#: control_protocol_manager.cc:141 +#: control_protocol_manager.cc:171 msgid "control protocol name \"%1\" could not be initialized" msgstr "El protocolo de control de nombre \"%1\" no se pudo inicializar" -#: control_protocol_manager.cc:201 +#: control_protocol_manager.cc:237 msgid "Instantiating mandatory control protocol %1" msgstr "" -#: control_protocol_manager.cc:222 +#: control_protocol_manager.cc:258 msgid "looking for control protocols in %1\n" msgstr "buscando protocolos de control en %1\n" -#: control_protocol_manager.cc:247 +#: control_protocol_manager.cc:283 msgid "Control protocol %1 not usable" msgstr "Protocolo de control %1 no usable." -#: control_protocol_manager.cc:264 +#: control_protocol_manager.cc:300 msgid "Control surface protocol discovered: \"%1\"\n" msgstr "" -#: control_protocol_manager.cc:282 +#: control_protocol_manager.cc:318 msgid "ControlProtocolManager: cannot load module \"%1\" (%2)" msgstr "" -#: control_protocol_manager.cc:290 +#: control_protocol_manager.cc:324 msgid "ControlProtocolManager: module \"%1\" has no descriptor function." msgstr "" -#: cycle_timer.cc:38 +#: cycle_timer.cc:40 msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo" msgstr "" -#: cycle_timer.cc:50 +#: cycle_timer.cc:52 msgid "CycleTimer::get_mhz(): cannot locate cpu MHz in /proc/cpuinfo" msgstr "" -#: cycle_timer.cc:73 +#: cycle_timer.cc:75 msgid "cannot locate cpu MHz in /proc/cpuinfo" msgstr "" @@ -412,7 +433,7 @@ msgstr "" msgid "audio" msgstr "" -#: data_type.cc:28 session.cc:1791 session.cc:1794 +#: data_type.cc:28 session.cc:1808 session.cc:1811 msgid "MIDI" msgstr "" @@ -420,15 +441,15 @@ msgstr "" msgid "unknown" msgstr "desconocido" -#: delivery.cc:114 +#: delivery.cc:118 msgid "main outs" msgstr "" -#: delivery.cc:117 send.cc:61 +#: delivery.cc:121 send.cc:62 msgid "listen" msgstr "" -#: diskstream.cc:303 +#: diskstream.cc:302 msgid "Location \"%1\" not valid for track loop (start >= end)" msgstr "" "La localización \"%1\" no es válida para bucle de pista (inicio >= fin)" @@ -441,23 +462,23 @@ msgstr "" msgid "Export failed: %1" msgstr "" -#: export_filename.cc:118 +#: export_filename.cc:119 msgid "Existing export folder for this session (%1) does not exist - ignored" msgstr "" -#: export_filename.cc:229 +#: export_filename.cc:230 msgid "No Time" msgstr "" -#: export_filename.cc:238 +#: export_filename.cc:239 msgid "Invalid time format" msgstr "" -#: export_filename.cc:247 +#: export_filename.cc:248 msgid "No Date" msgstr "" -#: export_filename.cc:262 +#: export_filename.cc:263 msgid "Invalid date format" msgstr "" @@ -525,7 +546,7 @@ msgstr "" msgid "Rectangular" msgstr "" -#: export_formats.cc:52 session.cc:5014 session.cc:5030 +#: export_formats.cc:52 session.cc:5006 session.cc:5022 msgid "None" msgstr "" @@ -565,15 +586,15 @@ msgstr "" msgid "No sample format" msgstr "" -#: export_handler.cc:335 +#: export_handler.cc:343 msgid "Editor: cannot open \"%1\" as export file for CD marker file" msgstr "" -#: export_handler.cc:417 export_handler.cc:420 +#: export_handler.cc:425 export_handler.cc:428 msgid "an error occured while writing a TOC/CUE file: %1" msgstr "" -#: export_handler.cc:642 export_handler.cc:700 +#: export_handler.cc:650 export_handler.cc:708 msgid "Cannot convert %1 to Latin-1 text" msgstr "" @@ -635,7 +656,7 @@ msgid "" "configuration" msgstr "" -#: file_source.cc:198 session_state.cc:2807 +#: file_source.cc:198 session_state.cc:2843 msgid "" "there are already 1000 files with names like %1; versioning discontinued" msgstr "ya hay 1000 archivos con nombres como %1; se discontinúa el versionado" @@ -644,38 +665,35 @@ msgstr "ya hay 1000 archivos con nombres como %1; se discontinúa el versionado" msgid "cannot rename file source from %1 to %2 (%3)" msgstr "" -#: file_source.cc:250 file_source.cc:378 +#: file_source.cc:248 file_source.cc:372 msgid "FileSource: search path not set" msgstr "Filesource: ruta de búsqueda no especificada." -#: file_source.cc:313 file_source.cc:448 -msgid "Filesource: cannot find required file (%1): while searching %2" +#: file_source.cc:309 file_source.cc:439 +msgid "Filesource: cannot find required file (%1)" msgstr "" -"Filesource: no se puede encontrar el archivo requerido (%1): al buscar %2." -#: file_source.cc:440 +#: file_source.cc:432 msgid "" -"FileSource: \"%1\" is ambigous when searching %2\n" +"FileSource: \"%1\" is ambigous when searching\n" "\t" msgstr "" -"Filesource: \"%1\" es ambiguo al buscar %2\n" -"\t" -#: file_source.cc:494 +#: file_source.cc:484 msgid "Filesource: cannot find required file (%1): %2" msgstr "Filesource: no se puede encontrar el archivo requerido (%1): %2." -#: file_source.cc:501 +#: file_source.cc:492 msgid "Filesource: cannot check for existing file (%1): %2" msgstr "" -#: file_source.cc:535 +#: file_source.cc:526 msgid "" "Programming error! %1 tried to rename a file over another file! It's safe to " "continue working, but please report this to the developers." msgstr "" -#: file_source.cc:540 +#: file_source.cc:531 msgid "cannot rename file %1 to %2 (%3)" msgstr "" @@ -689,15 +707,15 @@ msgid "" "cannot run" msgstr "" -#: filesystem_paths.cc:91 +#: filesystem_paths.cc:96 msgid "ARDOUR_DLL_PATH not set in environment - exiting\n" msgstr "" -#: filesystem_paths.cc:107 +#: filesystem_paths.cc:125 msgid "ARDOUR_CONFIG_PATH not set in environment - exiting\n" msgstr "" -#: filesystem_paths.cc:127 +#: filesystem_paths.cc:148 msgid "ARDOUR_DATA_PATH not set in environment - exiting\n" msgstr "" @@ -709,87 +727,83 @@ msgstr "" msgid "filter: error creating new file %1 (%2)" msgstr "" -#: find_session.cc:51 -msgid "Could not resolve path: %1 (%2)" -msgstr "" - -#: find_session.cc:63 +#: find_session.cc:59 msgid "cannot check session path %1 (%2)" msgstr "" -#: find_session.cc:89 +#: find_session.cc:85 msgid "cannot check statefile %1 (%2)" msgstr "" -#: find_session.cc:125 +#: find_session.cc:121 msgid "%1 is not a snapshot file" msgstr "%1 no es un archivo de captura de sesión" -#: find_session.cc:142 +#: find_session.cc:138 msgid "cannot determine current working directory (%1)" msgstr "" -#: find_session.cc:159 +#: find_session.cc:155 msgid "unknown file type for session %1" msgstr "tipo de archivo desconocido para la sesión %1" -#: globals.cc:207 +#: globals.cc:216 msgid "Could not set system open files limit to \"unlimited\"" msgstr "No se pudo establecer el lÃmite de archivos abiertos a \"unlimited\"" -#: globals.cc:209 +#: globals.cc:218 msgid "Could not set system open files limit to %1" msgstr "No se pudo establecer el lÃmite de archivos abiertos a \"unlimited\"" -#: globals.cc:213 +#: globals.cc:222 msgid "Your system is configured to limit %1 to only %2 open files" msgstr "" -#: globals.cc:217 +#: globals.cc:226 msgid "Could not get system open files limit (%1)" msgstr "No se pudo obtener el lÃmite de archivos abiertos del sistema (%1) " -#: globals.cc:268 +#: globals.cc:280 msgid "Loading configuration" msgstr "Cargando configuración" -#: import.cc:207 +#: import.cc:208 msgid "Could not find a source for %1 even though we are updating this file!" msgstr "" -#: import.cc:236 +#: import.cc:237 msgid "Unable to create file %1 during import" msgstr "Incapaz de crear el archivo %1 durante la importación" -#: import.cc:262 +#: import.cc:263 msgid "Resampling %1 from %2kHz to %3kHz" msgstr "" -#: import.cc:268 +#: import.cc:269 msgid "Copying %1" msgstr "" -#: import.cc:446 +#: import.cc:455 msgid "Track %1 of %2 contained no usable MIDI data" msgstr "" -#: import.cc:453 +#: import.cc:462 msgid "MIDI file %1 was not readable (no reason available)" msgstr "" -#: import.cc:499 +#: import.cc:508 msgid "Import: cannot open input sound file \"%1\"" msgstr "Importación: No se pudo abrir el archivo de entrada de sonido \"%1\"" -#: import.cc:510 +#: import.cc:519 msgid "Import: error opening MIDI file" msgstr "" -#: import.cc:549 +#: import.cc:558 msgid "Loading MIDI file %1" msgstr "" -#: import.cc:614 +#: import.cc:623 msgid "Failed to remove some files after failed/cancelled import operation" msgstr "" @@ -801,153 +815,153 @@ msgstr "Unknown" msgid "preset %1 (bank %2)" msgstr "" -#: internal_send.cc:278 internal_send.cc:279 +#: internal_send.cc:300 internal_send.cc:301 msgid "%1 - cannot find any track/bus with the ID %2 to connect to" msgstr "" -#: io.cc:208 +#: io.cc:209 msgid "IO: cannot disconnect port %1 from %2" msgstr "" -#: io.cc:343 io.cc:428 +#: io.cc:344 io.cc:431 msgid "IO: cannot register input port %1" msgstr "" -#: io.cc:348 io.cc:433 +#: io.cc:349 io.cc:436 msgid "IO: cannot register output port %1" msgstr "" -#: io.cc:591 io.cc:647 +#: io.cc:598 io.cc:654 msgid "incorrect XML node \"%1\" passed to IO object" msgstr "" -#: io.cc:706 +#: io.cc:713 msgid "in" msgstr "" -#: io.cc:706 +#: io.cc:713 msgid "out" msgstr "" -#: io.cc:707 +#: io.cc:714 msgid "input" msgstr "" -#: io.cc:707 +#: io.cc:714 msgid "output" msgstr "" -#: io.cc:717 +#: io.cc:724 msgid "Unknown bundle \"%1\" listed for %2 of %3" msgstr "" -#: io.cc:783 +#: io.cc:790 msgid "Bundle %1 was not available - \"%2\" used instead" msgstr "" -#: io.cc:786 +#: io.cc:793 msgid "No %1 bundles available as a replacement" msgstr "" -#: io.cc:889 +#: io.cc:896 msgid "%1: cannot create I/O ports" msgstr "%1: no se pueden crear puertos de E/S" -#: io.cc:1017 io.cc:1121 +#: io.cc:1024 io.cc:1128 msgid "IO: badly formed string in XML node for inputs \"%1\"" msgstr "" -#: io.cc:1022 io.cc:1126 +#: io.cc:1029 io.cc:1133 msgid "bad input string in XML node \"%1\"" msgstr "" -#: io.cc:1060 +#: io.cc:1067 msgid "IO: badly formed string in XML node for outputs \"%1\"" msgstr "" -#: io.cc:1065 +#: io.cc:1072 msgid "IO: bad output string in XML node \"%1\"" msgstr "" -#: io.cc:1411 +#: io.cc:1417 #, c-format msgid "%s %u" msgstr "%s %u" -#: io.cc:1458 +#: io.cc:1464 #, c-format msgid "%s in" msgstr "" -#: io.cc:1460 +#: io.cc:1466 #, c-format msgid "%s out" msgstr "" -#: io.cc:1535 session.cc:686 session.cc:715 +#: io.cc:1541 session.cc:689 session.cc:718 msgid "mono" msgstr "" -#: io.cc:1537 session.cc:699 session.cc:729 +#: io.cc:1543 session.cc:702 session.cc:732 msgid "L" msgstr "" -#: io.cc:1537 session.cc:701 session.cc:731 +#: io.cc:1543 session.cc:704 session.cc:734 msgid "R" msgstr "" -#: io.cc:1539 io.cc:1545 +#: io.cc:1545 io.cc:1551 #, c-format msgid "%d" msgstr "" -#: ladspa_plugin.cc:86 +#: ladspa_plugin.cc:93 +msgid "LADSPA: Unable to open module: " +msgstr "" + +#: ladspa_plugin.cc:99 msgid "LADSPA: module has no descriptor function." msgstr "" -#: ladspa_plugin.cc:91 +#: ladspa_plugin.cc:106 msgid "LADSPA: plugin has gone away since discovery!" msgstr "" -#: ladspa_plugin.cc:98 +#: ladspa_plugin.cc:113 msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing" msgstr "" -#: ladspa_plugin.cc:297 +#: ladspa_plugin.cc:311 msgid "" "illegal parameter number used with plugin \"%1\". This may indicate a change " "in the plugin design, and presets may be invalid" msgstr "" -#: ladspa_plugin.cc:376 ladspa_plugin.cc:426 +#: ladspa_plugin.cc:390 ladspa_plugin.cc:440 msgid "Bad node sent to LadspaPlugin::set_state" msgstr "" -#: ladspa_plugin.cc:391 ladspa_plugin.cc:440 +#: ladspa_plugin.cc:405 ladspa_plugin.cc:454 msgid "LADSPA: no ladspa port number" msgstr "" -#: ladspa_plugin.cc:397 ladspa_plugin.cc:446 +#: ladspa_plugin.cc:411 ladspa_plugin.cc:460 msgid "LADSPA: no ladspa port data" msgstr "" -#: ladspa_plugin.cc:717 -msgid "LADSPA: cannot load module from \"%1\"" -msgstr "" - -#: ladspa_plugin.cc:827 +#: ladspa_plugin.cc:840 msgid "Could not locate HOME. Preset not removed." msgstr "" -#: ladspa_plugin.cc:864 ladspa_plugin.cc:870 +#: ladspa_plugin.cc:879 ladspa_plugin.cc:885 msgid "Could not create %1. Preset not saved. (%2)" msgstr "No se pudo crear %1. El preset no se guardó. (%2)" -#: ladspa_plugin.cc:877 +#: ladspa_plugin.cc:892 msgid "Error saving presets file %1." msgstr "Error al guardar el archivo de preset %1." -#: ladspa_plugin.cc:915 +#: ladspa_plugin.cc:934 msgid "Could not locate HOME. Preset not saved." msgstr "" @@ -987,7 +1001,7 @@ msgstr "" msgid "incorrect XML mode passed to Locations::set_state" msgstr "" -#: location.cc:842 session.cc:4516 session_state.cc:1031 +#: location.cc:842 session.cc:4533 session_state.cc:1025 msgid "session" msgstr "sesión" @@ -1044,40 +1058,39 @@ msgid "Session and LTC framerate mismatch: LTC:%1 Session:%2." msgstr "" #: ltc_slave.cc:591 -#, c-format msgid "flywheel" msgstr "" -#: midi_diskstream.cc:167 +#: midi_diskstream.cc:166 msgid "" "%1: I/O configuration change %4 requested to use %2, but channel setup is %3" msgstr "" -#: midi_diskstream.cc:219 +#: midi_diskstream.cc:218 msgid "MidiDiskstream: Playlist \"%1\" isn't a midi playlist" msgstr "" -#: midi_diskstream.cc:270 +#: midi_diskstream.cc:269 msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!" msgstr "" -#: midi_diskstream.cc:699 +#: midi_diskstream.cc:698 msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3" msgstr "" -#: midi_diskstream.cc:834 +#: midi_diskstream.cc:833 msgid "MidiDiskstream %1: cannot write to disk" msgstr "" -#: midi_diskstream.cc:868 +#: midi_diskstream.cc:867 msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!" msgstr "" -#: midi_diskstream.cc:955 +#: midi_diskstream.cc:954 msgid "%1: could not create region for complete midi file" msgstr "" -#: midi_diskstream.cc:992 +#: midi_diskstream.cc:991 msgid "MidiDiskstream: could not create region for captured midi!" msgstr "" @@ -1089,27 +1102,27 @@ msgstr "" msgid "No SysExID found for sys-ex property change - ignored" msgstr "" -#: midi_model.cc:2010 +#: midi_model.cc:2012 msgid "transpose" msgstr "" -#: midi_patch_manager.cc:126 +#: midi_patch_manager.cc:127 msgid "Duplicate MIDI device `%1' in `%2' ignored" msgstr "" -#: midi_source.cc:125 +#: midi_source.cc:124 msgid "Missing parameter property on InterpolationStyle" msgstr "" -#: midi_source.cc:132 +#: midi_source.cc:131 msgid "Missing style property on InterpolationStyle" msgstr "" -#: midi_source.cc:144 +#: midi_source.cc:143 msgid "Missing parameter property on AutomationState" msgstr "" -#: midi_source.cc:151 +#: midi_source.cc:150 msgid "Missing state property on AutomationState" msgstr "" @@ -1153,21 +1166,21 @@ msgstr "" msgid "solo control" msgstr "" -#: mtc_slave.cc:238 +#: mtc_slave.cc:240 msgid "MTC Slave: atomic read of current time failed, sleeping!" msgstr "" -#: mtc_slave.cc:361 +#: mtc_slave.cc:362 msgid "" "Unknown rate/drop value %1 in incoming MTC stream, session values used " "instead" msgstr "" -#: mtc_slave.cc:381 +#: mtc_slave.cc:382 msgid "Session framerate adjusted from %1 TO: MTC's %2." msgstr "" -#: mtc_slave.cc:395 +#: mtc_slave.cc:396 msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3." msgstr "" @@ -1227,31 +1240,35 @@ msgstr "" msgid "Pannable given XML data for %1 - ignored" msgstr "" -#: panner_manager.cc:76 -msgid "looking for panners in %1" +#: panner_manager.cc:80 +msgid "looking for panners in %1\n" msgstr "" -#: panner_manager.cc:100 -msgid "Panner discovered: \"%1\" in %2" +#: panner_manager.cc:108 +msgid "Panner discovered: \"%1\" in %2\n" msgstr "" -#: panner_manager.cc:117 +#: panner_manager.cc:125 msgid "PannerManager: cannot load module \"%1\" (%2)" msgstr "" -#: panner_manager.cc:124 +#: panner_manager.cc:132 msgid "PannerManager: module \"%1\" has no descriptor function." msgstr "" -#: panner_manager.cc:187 +#: panner_manager.cc:219 msgid "no panner discovered for in/out = %1/%2" msgstr "" -#: panner_shell.cc:179 +#: panner_shell.cc:126 +msgid "select panner: %1\n" +msgstr "" + +#: panner_shell.cc:245 msgid "Unknown panner plugin \"%1\" found in pan state - ignored" msgstr "" -#: panner_shell.cc:185 +#: panner_shell.cc:251 msgid "panner plugin node has no type information!" msgstr "" @@ -1271,19 +1288,19 @@ msgstr "" msgid "Could not construct playlist for PlaylistSource from session data!" msgstr "" -#: plugin.cc:324 +#: plugin.cc:328 msgid "" "Plugin presets are not supported in this build of %1. Consider paying for a " "full version" msgstr "" -#: plugin.cc:398 +#: plugin.cc:402 msgid "" "Saving plugin settings is not supported in this build of %1. Consider paying " "for the full version" msgstr "" -#: plugin_insert.cc:598 +#: plugin_insert.cc:589 msgid "programming error: " msgstr "error de programación:" @@ -1319,43 +1336,43 @@ msgstr "" msgid "PluginInsert: automatable control %1 not found - ignored" msgstr "" -#: plugin_manager.cc:161 +#: plugin_manager.cc:165 msgid "Discovering Plugins" msgstr "Descubriendo plugins" -#: plugin_manager.cc:335 +#: plugin_manager.cc:286 msgid "Could not parse rdf file: %1" msgstr "" -#: plugin_manager.cc:374 +#: plugin_manager.cc:330 msgid "LADSPA: cannot load module \"%1\" (%2)" msgstr "" -#: plugin_manager.cc:381 +#: plugin_manager.cc:337 msgid "LADSPA: module \"%1\" has no descriptor function." msgstr "" -#: plugin_manager.cc:602 +#: plugin_manager.cc:567 msgid "" "VST plugin %1 does not support processReplacing, and so cannot be used in %2 " "at this time" msgstr "" -#: plugin_manager.cc:709 +#: plugin_manager.cc:680 msgid "" "linuxVST plugin %1 does not support processReplacing, and so cannot be used " "in %2 at this time" msgstr "" -#: plugin_manager.cc:870 +#: plugin_manager.cc:841 msgid "unknown plugin status type \"%1\" - all entries ignored" msgstr "unknown plugin status type \"%1\" - all entries ignored" -#: plugin_manager.cc:887 +#: plugin_manager.cc:858 msgid "unknown plugin type \"%1\" - ignored" msgstr "Tipo de plugin desconocido \"%1\" - ignorado" -#: port.cc:410 +#: port.cc:412 msgid "could not reregister %1" msgstr "no se pudo registrar %1" @@ -1363,11 +1380,11 @@ msgstr "no se pudo registrar %1" msgid "insert %1" msgstr "insert %1" -#: port_insert.cc:198 +#: port_insert.cc:197 msgid "XML node describing port insert is missing the `type' field" msgstr "" -#: port_insert.cc:203 +#: port_insert.cc:202 msgid "non-port insert XML used for port plugin insert" msgstr "" @@ -1401,11 +1418,11 @@ msgstr "AudioEngine: no se puede conectar %1 (%2) a %3 (%4)" msgid "Re-establising port %1 failed" msgstr "" -#: processor.cc:207 +#: processor.cc:208 msgid "No %1 property flag in element %2" msgstr "" -#: processor.cc:216 +#: processor.cc:217 msgid "No child node with active property" msgstr "" @@ -1473,11 +1490,11 @@ msgstr "" msgid "cannot create new name for region \"%1\"" msgstr "no se puede crear un nuevo nombre para region \"%1\"" -#: resampled_source.cc:98 +#: resampled_source.cc:102 msgid "Import: %1" msgstr "Importar: %1" -#: resampled_source.cc:128 +#: resampled_source.cc:132 srcfilesource.cc:76 msgid "Import: src_new() failed : %1" msgstr "" @@ -1485,27 +1502,27 @@ msgstr "" msgid "return %1" msgstr "retorno %1" -#: route.cc:1075 route.cc:2528 +#: route.cc:1081 route.cc:2541 msgid "unknown Processor type \"%1\"; ignored" msgstr "" -#: route.cc:1087 +#: route.cc:1093 msgid "processor could not be created. Ignored." msgstr "" -#: route.cc:1962 route.cc:2187 +#: route.cc:1975 route.cc:2200 msgid "Bad node sent to Route::set_state() [%1]" msgstr "" -#: route.cc:2022 +#: route.cc:2035 msgid "Pannable state found for route (%1) without a panner!" msgstr "" -#: route.cc:2096 route.cc:2100 route.cc:2301 route.cc:2305 +#: route.cc:2109 route.cc:2113 route.cc:2314 route.cc:2318 msgid "badly formed order key string in state file! [%1] ... ignored." msgstr "" -#: route.cc:2311 +#: route.cc:2324 msgid "Converting deprecated order key for %1 using Editor order %2" msgstr "" @@ -1521,15 +1538,15 @@ msgstr "" msgid "error writing tempo-adjusted data to %1" msgstr "" -#: send.cc:59 +#: send.cc:60 msgid "aux %1" msgstr "" -#: send.cc:63 +#: send.cc:64 msgid "send %1" msgstr "send %1" -#: send.cc:65 +#: send.cc:66 msgid "programming error: send created using role %1" msgstr "" @@ -1553,73 +1570,73 @@ msgstr "" msgid "Set up standard connections" msgstr "Configurar las conexiones estándar" -#: session.cc:635 +#: session.cc:638 msgid "could not setup Click I/O" msgstr "no se pudo configurar la E/S del click" -#: session.cc:683 +#: session.cc:686 #, c-format msgid "out %<PRIu32>" msgstr "" -#: session.cc:697 +#: session.cc:700 #, c-format msgid "out %<PRIu32>+%<PRIu32>" msgstr "" -#: session.cc:712 +#: session.cc:715 #, c-format msgid "in %<PRIu32>" msgstr "" -#: session.cc:726 +#: session.cc:729 #, c-format msgid "in %<PRIu32>+%<PRIu32>" msgstr "" -#: session.cc:790 +#: session.cc:793 msgid "cannot connect master output %1 to %2" msgstr "no se puede conectar salida master %1 a %2" -#: session.cc:849 +#: session.cc:862 msgid "monitor" msgstr "" -#: session.cc:894 +#: session.cc:907 msgid "cannot connect control input %1 to %2" msgstr "" -#: session.cc:914 +#: session.cc:927 msgid "The preferred I/O for the monitor bus (%1) cannot be found" msgstr "" -#: session.cc:945 +#: session.cc:958 msgid "cannot connect control output %1 to %2" msgstr "" -#: session.cc:1009 +#: session.cc:1026 msgid "cannot create Auditioner: no auditioning of regions possible" msgstr "" -#: session.cc:1193 +#: session.cc:1210 msgid "Session: you can't use that location for auto punch (start <= end)" msgstr "" -#: session.cc:1233 +#: session.cc:1250 msgid "" "You cannot use this location for auto-loop because it has zero or negative " "length" msgstr "" -#: session.cc:1547 +#: session.cc:1564 msgid "feedback loop setup between %1 and %2" msgstr "" -#: session.cc:1843 +#: session.cc:1860 msgid "Session: could not create new midi track." msgstr "" -#: session.cc:1849 +#: session.cc:1866 msgid "" "No more JACK ports are available. You will need to stop %1 and restart JACK " "with more ports if you need this many tracks." @@ -1627,75 +1644,75 @@ msgstr "" "JACK no dispone de más puertos. Debes salir de %1 y reiniciar JACK con más " "puertos si necesitas tantas pistas." -#: session.cc:2026 session.cc:2029 +#: session.cc:2043 session.cc:2046 msgid "Audio" msgstr "" -#: session.cc:2053 session.cc:2061 session.cc:2138 session.cc:2146 +#: session.cc:2070 session.cc:2078 session.cc:2155 session.cc:2163 msgid "cannot configure %1 in/%2 out configuration for new audio track" msgstr "" -#: session.cc:2084 +#: session.cc:2101 msgid "Session: could not create new audio track." msgstr "" -#: session.cc:2116 session.cc:2119 +#: session.cc:2133 session.cc:2136 msgid "Bus" msgstr "" -#: session.cc:2169 +#: session.cc:2186 msgid "Session: could not create new audio route." msgstr "Sesión: No se pudo crear la ruta del nuevo audio" -#: session.cc:2228 session.cc:2238 +#: session.cc:2245 session.cc:2255 msgid "Session: UINT_MAX routes? impossible!" msgstr "" -#: session.cc:2260 +#: session.cc:2277 msgid "Session: cannot create track/bus from template description" msgstr "" -#: session.cc:2286 +#: session.cc:2303 msgid "Session: could not create new route from template" msgstr "Sesión: No se pudo crear la nueva ruta desde plantilla" -#: session.cc:2315 +#: session.cc:2332 msgid "Adding new tracks/busses failed" msgstr "" -#: session.cc:3419 +#: session.cc:3436 msgid "FATAL ERROR! Could not find a suitable version of %1 for a rename" msgstr "" -#: session.cc:3539 session.cc:3597 +#: session.cc:3556 session.cc:3614 msgid "There are already %1 recordings for %2, which I consider too many." msgstr "" -#: session.cc:3987 +#: session.cc:4004 msgid "send ID %1 appears to be in use already" msgstr "" -#: session.cc:3999 +#: session.cc:4016 msgid "aux send ID %1 appears to be in use already" msgstr "" -#: session.cc:4011 +#: session.cc:4028 msgid "return ID %1 appears to be in use already" msgstr "" -#: session.cc:4023 +#: session.cc:4040 msgid "insert ID %1 appears to be in use already" msgstr "" -#: session.cc:4150 +#: session.cc:4167 msgid "Cannot write a range where end <= start (e.g. %1 <= %2)" msgstr "" -#: session.cc:4179 +#: session.cc:4196 msgid "too many bounced versions of playlist \"%1\"" msgstr "" -#: session.cc:4189 +#: session.cc:4206 msgid "cannot create new audio file \"%1\" for %2" msgstr "no se puede crear nuevo archivo de audio" @@ -1730,7 +1747,7 @@ msgstr "" msgid "Session subdirectory does not exist at path %1" msgstr "" -#: session_events.cc:184 +#: session_events.cc:185 msgid "Session: cannot have two events of type %1 at the same frame (%2)." msgstr "" @@ -1742,13 +1759,13 @@ msgstr "" msgid "Export ended unexpectedly: %1" msgstr "" -#: session_ltc.cc:222 +#: session_ltc.cc:221 msgid "" "LTC encoder: invalid framerate - LTC encoding is disabled for the remainder " "of this session." msgstr "" -#: session_midi.cc:520 +#: session_midi.cc:519 msgid "Session: cannot send quarter-frame MTC message (%1)" msgstr "" @@ -1760,351 +1777,343 @@ msgstr "" msgid "Session: error in no roll for %1" msgstr "" -#: session_process.cc:1157 +#: session_process.cc:1159 msgid "Programming error: illegal event type in process_event (%1)" msgstr "" -#: session_state.cc:140 -msgid "Could not use path %1 (%2)" -msgstr "" - -#: session_state.cc:184 +#: session_state.cc:178 msgid "solo cut control (dB)" msgstr "" -#: session_state.cc:208 +#: session_state.cc:202 msgid "Set block size and sample rate" msgstr "" -#: session_state.cc:213 +#: session_state.cc:207 msgid "Using configuration" msgstr "" -#: session_state.cc:325 +#: session_state.cc:319 msgid "Reset Remote Controls" msgstr "Restablecer controles remotos" -#: session_state.cc:417 +#: session_state.cc:411 msgid "Session: cannot create session peakfile folder \"%1\" (%2)" msgstr "" -#: session_state.cc:424 +#: session_state.cc:418 msgid "Session: cannot create session sounds dir \"%1\" (%2)" msgstr "" -#: session_state.cc:431 +#: session_state.cc:425 msgid "Session: cannot create session midi dir \"%1\" (%2)" msgstr "" -#: session_state.cc:438 +#: session_state.cc:432 msgid "Session: cannot create session dead sounds folder \"%1\" (%2)" msgstr "" -#: session_state.cc:445 +#: session_state.cc:439 msgid "Session: cannot create session export folder \"%1\" (%2)" msgstr "" -#: session_state.cc:452 +#: session_state.cc:446 msgid "Session: cannot create session analysis folder \"%1\" (%2)" msgstr "" -#: session_state.cc:459 +#: session_state.cc:453 msgid "Session: cannot create session plugins folder \"%1\" (%2)" msgstr "" -#: session_state.cc:466 +#: session_state.cc:460 msgid "Session: cannot create session externals folder \"%1\" (%2)" msgstr "" -#: session_state.cc:480 +#: session_state.cc:474 msgid "Session: cannot create session folder \"%1\" (%2)" msgstr "" -#: session_state.cc:514 +#: session_state.cc:508 msgid "Could not open %1 for writing session template" msgstr "" -#: session_state.cc:520 +#: session_state.cc:514 msgid "Could not open session template %1 for reading" msgstr "" -#: session_state.cc:539 +#: session_state.cc:533 msgid "master" msgstr "" -#: session_state.cc:600 +#: session_state.cc:594 msgid "Could not remove pending capture state at path \"%1\" (%2)" msgstr "Could not remove pending capture state at path \"%1\" (%2)" -#: session_state.cc:624 +#: session_state.cc:618 msgid "could not rename snapshot %1 to %2 (%3)" msgstr "" -#: session_state.cc:652 +#: session_state.cc:646 msgid "Could not remove session file at path \"%1\" (%2)" msgstr "" -#: session_state.cc:669 +#: session_state.cc:663 msgid "" "the %1 audio engine is not connected and state saving would lose all I/O " "connections. Session not saved" msgstr "" -#: session_state.cc:720 +#: session_state.cc:714 msgid "state could not be saved to %1" msgstr "" -#: session_state.cc:722 session_state.cc:733 +#: session_state.cc:716 session_state.cc:727 msgid "Could not remove temporary session file at path \"%1\" (%2)" msgstr "" -#: session_state.cc:730 -msgid "could not rename temporary session file %1 to %2" +#: session_state.cc:724 +msgid "could not rename temporary session file %1 to %2 (%3)" msgstr "" -#: session_state.cc:798 +#: session_state.cc:792 msgid "%1: session file \"%2\" doesn't exist!" msgstr "" -#: session_state.cc:810 +#: session_state.cc:804 msgid "Could not understand session file %1" msgstr "" -#: session_state.cc:819 +#: session_state.cc:813 msgid "Session file %1 is not a session" msgstr "El archivo de sesión %1 no es una sesión" -#: session_state.cc:1125 +#: session_state.cc:1119 msgid "programming error: Session: incorrect XML node sent to set_state()" msgstr "" -#: session_state.cc:1179 +#: session_state.cc:1173 msgid "Session: XML state has no options section" msgstr "" -#: session_state.cc:1184 +#: session_state.cc:1178 msgid "Session: XML state has no metadata section" msgstr "" -#: session_state.cc:1195 +#: session_state.cc:1189 msgid "Session: XML state has no sources section" msgstr "" -#: session_state.cc:1202 +#: session_state.cc:1196 msgid "Session: XML state has no Tempo Map section" msgstr "" -#: session_state.cc:1209 +#: session_state.cc:1203 msgid "Session: XML state has no locations section" msgstr "" -#: session_state.cc:1235 +#: session_state.cc:1229 msgid "Session: XML state has no Regions section" msgstr "" -#: session_state.cc:1242 +#: session_state.cc:1236 msgid "Session: XML state has no playlists section" msgstr "" -#: session_state.cc:1262 +#: session_state.cc:1256 msgid "Session: XML state has no bundles section" msgstr "" -#: session_state.cc:1274 +#: session_state.cc:1268 msgid "Session: XML state has no diskstreams section" msgstr "" -#: session_state.cc:1282 +#: session_state.cc:1276 msgid "Session: XML state has no routes section" msgstr "" -#: session_state.cc:1294 +#: session_state.cc:1288 msgid "Session: XML state has no route groups section" msgstr "" -#: session_state.cc:1303 +#: session_state.cc:1297 msgid "Session: XML state has no edit groups section" msgstr "" -#: session_state.cc:1310 +#: session_state.cc:1304 msgid "Session: XML state has no mix groups section" msgstr "" -#: session_state.cc:1318 +#: session_state.cc:1312 msgid "Session: XML state has no click section" msgstr "" -#: session_state.cc:1360 +#: session_state.cc:1354 msgid "Session: cannot create Route from XML description." msgstr "" -#: session_state.cc:1364 +#: session_state.cc:1358 msgid "Loaded track/bus %1" msgstr "Pista/bus %1 cargado" -#: session_state.cc:1462 +#: session_state.cc:1456 msgid "Could not find diskstream for route" msgstr "" -#: session_state.cc:1516 +#: session_state.cc:1510 msgid "Session: cannot create Region from XML description." msgstr "" -#: session_state.cc:1520 +#: session_state.cc:1514 msgid "Can not load state for region '%1'" msgstr "No se puede cargar el estado de la región '%1'" -#: session_state.cc:1556 +#: session_state.cc:1550 msgid "Regions in compound description not found (ID's %1 and %2): ignored" msgstr "" -#: session_state.cc:1584 +#: session_state.cc:1578 msgid "Nested source has no ID info in session file! (ignored)" msgstr "" -#: session_state.cc:1596 +#: session_state.cc:1590 msgid "Cannot reconstruct nested source for region %1" msgstr "" -#: session_state.cc:1658 +#: session_state.cc:1652 msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)" msgstr "" -#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707 +#: session_state.cc:1660 session_state.cc:1681 session_state.cc:1701 msgid "" "Session: XMLNode describing a AudioRegion references an unknown source id =%1" msgstr "" -#: session_state.cc:1672 session_state.cc:1693 session_state.cc:1713 +#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707 msgid "" "Session: XMLNode describing a AudioRegion references a non-audio source id =" "%1" msgstr "" -#: session_state.cc:1736 +#: session_state.cc:1730 msgid "" "Session: XMLNode describing an AudioRegion is missing some master sources; " "ignored" msgstr "" -#: session_state.cc:1770 +#: session_state.cc:1764 msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)" msgstr "" -#: session_state.cc:1778 +#: session_state.cc:1772 msgid "" "Session: XMLNode describing a MidiRegion references an unknown source id =%1" msgstr "" -#: session_state.cc:1784 +#: session_state.cc:1778 msgid "" "Session: XMLNode describing a MidiRegion references a non-midi source id =%1" msgstr "" -#: session_state.cc:1852 +#: session_state.cc:1846 msgid "" "cannot create new file from region name \"%1\" with ident = \"%2\": too many " "existing files with similar names" msgstr "" -#: session_state.cc:1875 +#: session_state.cc:1869 msgid "Session: cannot create Source from XML description." msgstr "" -#: session_state.cc:1909 +#: session_state.cc:1903 msgid "A sound file is missing. It will be replaced by silence." msgstr "No se encuentra un archivo de audio. Será reemplazado por silencio." -#: session_state.cc:1932 +#: session_state.cc:1926 msgid "Found a sound file that cannot be used by %1. Talk to the progammers." msgstr "Found a sound file that cannot be used by %1. Talk to the progammers." -#: session_state.cc:1949 +#: session_state.cc:1943 msgid "Could not create templates directory \"%1\" (%2)" msgstr "" -#: session_state.cc:1962 +#: session_state.cc:1956 msgid "Template \"%1\" already exists - new version not created" msgstr "La plantilla \"%1\" ya existe - no se creará una nueva versión" -#: session_state.cc:1968 +#: session_state.cc:1962 msgid "Could not create directory for Session template\"%1\" (%2)" msgstr "Could not create directory for Session template\"%1\" (%2)" -#: session_state.cc:1978 +#: session_state.cc:1972 msgid "template not saved" msgstr "plantilla no guardada" -#: session_state.cc:1988 +#: session_state.cc:1982 msgid "Could not create directory for Session template plugin state\"%1\" (%2)" msgstr "" "Could not create directory for Session template plugin state\"%1\" (%2)" -#: session_state.cc:2183 +#: session_state.cc:2225 msgid "Unknown node \"%1\" found in Bundles list from session file" msgstr "" -#: session_state.cc:2725 session_state.cc:2731 -msgid "Cannot expand path %1 (%2)" -msgstr "" - -#: session_state.cc:2784 +#: session_state.cc:2820 msgid "Session: cannot create dead file folder \"%1\" (%2)" msgstr "" -#: session_state.cc:2823 +#: session_state.cc:2859 msgid "cannot rename unused file source from %1 to %2 (%3)" msgstr "" -#: session_state.cc:2841 +#: session_state.cc:2877 msgid "cannot remove peakfile %1 for %2 (%3)" msgstr "" -#: session_state.cc:3143 +#: session_state.cc:3179 msgid "could not backup old history file, current history not saved" msgstr "" -#: session_state.cc:3156 +#: session_state.cc:3192 msgid "history could not be saved to %1" msgstr "No se pudo guardar el historial a %1" -#: session_state.cc:3159 +#: session_state.cc:3195 msgid "Could not remove history file at path \"%1\" (%2)" msgstr "Could not remove history file at path \"%1\" (%2)" -#: session_state.cc:3163 +#: session_state.cc:3199 msgid "could not restore history file from backup %1 (%2)" msgstr "" -#: session_state.cc:3188 +#: session_state.cc:3224 msgid "%1: no history file \"%2\" for this session." msgstr "" -#: session_state.cc:3194 +#: session_state.cc:3230 msgid "Could not understand session history file \"%1\"" msgstr "No se pudo interpretar el archivo de historial de sesión \"%1\"." -#: session_state.cc:3236 +#: session_state.cc:3272 msgid "Failed to downcast MidiSource for NoteDiffCommand" msgstr "" -#: session_state.cc:3247 +#: session_state.cc:3283 msgid "Failed to downcast MidiSource for SysExDiffCommand" msgstr "" -#: session_state.cc:3258 +#: session_state.cc:3294 msgid "Failed to downcast MidiSource for PatchChangeDiffCommand" msgstr "" -#: session_state.cc:3266 +#: session_state.cc:3302 msgid "Couldn't figure out how to make a Command out of a %1 XMLNode." msgstr "" -#: session_state.cc:3502 +#: session_state.cc:3538 msgid "Session: unknown diskstream type in XML" msgstr "" -#: session_state.cc:3507 +#: session_state.cc:3543 msgid "Session: could not load diskstream via XML state" msgstr "" @@ -2128,198 +2137,206 @@ msgid "" "control" msgstr "" -#: smf_source.cc:252 +#: smf_source.cc:262 msgid "Unable to read event prefix, corrupt MIDI ring" msgstr "" -#: smf_source.cc:265 +#: smf_source.cc:275 msgid "Event has time and size but no body, corrupt MIDI ring" msgstr "" -#: smf_source.cc:271 +#: smf_source.cc:281 msgid "Event time is before MIDI source position" msgstr "" -#: smf_source.cc:306 smf_source.cc:345 +#: smf_source.cc:316 smf_source.cc:355 msgid "Skipping event with unordered time %1" msgstr "" -#: smf_source.cc:410 +#: smf_source.cc:420 msgid "cannot open MIDI file %1 for write" msgstr "" -#: sndfile_helpers.cc:32 +#: sndfile_helpers.cc:34 msgid "WAV" msgstr "WAV" -#: sndfile_helpers.cc:33 +#: sndfile_helpers.cc:35 msgid "AIFF" msgstr "AIFF" -#: sndfile_helpers.cc:34 +#: sndfile_helpers.cc:36 msgid "CAF" msgstr "CAF" -#: sndfile_helpers.cc:35 +#: sndfile_helpers.cc:37 msgid "W64 (64 bit WAV)" msgstr "W64 (64 bit WAV)" -#: sndfile_helpers.cc:36 +#: sndfile_helpers.cc:38 msgid "FLAC" msgstr "" -#: sndfile_helpers.cc:37 +#: sndfile_helpers.cc:39 msgid "Ogg/Vorbis" msgstr "" -#: sndfile_helpers.cc:38 +#: sndfile_helpers.cc:40 msgid "raw (no header)" msgstr "raw (sin encabezado)" -#: sndfile_helpers.cc:43 +#: sndfile_helpers.cc:45 msgid ".wav" msgstr ".wav" -#: sndfile_helpers.cc:44 +#: sndfile_helpers.cc:46 msgid ".aiff" msgstr ".aiff" -#: sndfile_helpers.cc:45 +#: sndfile_helpers.cc:47 msgid ".caf" msgstr ".caf" -#: sndfile_helpers.cc:46 +#: sndfile_helpers.cc:48 msgid ".w64" msgstr ".w64" -#: sndfile_helpers.cc:47 +#: sndfile_helpers.cc:49 msgid ".flac" msgstr ".flac" -#: sndfile_helpers.cc:48 +#: sndfile_helpers.cc:50 msgid ".ogg" msgstr "" -#: sndfile_helpers.cc:49 +#: sndfile_helpers.cc:51 msgid ".raw" msgstr ".raw" -#: sndfile_helpers.cc:64 +#: sndfile_helpers.cc:66 msgid "Signed 16 bit PCM" msgstr "" -#: sndfile_helpers.cc:65 +#: sndfile_helpers.cc:67 msgid "Signed 24 bit PCM" msgstr "" -#: sndfile_helpers.cc:66 +#: sndfile_helpers.cc:68 msgid "Signed 32 bit PCM" msgstr "" -#: sndfile_helpers.cc:67 +#: sndfile_helpers.cc:69 msgid "Signed 8 bit PCM" msgstr "" -#: sndfile_helpers.cc:68 +#: sndfile_helpers.cc:70 msgid "32 bit float" msgstr "" -#: sndfile_helpers.cc:81 +#: sndfile_helpers.cc:83 msgid "Little-endian (Intel)" msgstr "Little-endian (Intel)" -#: sndfile_helpers.cc:82 +#: sndfile_helpers.cc:84 msgid "Big-endian (PowerPC)" msgstr "Big-endian (PowerPC)" -#: sndfilesource.cc:201 +#: sndfilesource.cc:210 msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)" msgstr "" -#: sndfilesource.cc:209 +#: sndfilesource.cc:218 msgid "" "SndFileSource: file only contains %1 channels; %2 is invalid as a channel " "number" msgstr "" -#: sndfilesource.cc:255 sndfilesource.cc:571 sndfilesource.cc:595 +#: sndfilesource.cc:264 sndfilesource.cc:604 sndfilesource.cc:628 msgid "" "cannot set broadcast info for audio file %1 (%2); dropping broadcast info " "for this file" msgstr "" -#: sndfilesource.cc:302 +#: sndfilesource.cc:311 msgid "could not allocate file %1 for reading." msgstr "" -#: sndfilesource.cc:337 +#: sndfilesource.cc:346 msgid "SndFileSource: could not seek to frame %1 within %2 (%3)" msgstr "" -#: sndfilesource.cc:347 +#: sndfilesource.cc:356 msgid "" "SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)" msgstr "" -#: sndfilesource.cc:391 sndfilesource.cc:420 +#: sndfilesource.cc:400 sndfilesource.cc:429 msgid "attempt to write a non-writable audio file source (%1)" msgstr "" -#: sndfilesource.cc:396 utils.cc:510 utils.cc:534 utils.cc:548 utils.cc:567 +#: sndfilesource.cc:405 utils.cc:547 utils.cc:571 utils.cc:585 utils.cc:604 msgid "programming error: %1 %2" msgstr "error de programación: %1 %2" -#: sndfilesource.cc:523 +#: sndfilesource.cc:532 sndfilesource.cc:562 msgid "attempt to flush a non-writable audio file source (%1)" msgstr "" -#: sndfilesource.cc:528 +#: sndfilesource.cc:537 sndfilesource.cc:557 msgid "attempt to flush an un-opened audio file source (%1)" msgstr "" -#: sndfilesource.cc:534 +#: sndfilesource.cc:543 msgid "could not allocate file %1 to write header" msgstr "" -#: sndfilesource.cc:548 +#: sndfilesource.cc:568 +msgid "could not allocate file %1 to flush contents" +msgstr "" + +#: sndfilesource.cc:581 msgid "" "attempt to store broadcast info in a non-writable audio file source (%1)" msgstr "" -#: sndfilesource.cc:553 +#: sndfilesource.cc:586 msgid "attempt to set BWF info for an un-opened audio file source (%1)" msgstr "" -#: sndfilesource.cc:614 +#: sndfilesource.cc:647 msgid "%1: cannot seek to %2 (libsndfile error: %3)" msgstr "" -#: sndfilesource.cc:727 +#: sndfilesource.cc:760 msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)" msgstr "" -#: sndfilesource.cc:740 sndfilesource.cc:790 sndfilesource.cc:797 +#: sndfilesource.cc:773 sndfilesource.cc:823 sndfilesource.cc:830 msgid "SndFileSource: \"%1\" bad write (%2)" msgstr "" -#: sndfilesource.cc:820 +#: sndfilesource.cc:853 msgid "" "Filesource: start time is already set for existing file (%1): Cannot change " "start time." msgstr "" -#: speakers.cc:239 +#: speakers.cc:280 msgid "Speaker information is missing azimuth - speaker ignored" msgstr "" -#: speakers.cc:245 +#: speakers.cc:286 msgid "Speaker information is missing elevation - speaker ignored" msgstr "" -#: speakers.cc:251 +#: speakers.cc:292 msgid "Speaker information is missing distance - speaker ignored" msgstr "" +#: srcfilesource.cc:135 +msgid "SrcFileSource: %1" +msgstr "" + #: tape_file_matcher.cc:46 msgid "Cannot compile tape track regexp for use (%1)" msgstr "" @@ -2467,54 +2484,68 @@ msgstr "" msgid "Node for Port has no \"name\" property" msgstr "" -#: utils.cc:358 utils.cc:382 +#: utils.cc:395 utils.cc:419 msgid "Splice" msgstr "Reunir" -#: utils.cc:360 utils.cc:375 +#: utils.cc:397 utils.cc:412 msgid "Slide" msgstr "Deslizar" -#: utils.cc:362 utils.cc:378 +#: utils.cc:399 utils.cc:415 msgid "Lock" msgstr "Bloquear" -#: utils.cc:365 +#: utils.cc:402 msgid "programming error: unknown edit mode string \"%1\"" msgstr "" -#: utils.cc:389 utils.cc:421 +#: utils.cc:426 utils.cc:458 msgid "MIDI Timecode" msgstr "" -#: utils.cc:389 utils.cc:419 +#: utils.cc:426 utils.cc:456 msgid "MTC" msgstr "MTC" -#: utils.cc:393 utils.cc:428 +#: utils.cc:430 utils.cc:465 msgid "MIDI Clock" msgstr "" -#: utils.cc:397 utils.cc:415 utils.cc:435 +#: utils.cc:434 utils.cc:452 utils.cc:472 msgid "JACK" msgstr "JACK" -#: utils.cc:401 +#: utils.cc:438 msgid "programming error: unknown sync source string \"%1\"" msgstr "" -#: utils.cc:426 +#: utils.cc:463 msgid "M-Clock" msgstr "" -#: utils.cc:432 +#: utils.cc:469 msgid "LTC" msgstr "LTC" -#: utils.cc:602 +#: utils.cc:639 msgid "programming error: unknown native header format: %1" msgstr "" -#: utils.cc:617 +#: utils.cc:654 msgid "cannot open directory %1 (%2)" msgstr "" + +#~ msgid "Auditioning of non-audio regions not yet supported" +#~ msgstr "Aún no está soportada la audición de regiones no audio" + +#~ msgid "Filesource: cannot find required file (%1): while searching %2" +#~ msgstr "" +#~ "Filesource: no se puede encontrar el archivo requerido (%1): al buscar %2." + +#~ msgid "" +#~ "FileSource: \"%1\" is ambigous when searching %2\n" +#~ "\t" +#~ msgstr "" +#~ "Filesource: \"%1\" es ambiguo al buscar %2\n" +#~ "\t" diff --git a/libs/ardour/po/it.po b/libs/ardour/po/it.po index 9eaa00ee95..5068b67419 100644 --- a/libs/ardour/po/it.po +++ b/libs/ardour/po/it.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: libardour 0.664.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-11-05 11:11-0500\n" +"POT-Creation-Date: 2014-02-10 17:53+0100\n" "PO-Revision-Date: 2003-05-21 12:50+0500\n" "Last-Translator: Filippo Pappalardo <filippo@email.it>\n" "Language-Team: Italian\n" @@ -20,64 +20,64 @@ msgstr "" msgid "Fader" msgstr "" -#: audio_diskstream.cc:244 +#: audio_diskstream.cc:242 msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist" msgstr "" -#: audio_diskstream.cc:296 +#: audio_diskstream.cc:294 msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!" msgstr "" -#: audio_diskstream.cc:848 audio_diskstream.cc:858 +#: audio_diskstream.cc:846 audio_diskstream.cc:856 msgid "" "AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3" msgstr "" -#: audio_diskstream.cc:1014 +#: audio_diskstream.cc:1012 msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3" msgstr "" -#: audio_diskstream.cc:1383 audio_diskstream.cc:1400 +#: audio_diskstream.cc:1381 audio_diskstream.cc:1398 msgid "AudioDiskstream %1: cannot write to disk" msgstr "" -#: audio_diskstream.cc:1443 +#: audio_diskstream.cc:1441 msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!" msgstr "" -#: audio_diskstream.cc:1537 +#: audio_diskstream.cc:1535 msgid "%1: could not create region for complete audio file" msgstr "%1: impossibile creare una regione per il file audio completo" -#: audio_diskstream.cc:1571 +#: audio_diskstream.cc:1569 msgid "AudioDiskstream: could not create region for captured audio!" msgstr "" -#: audio_diskstream.cc:1679 +#: audio_diskstream.cc:1677 msgid "programmer error: %1" msgstr "" -#: audio_diskstream.cc:1905 +#: audio_diskstream.cc:1903 msgid "AudioDiskstream: channel %1 out of range" msgstr "" -#: audio_diskstream.cc:1919 midi_diskstream.cc:1210 +#: audio_diskstream.cc:1917 midi_diskstream.cc:1209 msgid "%1:%2 new capture file not initialized correctly" msgstr "%1:%2 nuovo file di registrazione non è stato avviato correttamente" -#: audio_diskstream.cc:2200 +#: audio_diskstream.cc:2198 msgid "%1: cannot restore pending capture source file %2" msgstr "" -#: audio_diskstream.cc:2222 +#: audio_diskstream.cc:2220 msgid "%1: incorrect number of pending sources listed - ignoring them all" msgstr "" -#: audio_diskstream.cc:2246 +#: audio_diskstream.cc:2244 msgid "%1: cannot create whole-file region from pending capture sources" msgstr "" -#: audio_library.cc:71 +#: audio_library.cc:81 msgid "Could not open %1. Audio Library not saved" msgstr "Impossibile accedere a %1. Libreria Audio non salvata" @@ -117,11 +117,11 @@ msgstr "" msgid "Audio Playlists (unused)" msgstr "" -#: audio_playlist_source.cc:171 audiosource.cc:913 file_source.cc:529 +#: audio_playlist_source.cc:171 audiosource.cc:891 file_source.cc:520 #: midi_playlist_source.cc:144 midi_playlist_source.cc:152 -#: midi_playlist_source.cc:159 midi_source.cc:371 plugin_insert.cc:643 -#: rb_effect.cc:333 session.cc:2619 session.cc:2652 session.cc:3797 -#: session_handle.cc:87 sndfilesource.cc:121 +#: midi_playlist_source.cc:159 midi_source.cc:370 plugin_insert.cc:634 +#: rb_effect.cc:333 session.cc:2636 session.cc:2669 session.cc:3814 +#: session_handle.cc:87 sndfilesource.cc:122 msgid "programming error: %1" msgstr "errore di programmazione: %1" @@ -145,23 +145,23 @@ msgid "" "Channels: " msgstr "" -#: audio_track.cc:167 +#: audio_track.cc:161 msgid "Unknown bundle \"%1\" listed for input of %2" msgstr "" -#: audio_track.cc:169 +#: audio_track.cc:163 msgid "in 1" msgstr "" -#: audio_track.cc:170 +#: audio_track.cc:164 msgid "No input bundles available as a replacement" msgstr "" -#: audio_track.cc:174 +#: audio_track.cc:168 msgid "Bundle %1 was not available - \"in 1\" used instead" msgstr "" -#: audio_track.cc:183 +#: audio_track.cc:177 msgid "improper input channel list in XML node (%1)" msgstr "" @@ -185,23 +185,23 @@ msgstr "" msgid "VAMP Plugin \"%1\" could not be loaded" msgstr "" -#: audioengine.cc:488 +#: audioengine.cc:495 msgid "looking for backends in %1\n" msgstr "" -#: audioengine.cc:511 +#: audioengine.cc:518 msgid "AudioEngine: cannot load module \"%1\" (%2)" msgstr "" -#: audioengine.cc:517 +#: audioengine.cc:524 msgid "AudioEngine: backend at \"%1\" has no descriptor function." msgstr "" -#: audioengine.cc:589 +#: audioengine.cc:596 msgid "Could not create backend for %1: %2" msgstr "" -#: audioregion.cc:1643 +#: audioregion.cc:1651 msgid "" "You have requested an operation that requires audio analysis.\n" "\n" @@ -216,11 +216,11 @@ msgid "" "this and future transient-detection operations.\n" msgstr "" -#: audiosource.cc:199 +#: audiosource.cc:210 msgid "cannot rename peakfile for %1 from %2 to %3 (%4)" msgstr "" -#: audiosource.cc:226 +#: audiosource.cc:239 msgid "AudioSource: cannot stat peakfile \"%1\"" msgstr "" @@ -228,47 +228,68 @@ msgstr "" msgid "cannot read sample data for unscaled peak computation" msgstr "" -#: audiosource.cc:387 +#: audiosource.cc:386 msgid "AudioSource: cannot open peakpath (a) \"%1\" (%2)" msgstr "" -#: audiosource.cc:463 +#: audiosource.cc:395 audiosource.cc:473 +msgid "" +"AudioSource: could not seek to correct location in peak file \"%1\" (%2)" +msgstr "" + +#: audiosource.cc:453 msgid "AudioSource: cannot open peakpath (b) \"%1\" (%2)" msgstr "" -#: audiosource.cc:587 +#: audiosource.cc:567 msgid "" "AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)" msgstr "" -#: audiosource.cc:667 +#: audiosource.cc:634 msgid "%1: could not write read raw data for peak computation (%2)" msgstr "" -#: audiosource.cc:706 +#: audiosource.cc:672 msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)" msgstr "" -#: audiosource.cc:773 audiosource.cc:886 +#: audiosource.cc:739 audiosource.cc:861 +msgid "%1: could not seek in peak file data (%2)" +msgstr "" + +#: audiosource.cc:744 audiosource.cc:870 msgid "%1: could not write peak file data (%2)" msgstr "" -#: audiosource.cc:924 +#: audiosource.cc:903 msgid "could not truncate peakfile %1 to %2 (error: %3)" msgstr "" -#: auditioner.cc:87 -msgid "no outputs available for auditioner - manual connection required" +#: auditioner.cc:95 +msgid "Falling back to Reasonable Synth for Midi Audition" +msgstr "" + +#: auditioner.cc:97 +msgid "No synth for midi-audition found." msgstr "" -#: auditioner.cc:135 -msgid "Auditioning of non-audio regions not yet supported" +#: auditioner.cc:152 +msgid "no outputs available for auditioner - manual connection required" msgstr "" -#: auditioner.cc:160 +#: auditioner.cc:392 auditioner.cc:438 msgid "Cannot setup auditioner processing flow for %1 channels" msgstr "" +#: auditioner.cc:426 +msgid "Failed to load synth for MIDI-Audition." +msgstr "" + +#: auditioner.cc:445 +msgid "Auditioning of regions other than Audio or Midi is not supported." +msgstr "" + #: automatable.cc:81 msgid "Automation node has no path property" msgstr "" @@ -304,23 +325,23 @@ msgid "" "AutomationList: passed XML node called %1, not \"AutomationList\" - ignored" msgstr "" -#: butler.cc:91 +#: butler.cc:80 msgid "Cannot create transport request signal pipe (%1)" msgstr "" -#: butler.cc:97 butler.cc:103 +#: butler.cc:86 butler.cc:92 msgid "UI: cannot set O_NONBLOCK on butler request pipe (%1)" msgstr "" -#: butler.cc:109 +#: butler.cc:124 msgid "Session: could not create butler thread" msgstr "" -#: butler.cc:156 +#: butler.cc:165 msgid "poll on butler request pipe failed (%1)" msgstr "" -#: butler.cc:163 +#: butler.cc:172 msgid "Error on butler thread request pipe: fd=%1 err=%2" msgstr "" @@ -328,56 +349,56 @@ msgstr "" msgid "Error reading from butler request pipe" msgstr "" -#: butler.cc:248 +#: butler.cc:301 msgid "Butler read ahead failure on dstream %1" msgstr "" -#: butler.cc:285 +#: butler.cc:338 msgid "Butler write-behind failure on dstream %1" msgstr "" -#: control_protocol_manager.cc:134 +#: control_protocol_manager.cc:164 msgid "control protocol name \"%1\" has no descriptor" msgstr "" -#: control_protocol_manager.cc:141 +#: control_protocol_manager.cc:171 msgid "control protocol name \"%1\" could not be initialized" msgstr "" -#: control_protocol_manager.cc:201 +#: control_protocol_manager.cc:237 msgid "Instantiating mandatory control protocol %1" msgstr "" -#: control_protocol_manager.cc:222 +#: control_protocol_manager.cc:258 msgid "looking for control protocols in %1\n" msgstr "" -#: control_protocol_manager.cc:247 +#: control_protocol_manager.cc:283 msgid "Control protocol %1 not usable" msgstr "" -#: control_protocol_manager.cc:264 +#: control_protocol_manager.cc:300 msgid "Control surface protocol discovered: \"%1\"\n" msgstr "" -#: control_protocol_manager.cc:282 +#: control_protocol_manager.cc:318 msgid "ControlProtocolManager: cannot load module \"%1\" (%2)" msgstr "" -#: control_protocol_manager.cc:290 +#: control_protocol_manager.cc:324 msgid "ControlProtocolManager: module \"%1\" has no descriptor function." msgstr "" -#: cycle_timer.cc:38 +#: cycle_timer.cc:40 msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo" msgstr "CycleTimer::get_mhz(): impossibile accedere a /proc/cpuinfo" -#: cycle_timer.cc:50 +#: cycle_timer.cc:52 msgid "CycleTimer::get_mhz(): cannot locate cpu MHz in /proc/cpuinfo" msgstr "" "CycleTimer::get_mhz(): impossibile localizzare \"cpu MHz\" in /proc/cpuinfo" -#: cycle_timer.cc:73 +#: cycle_timer.cc:75 msgid "cannot locate cpu MHz in /proc/cpuinfo" msgstr "impossibile localizzare \"cpu MHz\" in /proc/cpuinfo" @@ -385,7 +406,7 @@ msgstr "impossibile localizzare \"cpu MHz\" in /proc/cpuinfo" msgid "audio" msgstr "" -#: data_type.cc:28 session.cc:1791 session.cc:1794 +#: data_type.cc:28 session.cc:1808 session.cc:1811 msgid "MIDI" msgstr "" @@ -393,15 +414,15 @@ msgstr "" msgid "unknown" msgstr "" -#: delivery.cc:114 +#: delivery.cc:118 msgid "main outs" msgstr "" -#: delivery.cc:117 send.cc:61 +#: delivery.cc:121 send.cc:62 msgid "listen" msgstr "" -#: diskstream.cc:303 +#: diskstream.cc:302 msgid "Location \"%1\" not valid for track loop (start >= end)" msgstr "La Location \"%1\" non valida per il loop (inizio >= fine)" @@ -413,23 +434,23 @@ msgstr "" msgid "Export failed: %1" msgstr "" -#: export_filename.cc:118 +#: export_filename.cc:119 msgid "Existing export folder for this session (%1) does not exist - ignored" msgstr "" -#: export_filename.cc:229 +#: export_filename.cc:230 msgid "No Time" msgstr "" -#: export_filename.cc:238 +#: export_filename.cc:239 msgid "Invalid time format" msgstr "" -#: export_filename.cc:247 +#: export_filename.cc:248 msgid "No Date" msgstr "" -#: export_filename.cc:262 +#: export_filename.cc:263 msgid "Invalid date format" msgstr "" @@ -497,7 +518,7 @@ msgstr "" msgid "Rectangular" msgstr "" -#: export_formats.cc:52 session.cc:5014 session.cc:5030 +#: export_formats.cc:52 session.cc:5006 session.cc:5022 msgid "None" msgstr "" @@ -537,15 +558,15 @@ msgstr "" msgid "No sample format" msgstr "" -#: export_handler.cc:335 +#: export_handler.cc:343 msgid "Editor: cannot open \"%1\" as export file for CD marker file" msgstr "" -#: export_handler.cc:417 export_handler.cc:420 +#: export_handler.cc:425 export_handler.cc:428 msgid "an error occured while writing a TOC/CUE file: %1" msgstr "" -#: export_handler.cc:642 export_handler.cc:700 +#: export_handler.cc:650 export_handler.cc:708 msgid "Cannot convert %1 to Latin-1 text" msgstr "" @@ -607,7 +628,7 @@ msgid "" "configuration" msgstr "" -#: file_source.cc:198 session_state.cc:2807 +#: file_source.cc:198 session_state.cc:2843 msgid "" "there are already 1000 files with names like %1; versioning discontinued" msgstr "" @@ -617,37 +638,35 @@ msgstr "" msgid "cannot rename file source from %1 to %2 (%3)" msgstr "" -#: file_source.cc:250 file_source.cc:378 +#: file_source.cc:248 file_source.cc:372 msgid "FileSource: search path not set" msgstr "FileSource: percorso di ricerca non specificato" -#: file_source.cc:313 file_source.cc:448 -msgid "Filesource: cannot find required file (%1): while searching %2" +#: file_source.cc:309 file_source.cc:439 +msgid "Filesource: cannot find required file (%1)" msgstr "" -#: file_source.cc:440 +#: file_source.cc:432 msgid "" -"FileSource: \"%1\" is ambigous when searching %2\n" +"FileSource: \"%1\" is ambigous when searching\n" "\t" msgstr "" -"FileSource: \"%1\" è risultato ambiguo nel cercare %2\n" -"\t" -#: file_source.cc:494 +#: file_source.cc:484 msgid "Filesource: cannot find required file (%1): %2" msgstr "FileSource: impossibile trovare il file richiesto (%1): %2" -#: file_source.cc:501 +#: file_source.cc:492 msgid "Filesource: cannot check for existing file (%1): %2" msgstr "FileSource: impossibile controllare il file esistente (%1): %2" -#: file_source.cc:535 +#: file_source.cc:526 msgid "" "Programming error! %1 tried to rename a file over another file! It's safe to " "continue working, but please report this to the developers." msgstr "" -#: file_source.cc:540 +#: file_source.cc:531 msgid "cannot rename file %1 to %2 (%3)" msgstr "" @@ -661,15 +680,15 @@ msgid "" "cannot run" msgstr "" -#: filesystem_paths.cc:91 +#: filesystem_paths.cc:96 msgid "ARDOUR_DLL_PATH not set in environment - exiting\n" msgstr "" -#: filesystem_paths.cc:107 +#: filesystem_paths.cc:125 msgid "ARDOUR_CONFIG_PATH not set in environment - exiting\n" msgstr "" -#: filesystem_paths.cc:127 +#: filesystem_paths.cc:148 msgid "ARDOUR_DATA_PATH not set in environment - exiting\n" msgstr "" @@ -681,87 +700,83 @@ msgstr "" msgid "filter: error creating new file %1 (%2)" msgstr "" -#: find_session.cc:51 -msgid "Could not resolve path: %1 (%2)" -msgstr "" - -#: find_session.cc:63 +#: find_session.cc:59 msgid "cannot check session path %1 (%2)" msgstr "impossibile controllare il percorso %1 (%2)" -#: find_session.cc:89 +#: find_session.cc:85 msgid "cannot check statefile %1 (%2)" msgstr "impossibile controllare il file di stato %1 (%2)" -#: find_session.cc:125 +#: find_session.cc:121 msgid "%1 is not a snapshot file" msgstr "" -#: find_session.cc:142 +#: find_session.cc:138 msgid "cannot determine current working directory (%1)" msgstr "impossibile determinare la cartella di lavoro corrente (%1)" -#: find_session.cc:159 +#: find_session.cc:155 msgid "unknown file type for session %1" msgstr "tipo di fle sconosciuto per la sessione %1" -#: globals.cc:207 +#: globals.cc:216 msgid "Could not set system open files limit to \"unlimited\"" msgstr "" -#: globals.cc:209 +#: globals.cc:218 msgid "Could not set system open files limit to %1" msgstr "" -#: globals.cc:213 +#: globals.cc:222 msgid "Your system is configured to limit %1 to only %2 open files" msgstr "" -#: globals.cc:217 +#: globals.cc:226 msgid "Could not get system open files limit (%1)" msgstr "" -#: globals.cc:268 +#: globals.cc:280 msgid "Loading configuration" msgstr "" -#: import.cc:207 +#: import.cc:208 msgid "Could not find a source for %1 even though we are updating this file!" msgstr "" -#: import.cc:236 +#: import.cc:237 msgid "Unable to create file %1 during import" msgstr "" -#: import.cc:262 +#: import.cc:263 msgid "Resampling %1 from %2kHz to %3kHz" msgstr "" -#: import.cc:268 +#: import.cc:269 msgid "Copying %1" msgstr "" -#: import.cc:446 +#: import.cc:455 msgid "Track %1 of %2 contained no usable MIDI data" msgstr "" -#: import.cc:453 +#: import.cc:462 msgid "MIDI file %1 was not readable (no reason available)" msgstr "" -#: import.cc:499 +#: import.cc:508 msgid "Import: cannot open input sound file \"%1\"" msgstr "Import: impossibile aprire il file audio di input \"%1\"" -#: import.cc:510 +#: import.cc:519 msgid "Import: error opening MIDI file" msgstr "" -#: import.cc:549 +#: import.cc:558 msgid "Loading MIDI file %1" msgstr "" -#: import.cc:614 +#: import.cc:623 msgid "Failed to remove some files after failed/cancelled import operation" msgstr "" @@ -773,153 +788,153 @@ msgstr "" msgid "preset %1 (bank %2)" msgstr "" -#: internal_send.cc:278 internal_send.cc:279 +#: internal_send.cc:300 internal_send.cc:301 msgid "%1 - cannot find any track/bus with the ID %2 to connect to" msgstr "" -#: io.cc:208 +#: io.cc:209 msgid "IO: cannot disconnect port %1 from %2" msgstr "" -#: io.cc:343 io.cc:428 +#: io.cc:344 io.cc:431 msgid "IO: cannot register input port %1" msgstr "IO: impossibile registrare la porta %1" -#: io.cc:348 io.cc:433 +#: io.cc:349 io.cc:436 msgid "IO: cannot register output port %1" msgstr "IO: impossibile registrare la porta %1" -#: io.cc:591 io.cc:647 +#: io.cc:598 io.cc:654 msgid "incorrect XML node \"%1\" passed to IO object" msgstr "" -#: io.cc:706 +#: io.cc:713 msgid "in" msgstr "" -#: io.cc:706 +#: io.cc:713 msgid "out" msgstr "" -#: io.cc:707 +#: io.cc:714 msgid "input" msgstr "" -#: io.cc:707 +#: io.cc:714 msgid "output" msgstr "" -#: io.cc:717 +#: io.cc:724 msgid "Unknown bundle \"%1\" listed for %2 of %3" msgstr "" -#: io.cc:783 +#: io.cc:790 msgid "Bundle %1 was not available - \"%2\" used instead" msgstr "" -#: io.cc:786 +#: io.cc:793 msgid "No %1 bundles available as a replacement" msgstr "" -#: io.cc:889 +#: io.cc:896 msgid "%1: cannot create I/O ports" msgstr "" -#: io.cc:1017 io.cc:1121 +#: io.cc:1024 io.cc:1128 msgid "IO: badly formed string in XML node for inputs \"%1\"" msgstr "IO: stringa malformata nel nodo XML per le entrate \"%1\"" -#: io.cc:1022 io.cc:1126 +#: io.cc:1029 io.cc:1133 msgid "bad input string in XML node \"%1\"" msgstr "stringa malformata nel nodo XML \"%1\"" -#: io.cc:1060 +#: io.cc:1067 msgid "IO: badly formed string in XML node for outputs \"%1\"" msgstr "IO: stringa mal formata nel nodo XML per le uscite \"%1\"" -#: io.cc:1065 +#: io.cc:1072 msgid "IO: bad output string in XML node \"%1\"" msgstr "IO: stringa mal formata nel nodo XML \"%1\"" -#: io.cc:1411 +#: io.cc:1417 #, c-format msgid "%s %u" msgstr "" -#: io.cc:1458 +#: io.cc:1464 #, c-format msgid "%s in" msgstr "" -#: io.cc:1460 +#: io.cc:1466 #, c-format msgid "%s out" msgstr "" -#: io.cc:1535 session.cc:686 session.cc:715 +#: io.cc:1541 session.cc:689 session.cc:718 msgid "mono" msgstr "" -#: io.cc:1537 session.cc:699 session.cc:729 +#: io.cc:1543 session.cc:702 session.cc:732 msgid "L" msgstr "" -#: io.cc:1537 session.cc:701 session.cc:731 +#: io.cc:1543 session.cc:704 session.cc:734 msgid "R" msgstr "" -#: io.cc:1539 io.cc:1545 +#: io.cc:1545 io.cc:1551 #, c-format msgid "%d" msgstr "" -#: ladspa_plugin.cc:86 +#: ladspa_plugin.cc:93 +msgid "LADSPA: Unable to open module: " +msgstr "" + +#: ladspa_plugin.cc:99 msgid "LADSPA: module has no descriptor function." msgstr "LADSPA: il modulo non ha alcuna funzione descriptor." -#: ladspa_plugin.cc:91 +#: ladspa_plugin.cc:106 msgid "LADSPA: plugin has gone away since discovery!" msgstr "LADSPA: il plugin è stato rimosso" -#: ladspa_plugin.cc:98 +#: ladspa_plugin.cc:113 msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing" msgstr "" -#: ladspa_plugin.cc:297 +#: ladspa_plugin.cc:311 msgid "" "illegal parameter number used with plugin \"%1\". This may indicate a change " "in the plugin design, and presets may be invalid" msgstr "" -#: ladspa_plugin.cc:376 ladspa_plugin.cc:426 +#: ladspa_plugin.cc:390 ladspa_plugin.cc:440 msgid "Bad node sent to LadspaPlugin::set_state" msgstr "" -#: ladspa_plugin.cc:391 ladspa_plugin.cc:440 +#: ladspa_plugin.cc:405 ladspa_plugin.cc:454 msgid "LADSPA: no ladspa port number" msgstr "" -#: ladspa_plugin.cc:397 ladspa_plugin.cc:446 +#: ladspa_plugin.cc:411 ladspa_plugin.cc:460 msgid "LADSPA: no ladspa port data" msgstr "" -#: ladspa_plugin.cc:717 -msgid "LADSPA: cannot load module from \"%1\"" -msgstr "LADPSA: impossibile caricare il modulo da \"%1\"" - -#: ladspa_plugin.cc:827 +#: ladspa_plugin.cc:840 msgid "Could not locate HOME. Preset not removed." msgstr "" -#: ladspa_plugin.cc:864 ladspa_plugin.cc:870 +#: ladspa_plugin.cc:879 ladspa_plugin.cc:885 msgid "Could not create %1. Preset not saved. (%2)" msgstr "Impossibile creare %1 . Preset non salvato. (%2)" -#: ladspa_plugin.cc:877 +#: ladspa_plugin.cc:892 msgid "Error saving presets file %1." msgstr "Errore nel salvare il file di preset %1." -#: ladspa_plugin.cc:915 +#: ladspa_plugin.cc:934 msgid "Could not locate HOME. Preset not saved." msgstr "impossibile localizzare HOME. Preset non salvato." @@ -959,7 +974,7 @@ msgstr "" msgid "incorrect XML mode passed to Locations::set_state" msgstr "" -#: location.cc:842 session.cc:4516 session_state.cc:1031 +#: location.cc:842 session.cc:4533 session_state.cc:1025 msgid "session" msgstr "" @@ -1014,40 +1029,39 @@ msgid "Session and LTC framerate mismatch: LTC:%1 Session:%2." msgstr "" #: ltc_slave.cc:591 -#, c-format msgid "flywheel" msgstr "" -#: midi_diskstream.cc:167 +#: midi_diskstream.cc:166 msgid "" "%1: I/O configuration change %4 requested to use %2, but channel setup is %3" msgstr "" -#: midi_diskstream.cc:219 +#: midi_diskstream.cc:218 msgid "MidiDiskstream: Playlist \"%1\" isn't a midi playlist" msgstr "" -#: midi_diskstream.cc:270 +#: midi_diskstream.cc:269 msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!" msgstr "" -#: midi_diskstream.cc:699 +#: midi_diskstream.cc:698 msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3" msgstr "" -#: midi_diskstream.cc:834 +#: midi_diskstream.cc:833 msgid "MidiDiskstream %1: cannot write to disk" msgstr "" -#: midi_diskstream.cc:868 +#: midi_diskstream.cc:867 msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!" msgstr "" -#: midi_diskstream.cc:955 +#: midi_diskstream.cc:954 msgid "%1: could not create region for complete midi file" msgstr "" -#: midi_diskstream.cc:992 +#: midi_diskstream.cc:991 msgid "MidiDiskstream: could not create region for captured midi!" msgstr "" @@ -1059,27 +1073,27 @@ msgstr "" msgid "No SysExID found for sys-ex property change - ignored" msgstr "" -#: midi_model.cc:2010 +#: midi_model.cc:2012 msgid "transpose" msgstr "" -#: midi_patch_manager.cc:126 +#: midi_patch_manager.cc:127 msgid "Duplicate MIDI device `%1' in `%2' ignored" msgstr "" -#: midi_source.cc:125 +#: midi_source.cc:124 msgid "Missing parameter property on InterpolationStyle" msgstr "" -#: midi_source.cc:132 +#: midi_source.cc:131 msgid "Missing style property on InterpolationStyle" msgstr "" -#: midi_source.cc:144 +#: midi_source.cc:143 msgid "Missing parameter property on AutomationState" msgstr "" -#: midi_source.cc:151 +#: midi_source.cc:150 msgid "Missing state property on AutomationState" msgstr "" @@ -1123,21 +1137,21 @@ msgstr "" msgid "solo control" msgstr "" -#: mtc_slave.cc:238 +#: mtc_slave.cc:240 msgid "MTC Slave: atomic read of current time failed, sleeping!" msgstr "" -#: mtc_slave.cc:361 +#: mtc_slave.cc:362 msgid "" "Unknown rate/drop value %1 in incoming MTC stream, session values used " "instead" msgstr "" -#: mtc_slave.cc:381 +#: mtc_slave.cc:382 msgid "Session framerate adjusted from %1 TO: MTC's %2." msgstr "" -#: mtc_slave.cc:395 +#: mtc_slave.cc:396 msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3." msgstr "" @@ -1197,31 +1211,35 @@ msgstr "" msgid "Pannable given XML data for %1 - ignored" msgstr "" -#: panner_manager.cc:76 -msgid "looking for panners in %1" +#: panner_manager.cc:80 +msgid "looking for panners in %1\n" msgstr "" -#: panner_manager.cc:100 -msgid "Panner discovered: \"%1\" in %2" +#: panner_manager.cc:108 +msgid "Panner discovered: \"%1\" in %2\n" msgstr "" -#: panner_manager.cc:117 +#: panner_manager.cc:125 msgid "PannerManager: cannot load module \"%1\" (%2)" msgstr "" -#: panner_manager.cc:124 +#: panner_manager.cc:132 msgid "PannerManager: module \"%1\" has no descriptor function." msgstr "" -#: panner_manager.cc:187 +#: panner_manager.cc:219 msgid "no panner discovered for in/out = %1/%2" msgstr "" -#: panner_shell.cc:179 +#: panner_shell.cc:126 +msgid "select panner: %1\n" +msgstr "" + +#: panner_shell.cc:245 msgid "Unknown panner plugin \"%1\" found in pan state - ignored" msgstr "" -#: panner_shell.cc:185 +#: panner_shell.cc:251 msgid "panner plugin node has no type information!" msgstr "" @@ -1241,19 +1259,19 @@ msgstr "" msgid "Could not construct playlist for PlaylistSource from session data!" msgstr "" -#: plugin.cc:324 +#: plugin.cc:328 msgid "" "Plugin presets are not supported in this build of %1. Consider paying for a " "full version" msgstr "" -#: plugin.cc:398 +#: plugin.cc:402 msgid "" "Saving plugin settings is not supported in this build of %1. Consider paying " "for the full version" msgstr "" -#: plugin_insert.cc:598 +#: plugin_insert.cc:589 msgid "programming error: " msgstr "errore di programmazione: " @@ -1289,43 +1307,43 @@ msgstr "" msgid "PluginInsert: automatable control %1 not found - ignored" msgstr "" -#: plugin_manager.cc:161 +#: plugin_manager.cc:165 msgid "Discovering Plugins" msgstr "" -#: plugin_manager.cc:335 +#: plugin_manager.cc:286 msgid "Could not parse rdf file: %1" msgstr "" -#: plugin_manager.cc:374 +#: plugin_manager.cc:330 msgid "LADSPA: cannot load module \"%1\" (%2)" msgstr "LADSPA: impossibile caricare il modulo \"%1\" (%2)" -#: plugin_manager.cc:381 +#: plugin_manager.cc:337 msgid "LADSPA: module \"%1\" has no descriptor function." msgstr "LADSPA: il modulo \"%1\" non ha alcuna funzione descriptor." -#: plugin_manager.cc:602 +#: plugin_manager.cc:567 msgid "" "VST plugin %1 does not support processReplacing, and so cannot be used in %2 " "at this time" msgstr "" -#: plugin_manager.cc:709 +#: plugin_manager.cc:680 msgid "" "linuxVST plugin %1 does not support processReplacing, and so cannot be used " "in %2 at this time" msgstr "" -#: plugin_manager.cc:870 +#: plugin_manager.cc:841 msgid "unknown plugin status type \"%1\" - all entries ignored" msgstr "" -#: plugin_manager.cc:887 +#: plugin_manager.cc:858 msgid "unknown plugin type \"%1\" - ignored" msgstr "" -#: port.cc:410 +#: port.cc:412 msgid "could not reregister %1" msgstr "" @@ -1333,11 +1351,11 @@ msgstr "" msgid "insert %1" msgstr "" -#: port_insert.cc:198 +#: port_insert.cc:197 msgid "XML node describing port insert is missing the `type' field" msgstr "" -#: port_insert.cc:203 +#: port_insert.cc:202 msgid "non-port insert XML used for port plugin insert" msgstr "insert non-port XML usato per insert di plugin di porta" @@ -1369,11 +1387,11 @@ msgstr "" msgid "Re-establising port %1 failed" msgstr "" -#: processor.cc:207 +#: processor.cc:208 msgid "No %1 property flag in element %2" msgstr "" -#: processor.cc:216 +#: processor.cc:217 msgid "No child node with active property" msgstr "" @@ -1437,11 +1455,11 @@ msgstr "" msgid "cannot create new name for region \"%1\"" msgstr "impossibile creare un nuovo nome per la regione \"%1\"" -#: resampled_source.cc:98 +#: resampled_source.cc:102 msgid "Import: %1" msgstr "" -#: resampled_source.cc:128 +#: resampled_source.cc:132 srcfilesource.cc:76 msgid "Import: src_new() failed : %1" msgstr "" @@ -1449,27 +1467,27 @@ msgstr "" msgid "return %1" msgstr "" -#: route.cc:1075 route.cc:2528 +#: route.cc:1081 route.cc:2541 msgid "unknown Processor type \"%1\"; ignored" msgstr "" -#: route.cc:1087 +#: route.cc:1093 msgid "processor could not be created. Ignored." msgstr "" -#: route.cc:1962 route.cc:2187 +#: route.cc:1975 route.cc:2200 msgid "Bad node sent to Route::set_state() [%1]" msgstr "" -#: route.cc:2022 +#: route.cc:2035 msgid "Pannable state found for route (%1) without a panner!" msgstr "" -#: route.cc:2096 route.cc:2100 route.cc:2301 route.cc:2305 +#: route.cc:2109 route.cc:2113 route.cc:2314 route.cc:2318 msgid "badly formed order key string in state file! [%1] ... ignored." msgstr "" -#: route.cc:2311 +#: route.cc:2324 msgid "Converting deprecated order key for %1 using Editor order %2" msgstr "" @@ -1485,15 +1503,15 @@ msgstr "" msgid "error writing tempo-adjusted data to %1" msgstr "" -#: send.cc:59 +#: send.cc:60 msgid "aux %1" msgstr "" -#: send.cc:63 +#: send.cc:64 msgid "send %1" msgstr "" -#: send.cc:65 +#: send.cc:66 msgid "programming error: send created using role %1" msgstr "" @@ -1517,148 +1535,148 @@ msgstr "" msgid "Set up standard connections" msgstr "" -#: session.cc:635 +#: session.cc:638 msgid "could not setup Click I/O" msgstr "impossibile impostare entrata/uscita del click" -#: session.cc:683 +#: session.cc:686 #, c-format msgid "out %<PRIu32>" msgstr "" -#: session.cc:697 +#: session.cc:700 #, c-format msgid "out %<PRIu32>+%<PRIu32>" msgstr "" -#: session.cc:712 +#: session.cc:715 #, c-format msgid "in %<PRIu32>" msgstr "" -#: session.cc:726 +#: session.cc:729 #, c-format msgid "in %<PRIu32>+%<PRIu32>" msgstr "" -#: session.cc:790 +#: session.cc:793 msgid "cannot connect master output %1 to %2" msgstr "" -#: session.cc:849 +#: session.cc:862 msgid "monitor" msgstr "" -#: session.cc:894 +#: session.cc:907 msgid "cannot connect control input %1 to %2" msgstr "" -#: session.cc:914 +#: session.cc:927 msgid "The preferred I/O for the monitor bus (%1) cannot be found" msgstr "" -#: session.cc:945 +#: session.cc:958 msgid "cannot connect control output %1 to %2" msgstr "" -#: session.cc:1009 +#: session.cc:1026 msgid "cannot create Auditioner: no auditioning of regions possible" msgstr "impossibile creare l'Auditioner" -#: session.cc:1193 +#: session.cc:1210 msgid "Session: you can't use that location for auto punch (start <= end)" msgstr "" "Sessione: non si può usare quella location per l'auto punch (inizio <= fine)" -#: session.cc:1233 +#: session.cc:1250 msgid "" "You cannot use this location for auto-loop because it has zero or negative " "length" msgstr "" -#: session.cc:1547 +#: session.cc:1564 msgid "feedback loop setup between %1 and %2" msgstr "" -#: session.cc:1843 +#: session.cc:1860 msgid "Session: could not create new midi track." msgstr "" -#: session.cc:1849 +#: session.cc:1866 msgid "" "No more JACK ports are available. You will need to stop %1 and restart JACK " "with more ports if you need this many tracks." msgstr "" -#: session.cc:2026 session.cc:2029 +#: session.cc:2043 session.cc:2046 msgid "Audio" msgstr "" -#: session.cc:2053 session.cc:2061 session.cc:2138 session.cc:2146 +#: session.cc:2070 session.cc:2078 session.cc:2155 session.cc:2163 msgid "cannot configure %1 in/%2 out configuration for new audio track" msgstr "" -#: session.cc:2084 +#: session.cc:2101 msgid "Session: could not create new audio track." msgstr "Sessione: impossibile creare una nuova traccia audio" -#: session.cc:2116 session.cc:2119 +#: session.cc:2133 session.cc:2136 msgid "Bus" msgstr "" -#: session.cc:2169 +#: session.cc:2186 msgid "Session: could not create new audio route." msgstr "" -#: session.cc:2228 session.cc:2238 +#: session.cc:2245 session.cc:2255 msgid "Session: UINT_MAX routes? impossible!" msgstr "" -#: session.cc:2260 +#: session.cc:2277 msgid "Session: cannot create track/bus from template description" msgstr "" -#: session.cc:2286 +#: session.cc:2303 msgid "Session: could not create new route from template" msgstr "" -#: session.cc:2315 +#: session.cc:2332 msgid "Adding new tracks/busses failed" msgstr "" -#: session.cc:3419 +#: session.cc:3436 msgid "FATAL ERROR! Could not find a suitable version of %1 for a rename" msgstr "" -#: session.cc:3539 session.cc:3597 +#: session.cc:3556 session.cc:3614 msgid "There are already %1 recordings for %2, which I consider too many." msgstr "Ci sono già %1 registrazioni per %2, che io considero troppe" -#: session.cc:3987 +#: session.cc:4004 msgid "send ID %1 appears to be in use already" msgstr "" -#: session.cc:3999 +#: session.cc:4016 msgid "aux send ID %1 appears to be in use already" msgstr "" -#: session.cc:4011 +#: session.cc:4028 msgid "return ID %1 appears to be in use already" msgstr "" -#: session.cc:4023 +#: session.cc:4040 msgid "insert ID %1 appears to be in use already" msgstr "" -#: session.cc:4150 +#: session.cc:4167 msgid "Cannot write a range where end <= start (e.g. %1 <= %2)" msgstr "" -#: session.cc:4179 +#: session.cc:4196 msgid "too many bounced versions of playlist \"%1\"" msgstr "" -#: session.cc:4189 +#: session.cc:4206 msgid "cannot create new audio file \"%1\" for %2" msgstr "impossibile creare un nuovo file audio \"%1\" per %2" @@ -1693,7 +1711,7 @@ msgstr "" msgid "Session subdirectory does not exist at path %1" msgstr "" -#: session_events.cc:184 +#: session_events.cc:185 msgid "Session: cannot have two events of type %1 at the same frame (%2)." msgstr "" @@ -1705,13 +1723,13 @@ msgstr "" msgid "Export ended unexpectedly: %1" msgstr "" -#: session_ltc.cc:222 +#: session_ltc.cc:221 msgid "" "LTC encoder: invalid framerate - LTC encoding is disabled for the remainder " "of this session." msgstr "" -#: session_midi.cc:520 +#: session_midi.cc:519 msgid "Session: cannot send quarter-frame MTC message (%1)" msgstr "" @@ -1723,351 +1741,343 @@ msgstr "Sessione: impossibile creare Playlist dalla descrizione XML" msgid "Session: error in no roll for %1" msgstr "" -#: session_process.cc:1157 +#: session_process.cc:1159 msgid "Programming error: illegal event type in process_event (%1)" msgstr "" -#: session_state.cc:140 -msgid "Could not use path %1 (%2)" -msgstr "" - -#: session_state.cc:184 +#: session_state.cc:178 msgid "solo cut control (dB)" msgstr "" -#: session_state.cc:208 +#: session_state.cc:202 msgid "Set block size and sample rate" msgstr "" -#: session_state.cc:213 +#: session_state.cc:207 msgid "Using configuration" msgstr "" -#: session_state.cc:325 +#: session_state.cc:319 msgid "Reset Remote Controls" msgstr "" -#: session_state.cc:417 +#: session_state.cc:411 msgid "Session: cannot create session peakfile folder \"%1\" (%2)" msgstr "" -#: session_state.cc:424 +#: session_state.cc:418 msgid "Session: cannot create session sounds dir \"%1\" (%2)" msgstr "" "Sessione: impossibile creare la cartella sounds per la sessione \"%1\" (%2)" -#: session_state.cc:431 +#: session_state.cc:425 msgid "Session: cannot create session midi dir \"%1\" (%2)" msgstr "" -#: session_state.cc:438 +#: session_state.cc:432 msgid "Session: cannot create session dead sounds folder \"%1\" (%2)" msgstr "" -#: session_state.cc:445 +#: session_state.cc:439 msgid "Session: cannot create session export folder \"%1\" (%2)" msgstr "" -#: session_state.cc:452 +#: session_state.cc:446 msgid "Session: cannot create session analysis folder \"%1\" (%2)" msgstr "" -#: session_state.cc:459 +#: session_state.cc:453 msgid "Session: cannot create session plugins folder \"%1\" (%2)" msgstr "" -#: session_state.cc:466 +#: session_state.cc:460 msgid "Session: cannot create session externals folder \"%1\" (%2)" msgstr "" -#: session_state.cc:480 +#: session_state.cc:474 msgid "Session: cannot create session folder \"%1\" (%2)" msgstr "" -#: session_state.cc:514 +#: session_state.cc:508 msgid "Could not open %1 for writing session template" msgstr "" -#: session_state.cc:520 +#: session_state.cc:514 msgid "Could not open session template %1 for reading" msgstr "" -#: session_state.cc:539 +#: session_state.cc:533 msgid "master" msgstr "" -#: session_state.cc:600 +#: session_state.cc:594 msgid "Could not remove pending capture state at path \"%1\" (%2)" msgstr "" -#: session_state.cc:624 +#: session_state.cc:618 msgid "could not rename snapshot %1 to %2 (%3)" msgstr "" -#: session_state.cc:652 +#: session_state.cc:646 msgid "Could not remove session file at path \"%1\" (%2)" msgstr "" -#: session_state.cc:669 +#: session_state.cc:663 msgid "" "the %1 audio engine is not connected and state saving would lose all I/O " "connections. Session not saved" msgstr "" -#: session_state.cc:720 +#: session_state.cc:714 msgid "state could not be saved to %1" msgstr "" -#: session_state.cc:722 session_state.cc:733 +#: session_state.cc:716 session_state.cc:727 msgid "Could not remove temporary session file at path \"%1\" (%2)" msgstr "" -#: session_state.cc:730 -msgid "could not rename temporary session file %1 to %2" +#: session_state.cc:724 +msgid "could not rename temporary session file %1 to %2 (%3)" msgstr "" -#: session_state.cc:798 +#: session_state.cc:792 msgid "%1: session file \"%2\" doesn't exist!" msgstr "" -#: session_state.cc:810 +#: session_state.cc:804 msgid "Could not understand session file %1" msgstr "" -#: session_state.cc:819 +#: session_state.cc:813 msgid "Session file %1 is not a session" msgstr "" -#: session_state.cc:1125 +#: session_state.cc:1119 msgid "programming error: Session: incorrect XML node sent to set_state()" msgstr "" -#: session_state.cc:1179 +#: session_state.cc:1173 msgid "Session: XML state has no options section" msgstr "Sessione: il file di stato XML non ha alcuna sezione option" -#: session_state.cc:1184 +#: session_state.cc:1178 msgid "Session: XML state has no metadata section" msgstr "" -#: session_state.cc:1195 +#: session_state.cc:1189 msgid "Session: XML state has no sources section" msgstr "Sessione: il file di stato XML non ha alcuna sezione sources" -#: session_state.cc:1202 +#: session_state.cc:1196 msgid "Session: XML state has no Tempo Map section" msgstr "Sessione: il file di stato XML non ha alcuna sezione Tempo Map" -#: session_state.cc:1209 +#: session_state.cc:1203 msgid "Session: XML state has no locations section" msgstr "Sessione: il file di stato XML non ha alcuna sezione locations" -#: session_state.cc:1235 +#: session_state.cc:1229 msgid "Session: XML state has no Regions section" msgstr "Sessione: il file di stato XML non ha alcuna sezione Regions" -#: session_state.cc:1242 +#: session_state.cc:1236 msgid "Session: XML state has no playlists section" msgstr "Sessione: il file di stato XML non ha alcuna sezione playlist" -#: session_state.cc:1262 +#: session_state.cc:1256 msgid "Session: XML state has no bundles section" msgstr "" -#: session_state.cc:1274 +#: session_state.cc:1268 msgid "Session: XML state has no diskstreams section" msgstr "Sessione: il file di stato XML non ha alcuna sezione diskstream" -#: session_state.cc:1282 +#: session_state.cc:1276 msgid "Session: XML state has no routes section" msgstr "Sessione: il file di stato XML non ha alcuna sezione routes" -#: session_state.cc:1294 +#: session_state.cc:1288 msgid "Session: XML state has no route groups section" msgstr "" -#: session_state.cc:1303 +#: session_state.cc:1297 msgid "Session: XML state has no edit groups section" msgstr "Sessione: il file di stato XML non ha alcuna sezione edit groups" -#: session_state.cc:1310 +#: session_state.cc:1304 msgid "Session: XML state has no mix groups section" msgstr "Sessione: il file di stato XML non ha alcuna sezione mix groups" -#: session_state.cc:1318 +#: session_state.cc:1312 msgid "Session: XML state has no click section" msgstr "" -#: session_state.cc:1360 +#: session_state.cc:1354 msgid "Session: cannot create Route from XML description." msgstr "Sessione: impossibile creare Route dalla descrizione XML" -#: session_state.cc:1364 +#: session_state.cc:1358 msgid "Loaded track/bus %1" msgstr "" -#: session_state.cc:1462 +#: session_state.cc:1456 msgid "Could not find diskstream for route" msgstr "" -#: session_state.cc:1516 +#: session_state.cc:1510 msgid "Session: cannot create Region from XML description." msgstr "Sessione: impossibile creare regione dalla descrizione XML" -#: session_state.cc:1520 +#: session_state.cc:1514 msgid "Can not load state for region '%1'" msgstr "" -#: session_state.cc:1556 +#: session_state.cc:1550 msgid "Regions in compound description not found (ID's %1 and %2): ignored" msgstr "" -#: session_state.cc:1584 +#: session_state.cc:1578 msgid "Nested source has no ID info in session file! (ignored)" msgstr "" -#: session_state.cc:1596 +#: session_state.cc:1590 msgid "Cannot reconstruct nested source for region %1" msgstr "" -#: session_state.cc:1658 +#: session_state.cc:1652 msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)" msgstr "" -#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707 +#: session_state.cc:1660 session_state.cc:1681 session_state.cc:1701 msgid "" "Session: XMLNode describing a AudioRegion references an unknown source id =%1" msgstr "" -#: session_state.cc:1672 session_state.cc:1693 session_state.cc:1713 +#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707 msgid "" "Session: XMLNode describing a AudioRegion references a non-audio source id =" "%1" msgstr "" -#: session_state.cc:1736 +#: session_state.cc:1730 msgid "" "Session: XMLNode describing an AudioRegion is missing some master sources; " "ignored" msgstr "" -#: session_state.cc:1770 +#: session_state.cc:1764 msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)" msgstr "" -#: session_state.cc:1778 +#: session_state.cc:1772 msgid "" "Session: XMLNode describing a MidiRegion references an unknown source id =%1" msgstr "" -#: session_state.cc:1784 +#: session_state.cc:1778 msgid "" "Session: XMLNode describing a MidiRegion references a non-midi source id =%1" msgstr "" -#: session_state.cc:1852 +#: session_state.cc:1846 msgid "" "cannot create new file from region name \"%1\" with ident = \"%2\": too many " "existing files with similar names" msgstr "" -#: session_state.cc:1875 +#: session_state.cc:1869 msgid "Session: cannot create Source from XML description." msgstr "Sessione: impossibile creare Source dalla descrizione XML" -#: session_state.cc:1909 +#: session_state.cc:1903 msgid "A sound file is missing. It will be replaced by silence." msgstr "" -#: session_state.cc:1932 +#: session_state.cc:1926 msgid "Found a sound file that cannot be used by %1. Talk to the progammers." msgstr "" -#: session_state.cc:1949 +#: session_state.cc:1943 msgid "Could not create templates directory \"%1\" (%2)" msgstr "" -#: session_state.cc:1962 +#: session_state.cc:1956 msgid "Template \"%1\" already exists - new version not created" msgstr "Il modello \"%1\" esiste già - non è stata creata una nuova versione" -#: session_state.cc:1968 +#: session_state.cc:1962 msgid "Could not create directory for Session template\"%1\" (%2)" msgstr "" -#: session_state.cc:1978 +#: session_state.cc:1972 msgid "template not saved" msgstr "" -#: session_state.cc:1988 +#: session_state.cc:1982 msgid "Could not create directory for Session template plugin state\"%1\" (%2)" msgstr "" -#: session_state.cc:2183 +#: session_state.cc:2225 msgid "Unknown node \"%1\" found in Bundles list from session file" msgstr "" -#: session_state.cc:2725 session_state.cc:2731 -msgid "Cannot expand path %1 (%2)" -msgstr "" - -#: session_state.cc:2784 +#: session_state.cc:2820 msgid "Session: cannot create dead file folder \"%1\" (%2)" msgstr "" -#: session_state.cc:2823 +#: session_state.cc:2859 msgid "cannot rename unused file source from %1 to %2 (%3)" msgstr "" -#: session_state.cc:2841 +#: session_state.cc:2877 msgid "cannot remove peakfile %1 for %2 (%3)" msgstr "impossibile eliminare il peakfile %1 per %2 (%3)" -#: session_state.cc:3143 +#: session_state.cc:3179 msgid "could not backup old history file, current history not saved" msgstr "" -#: session_state.cc:3156 +#: session_state.cc:3192 msgid "history could not be saved to %1" msgstr "" -#: session_state.cc:3159 +#: session_state.cc:3195 msgid "Could not remove history file at path \"%1\" (%2)" msgstr "" -#: session_state.cc:3163 +#: session_state.cc:3199 msgid "could not restore history file from backup %1 (%2)" msgstr "" -#: session_state.cc:3188 +#: session_state.cc:3224 msgid "%1: no history file \"%2\" for this session." msgstr "" -#: session_state.cc:3194 +#: session_state.cc:3230 msgid "Could not understand session history file \"%1\"" msgstr "" -#: session_state.cc:3236 +#: session_state.cc:3272 msgid "Failed to downcast MidiSource for NoteDiffCommand" msgstr "" -#: session_state.cc:3247 +#: session_state.cc:3283 msgid "Failed to downcast MidiSource for SysExDiffCommand" msgstr "" -#: session_state.cc:3258 +#: session_state.cc:3294 msgid "Failed to downcast MidiSource for PatchChangeDiffCommand" msgstr "" -#: session_state.cc:3266 +#: session_state.cc:3302 msgid "Couldn't figure out how to make a Command out of a %1 XMLNode." msgstr "" -#: session_state.cc:3502 +#: session_state.cc:3538 msgid "Session: unknown diskstream type in XML" msgstr "" -#: session_state.cc:3507 +#: session_state.cc:3543 msgid "Session: could not load diskstream via XML state" msgstr "" @@ -2091,115 +2101,115 @@ msgid "" "control" msgstr "" -#: smf_source.cc:252 +#: smf_source.cc:262 msgid "Unable to read event prefix, corrupt MIDI ring" msgstr "" -#: smf_source.cc:265 +#: smf_source.cc:275 msgid "Event has time and size but no body, corrupt MIDI ring" msgstr "" -#: smf_source.cc:271 +#: smf_source.cc:281 msgid "Event time is before MIDI source position" msgstr "" -#: smf_source.cc:306 smf_source.cc:345 +#: smf_source.cc:316 smf_source.cc:355 msgid "Skipping event with unordered time %1" msgstr "" -#: smf_source.cc:410 +#: smf_source.cc:420 msgid "cannot open MIDI file %1 for write" msgstr "" -#: sndfile_helpers.cc:32 +#: sndfile_helpers.cc:34 msgid "WAV" msgstr "" -#: sndfile_helpers.cc:33 +#: sndfile_helpers.cc:35 msgid "AIFF" msgstr "" -#: sndfile_helpers.cc:34 +#: sndfile_helpers.cc:36 msgid "CAF" msgstr "" -#: sndfile_helpers.cc:35 +#: sndfile_helpers.cc:37 msgid "W64 (64 bit WAV)" msgstr "" -#: sndfile_helpers.cc:36 +#: sndfile_helpers.cc:38 msgid "FLAC" msgstr "" -#: sndfile_helpers.cc:37 +#: sndfile_helpers.cc:39 msgid "Ogg/Vorbis" msgstr "" -#: sndfile_helpers.cc:38 +#: sndfile_helpers.cc:40 msgid "raw (no header)" msgstr "" -#: sndfile_helpers.cc:43 +#: sndfile_helpers.cc:45 msgid ".wav" msgstr "" -#: sndfile_helpers.cc:44 +#: sndfile_helpers.cc:46 msgid ".aiff" msgstr "" -#: sndfile_helpers.cc:45 +#: sndfile_helpers.cc:47 msgid ".caf" msgstr "" -#: sndfile_helpers.cc:46 +#: sndfile_helpers.cc:48 msgid ".w64" msgstr "" -#: sndfile_helpers.cc:47 +#: sndfile_helpers.cc:49 msgid ".flac" msgstr "" -#: sndfile_helpers.cc:48 +#: sndfile_helpers.cc:50 msgid ".ogg" msgstr "" -#: sndfile_helpers.cc:49 +#: sndfile_helpers.cc:51 msgid ".raw" msgstr "" -#: sndfile_helpers.cc:64 +#: sndfile_helpers.cc:66 msgid "Signed 16 bit PCM" msgstr "" -#: sndfile_helpers.cc:65 +#: sndfile_helpers.cc:67 msgid "Signed 24 bit PCM" msgstr "" -#: sndfile_helpers.cc:66 +#: sndfile_helpers.cc:68 msgid "Signed 32 bit PCM" msgstr "" -#: sndfile_helpers.cc:67 +#: sndfile_helpers.cc:69 msgid "Signed 8 bit PCM" msgstr "" -#: sndfile_helpers.cc:68 +#: sndfile_helpers.cc:70 msgid "32 bit float" msgstr "" -#: sndfile_helpers.cc:81 +#: sndfile_helpers.cc:83 msgid "Little-endian (Intel)" msgstr "" -#: sndfile_helpers.cc:82 +#: sndfile_helpers.cc:84 msgid "Big-endian (PowerPC)" msgstr "" -#: sndfilesource.cc:201 +#: sndfilesource.cc:210 msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)" msgstr "" -#: sndfilesource.cc:209 +#: sndfilesource.cc:218 msgid "" "SndFileSource: file only contains %1 channels; %2 is invalid as a channel " "number" @@ -2207,84 +2217,92 @@ msgstr "" "SndFileSource: il file contiene solo %1 canali; %2 non è valido come numero " "di canale" -#: sndfilesource.cc:255 sndfilesource.cc:571 sndfilesource.cc:595 +#: sndfilesource.cc:264 sndfilesource.cc:604 sndfilesource.cc:628 msgid "" "cannot set broadcast info for audio file %1 (%2); dropping broadcast info " "for this file" msgstr "" -#: sndfilesource.cc:302 +#: sndfilesource.cc:311 msgid "could not allocate file %1 for reading." msgstr "" -#: sndfilesource.cc:337 +#: sndfilesource.cc:346 msgid "SndFileSource: could not seek to frame %1 within %2 (%3)" msgstr "" -#: sndfilesource.cc:347 +#: sndfilesource.cc:356 msgid "" "SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)" msgstr "" -#: sndfilesource.cc:391 sndfilesource.cc:420 +#: sndfilesource.cc:400 sndfilesource.cc:429 msgid "attempt to write a non-writable audio file source (%1)" msgstr "" -#: sndfilesource.cc:396 utils.cc:510 utils.cc:534 utils.cc:548 utils.cc:567 +#: sndfilesource.cc:405 utils.cc:547 utils.cc:571 utils.cc:585 utils.cc:604 msgid "programming error: %1 %2" msgstr "" -#: sndfilesource.cc:523 +#: sndfilesource.cc:532 sndfilesource.cc:562 msgid "attempt to flush a non-writable audio file source (%1)" msgstr "" -#: sndfilesource.cc:528 +#: sndfilesource.cc:537 sndfilesource.cc:557 msgid "attempt to flush an un-opened audio file source (%1)" msgstr "" -#: sndfilesource.cc:534 +#: sndfilesource.cc:543 msgid "could not allocate file %1 to write header" msgstr "" -#: sndfilesource.cc:548 +#: sndfilesource.cc:568 +msgid "could not allocate file %1 to flush contents" +msgstr "" + +#: sndfilesource.cc:581 msgid "" "attempt to store broadcast info in a non-writable audio file source (%1)" msgstr "" -#: sndfilesource.cc:553 +#: sndfilesource.cc:586 msgid "attempt to set BWF info for an un-opened audio file source (%1)" msgstr "" -#: sndfilesource.cc:614 +#: sndfilesource.cc:647 msgid "%1: cannot seek to %2 (libsndfile error: %3)" msgstr "" -#: sndfilesource.cc:727 +#: sndfilesource.cc:760 msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)" msgstr "" -#: sndfilesource.cc:740 sndfilesource.cc:790 sndfilesource.cc:797 +#: sndfilesource.cc:773 sndfilesource.cc:823 sndfilesource.cc:830 msgid "SndFileSource: \"%1\" bad write (%2)" msgstr "" -#: sndfilesource.cc:820 +#: sndfilesource.cc:853 msgid "" "Filesource: start time is already set for existing file (%1): Cannot change " "start time." msgstr "" -#: speakers.cc:239 +#: speakers.cc:280 msgid "Speaker information is missing azimuth - speaker ignored" msgstr "" -#: speakers.cc:245 +#: speakers.cc:286 msgid "Speaker information is missing elevation - speaker ignored" msgstr "" -#: speakers.cc:251 +#: speakers.cc:292 msgid "Speaker information is missing distance - speaker ignored" msgstr "" +#: srcfilesource.cc:135 +msgid "SrcFileSource: %1" +msgstr "" + #: tape_file_matcher.cc:46 msgid "Cannot compile tape track regexp for use (%1)" msgstr "" @@ -2432,54 +2450,64 @@ msgstr "" msgid "Node for Port has no \"name\" property" msgstr "" -#: utils.cc:358 utils.cc:382 +#: utils.cc:395 utils.cc:419 msgid "Splice" msgstr "" -#: utils.cc:360 utils.cc:375 +#: utils.cc:397 utils.cc:412 msgid "Slide" msgstr "" -#: utils.cc:362 utils.cc:378 +#: utils.cc:399 utils.cc:415 msgid "Lock" msgstr "" -#: utils.cc:365 +#: utils.cc:402 msgid "programming error: unknown edit mode string \"%1\"" msgstr "" -#: utils.cc:389 utils.cc:421 +#: utils.cc:426 utils.cc:458 msgid "MIDI Timecode" msgstr "" -#: utils.cc:389 utils.cc:419 +#: utils.cc:426 utils.cc:456 msgid "MTC" msgstr "" -#: utils.cc:393 utils.cc:428 +#: utils.cc:430 utils.cc:465 msgid "MIDI Clock" msgstr "" -#: utils.cc:397 utils.cc:415 utils.cc:435 +#: utils.cc:434 utils.cc:452 utils.cc:472 msgid "JACK" msgstr "" -#: utils.cc:401 +#: utils.cc:438 msgid "programming error: unknown sync source string \"%1\"" msgstr "" -#: utils.cc:426 +#: utils.cc:463 msgid "M-Clock" msgstr "" -#: utils.cc:432 +#: utils.cc:469 msgid "LTC" msgstr "" -#: utils.cc:602 +#: utils.cc:639 msgid "programming error: unknown native header format: %1" msgstr "" -#: utils.cc:617 +#: utils.cc:654 msgid "cannot open directory %1 (%2)" msgstr "" + +#~ msgid "" +#~ "FileSource: \"%1\" is ambigous when searching %2\n" +#~ "\t" +#~ msgstr "" +#~ "FileSource: \"%1\" è risultato ambiguo nel cercare %2\n" +#~ "\t" + +#~ msgid "LADSPA: cannot load module from \"%1\"" +#~ msgstr "LADPSA: impossibile caricare il modulo da \"%1\"" diff --git a/libs/ardour/po/nn.po b/libs/ardour/po/nn.po index 2356a737f4..53e9c9d5c7 100644 --- a/libs/ardour/po/nn.po +++ b/libs/ardour/po/nn.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: libardour\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-11-05 11:11-0500\n" +"POT-Creation-Date: 2014-02-10 17:53+0100\n" "PO-Revision-Date: 2011-09-13 22:43+0100\n" "Last-Translator: Eivind ØdegÃ¥rd <meinmycell-lists@yahoo.no>\n" "Language-Team: Nynorsk <i18n-nn@lister.ping.uio.no>\n" @@ -24,66 +24,66 @@ msgstr "" msgid "Fader" msgstr "Dempar" -#: audio_diskstream.cc:244 +#: audio_diskstream.cc:242 msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist" msgstr "Lyd-diskstraum: Spelelista \"%1\" er ikkje ei lydspeleliste" -#: audio_diskstream.cc:296 +#: audio_diskstream.cc:294 msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!" msgstr "Lyd-diskstraum %1: det finst inga speleliste Ã¥ kopiera!" -#: audio_diskstream.cc:848 audio_diskstream.cc:858 +#: audio_diskstream.cc:846 audio_diskstream.cc:856 msgid "" "AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3" msgstr "" "Lyd-diskstraum %1: greidde ikkje lesa %2 frÃ¥ spelelista, ramme %3, ved " "attfylling" -#: audio_diskstream.cc:1014 +#: audio_diskstream.cc:1012 msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3" msgstr "Lyd-diskstraum %1: greidde ikkje lesa %2 frÃ¥ spelelista, ramme %3" -#: audio_diskstream.cc:1383 audio_diskstream.cc:1400 +#: audio_diskstream.cc:1381 audio_diskstream.cc:1398 msgid "AudioDiskstream %1: cannot write to disk" msgstr "Lyd-diskstraum %1: greidde ikkje skriva til disk" -#: audio_diskstream.cc:1443 +#: audio_diskstream.cc:1441 msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!" msgstr "Lyd-diskstraum \"%1\": greier ikkje skriva opptaket til disken!" -#: audio_diskstream.cc:1537 +#: audio_diskstream.cc:1535 msgid "%1: could not create region for complete audio file" msgstr "%1: greidde ikkje laga bolk for heil lydfil" -#: audio_diskstream.cc:1571 +#: audio_diskstream.cc:1569 msgid "AudioDiskstream: could not create region for captured audio!" msgstr "Lyd-diskstraum: greidde ikkje laga bolk frÃ¥ opptaket!" -#: audio_diskstream.cc:1679 +#: audio_diskstream.cc:1677 msgid "programmer error: %1" msgstr "Programmerarfeil: %1" -#: audio_diskstream.cc:1905 +#: audio_diskstream.cc:1903 msgid "AudioDiskstream: channel %1 out of range" msgstr "Lyd-diskstraum: kanal %1 utanfor rekkjevidd" -#: audio_diskstream.cc:1919 midi_diskstream.cc:1210 +#: audio_diskstream.cc:1917 midi_diskstream.cc:1209 msgid "%1:%2 new capture file not initialized correctly" msgstr "%1: ny opptaksfil %2 vart ikkje pÃ¥byrja rett" -#: audio_diskstream.cc:2200 +#: audio_diskstream.cc:2198 msgid "%1: cannot restore pending capture source file %2" msgstr "%1: greidde ikkje henta fram att den ventande opptakskjeldefila %2" -#: audio_diskstream.cc:2222 +#: audio_diskstream.cc:2220 msgid "%1: incorrect number of pending sources listed - ignoring them all" msgstr "%1: feil tal pÃ¥ ventande kjelder pÃ¥ lista - ser bort frÃ¥ alle" -#: audio_diskstream.cc:2246 +#: audio_diskstream.cc:2244 msgid "%1: cannot create whole-file region from pending capture sources" msgstr "%1: greidde ikkje laga heilfilbolk frÃ¥ ventande opptakskjelder" -#: audio_library.cc:71 +#: audio_library.cc:81 msgid "Could not open %1. Audio Library not saved" msgstr "Greidde ikkje opna %1. Lydbiblioteket er ikkje lagra" @@ -123,11 +123,11 @@ msgstr "" msgid "Audio Playlists (unused)" msgstr "Lydspelelister (ubrukte)" -#: audio_playlist_source.cc:171 audiosource.cc:913 file_source.cc:529 +#: audio_playlist_source.cc:171 audiosource.cc:891 file_source.cc:520 #: midi_playlist_source.cc:144 midi_playlist_source.cc:152 -#: midi_playlist_source.cc:159 midi_source.cc:371 plugin_insert.cc:643 -#: rb_effect.cc:333 session.cc:2619 session.cc:2652 session.cc:3797 -#: session_handle.cc:87 sndfilesource.cc:121 +#: midi_playlist_source.cc:159 midi_source.cc:370 plugin_insert.cc:634 +#: rb_effect.cc:333 session.cc:2636 session.cc:2669 session.cc:3814 +#: session_handle.cc:87 sndfilesource.cc:122 msgid "programming error: %1" msgstr "Programmeringsfeil: %1" @@ -155,23 +155,23 @@ msgstr "" "\n" "Kanalar:" -#: audio_track.cc:167 +#: audio_track.cc:161 msgid "Unknown bundle \"%1\" listed for input of %2" msgstr "Ukjend bundel \"%1\" lista opp for inngangen pÃ¥ %2" -#: audio_track.cc:169 +#: audio_track.cc:163 msgid "in 1" msgstr "inn 1" -#: audio_track.cc:170 +#: audio_track.cc:164 msgid "No input bundles available as a replacement" msgstr "Ingen inngangsbundlar klare som erstatting" -#: audio_track.cc:174 +#: audio_track.cc:168 msgid "Bundle %1 was not available - \"in 1\" used instead" msgstr "Bundelen %1 var ikkje tilgjengeleg - brukar \"inn 1\" i staden for" -#: audio_track.cc:183 +#: audio_track.cc:177 msgid "improper input channel list in XML node (%1)" msgstr "Feil inngangskanalliste i XML-node (%1)" @@ -195,23 +195,23 @@ msgstr "greier ikkje lasta VAMP-innstikket \"%1\"" msgid "VAMP Plugin \"%1\" could not be loaded" msgstr "VAMP-innstikket \"%1\" vart ikkje lasta" -#: audioengine.cc:488 +#: audioengine.cc:495 msgid "looking for backends in %1\n" msgstr "" -#: audioengine.cc:511 +#: audioengine.cc:518 msgid "AudioEngine: cannot load module \"%1\" (%2)" msgstr "" -#: audioengine.cc:517 +#: audioengine.cc:524 msgid "AudioEngine: backend at \"%1\" has no descriptor function." msgstr "" -#: audioengine.cc:589 +#: audioengine.cc:596 msgid "Could not create backend for %1: %2" msgstr "" -#: audioregion.cc:1643 +#: audioregion.cc:1651 msgid "" "You have requested an operation that requires audio analysis.\n" "\n" @@ -236,11 +236,11 @@ msgstr "" "Denne ruta blir ikkje synt pÃ¥ nytt, men du vil kanskje merka smÃ¥ " "forseinkingar i denne og framtidige lydtoppdata-søk.\n" -#: audiosource.cc:199 +#: audiosource.cc:210 msgid "cannot rename peakfile for %1 from %2 to %3 (%4)" msgstr "kan ikkje døypa om toppfil for %1 frÃ¥ %2 til %3 (%4)" -#: audiosource.cc:226 +#: audiosource.cc:239 msgid "AudioSource: cannot stat peakfile \"%1\"" msgstr "Lydkjelde: kan ikkje bruka toppfil \"%1\"" @@ -248,49 +248,70 @@ msgstr "Lydkjelde: kan ikkje bruka toppfil \"%1\"" msgid "cannot read sample data for unscaled peak computation" msgstr "kan ikkje lesa lyddata for uskalert topputrekning" -#: audiosource.cc:387 +#: audiosource.cc:386 msgid "AudioSource: cannot open peakpath (a) \"%1\" (%2)" msgstr "Lydkjelde: kan ikkje opna toppstig (a) \"%1\" (%2)" -#: audiosource.cc:463 +#: audiosource.cc:395 audiosource.cc:473 +msgid "" +"AudioSource: could not seek to correct location in peak file \"%1\" (%2)" +msgstr "" + +#: audiosource.cc:453 msgid "AudioSource: cannot open peakpath (b) \"%1\" (%2)" msgstr "Lydkjelde: kan ikkje opna toppstig (b) \"%1\" (%2)" -#: audiosource.cc:587 +#: audiosource.cc:567 msgid "" "AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)" msgstr "" "AudioSource [%1]: topplesing - kan ikkje lesa %2 punkt ved forskuvinga %3 av " "%4 (%5)" -#: audiosource.cc:667 +#: audiosource.cc:634 msgid "%1: could not write read raw data for peak computation (%2)" msgstr "%1 greidde ikkje skriva/lesa rÃ¥data for topputrekninga (%2)" -#: audiosource.cc:706 +#: audiosource.cc:672 msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)" msgstr "Lydkjelde: kan ikkje opna toppstig (c) \"%1\" (%2)" -#: audiosource.cc:773 audiosource.cc:886 +#: audiosource.cc:739 audiosource.cc:861 +msgid "%1: could not seek in peak file data (%2)" +msgstr "" + +#: audiosource.cc:744 audiosource.cc:870 msgid "%1: could not write peak file data (%2)" msgstr "%1: greidde ikkje skriva toppfildata (%2)" -#: audiosource.cc:924 +#: audiosource.cc:903 msgid "could not truncate peakfile %1 to %2 (error: %3)" msgstr "" -#: auditioner.cc:87 +#: auditioner.cc:95 +msgid "Falling back to Reasonable Synth for Midi Audition" +msgstr "" + +#: auditioner.cc:97 +msgid "No synth for midi-audition found." +msgstr "" + +#: auditioner.cc:152 msgid "no outputs available for auditioner - manual connection required" msgstr "ingen utgangar for lyttinga - du mÃ¥ kopla til manuelt" -#: auditioner.cc:135 -msgid "Auditioning of non-audio regions not yet supported" -msgstr "Me har ikkje laga lytting for bolkar som ikkje er lyd enno" - -#: auditioner.cc:160 +#: auditioner.cc:392 auditioner.cc:438 msgid "Cannot setup auditioner processing flow for %1 channels" msgstr "Greier ikkje setja opp lyttehandteringsflyt for %1 kanalar" +#: auditioner.cc:426 +msgid "Failed to load synth for MIDI-Audition." +msgstr "" + +#: auditioner.cc:445 +msgid "Auditioning of regions other than Audio or Midi is not supported." +msgstr "" + #: automatable.cc:81 msgid "Automation node has no path property" msgstr "Automasjonspunktet har ingen stigeigenskapar" @@ -330,24 +351,24 @@ msgstr "" "AutomationList: gav XML-node med namet %1, ikkje \"AutomationList\" - sÃ¥g " "bort frÃ¥." -#: butler.cc:91 +#: butler.cc:80 msgid "Cannot create transport request signal pipe (%1)" msgstr "Kan ikkje laga transportspørjingssignalrøyr (%1)" -#: butler.cc:97 butler.cc:103 +#: butler.cc:86 butler.cc:92 msgid "UI: cannot set O_NONBLOCK on butler request pipe (%1)" msgstr "" "Grensesnitt: greier ikkje setja opp O_NONBLOCK pÃ¥ butler-spørjingsrøyret (%1)" -#: butler.cc:109 +#: butler.cc:124 msgid "Session: could not create butler thread" msgstr "Økt: greier ikkje laga butler-trÃ¥d" -#: butler.cc:156 +#: butler.cc:165 msgid "poll on butler request pipe failed (%1)" msgstr "undersøkjing pÃ¥ butler-spørjingsrøyret mislukka (%1)" -#: butler.cc:163 +#: butler.cc:172 msgid "Error on butler thread request pipe: fd=%1 err=%2" msgstr "Feil pÃ¥ butler-spørsjingsrøyret: fd=%1 feil=%2" @@ -355,56 +376,56 @@ msgstr "Feil pÃ¥ butler-spørsjingsrøyret: fd=%1 feil=%2" msgid "Error reading from butler request pipe" msgstr "Feil: greidde ikkje lesa frÃ¥ butlerspørjingsrøyr" -#: butler.cc:248 +#: butler.cc:301 msgid "Butler read ahead failure on dstream %1" msgstr "Butler-førlesingsfeil pÃ¥ dstream %1" -#: butler.cc:285 +#: butler.cc:338 msgid "Butler write-behind failure on dstream %1" msgstr "Butler-etterskrivingsfeil pÃ¥ dstream %1" -#: control_protocol_manager.cc:134 +#: control_protocol_manager.cc:164 msgid "control protocol name \"%1\" has no descriptor" msgstr "kontrollprotokollnamnet \"%1\" har inga skildring" -#: control_protocol_manager.cc:141 +#: control_protocol_manager.cc:171 msgid "control protocol name \"%1\" could not be initialized" msgstr "kontrollprotokollnamnet \"%1\" greidde ikkje starta opp" -#: control_protocol_manager.cc:201 +#: control_protocol_manager.cc:237 msgid "Instantiating mandatory control protocol %1" msgstr "Lagar obligatorisk kontrollprotokolløkt %1" -#: control_protocol_manager.cc:222 +#: control_protocol_manager.cc:258 msgid "looking for control protocols in %1\n" msgstr "" -#: control_protocol_manager.cc:247 +#: control_protocol_manager.cc:283 msgid "Control protocol %1 not usable" msgstr "Kontrollprotokollen %1 er ikkje brukande" -#: control_protocol_manager.cc:264 +#: control_protocol_manager.cc:300 msgid "Control surface protocol discovered: \"%1\"\n" msgstr "" -#: control_protocol_manager.cc:282 +#: control_protocol_manager.cc:318 msgid "ControlProtocolManager: cannot load module \"%1\" (%2)" msgstr "Kontrollprotokollstyring: kan ikkje lasta modulen \"%1\" (%2)" -#: control_protocol_manager.cc:290 +#: control_protocol_manager.cc:324 msgid "ControlProtocolManager: module \"%1\" has no descriptor function." msgstr "Kontrollprotokollstyring: modulen \"%1\" har ingen skildringsfunksjon." -#: cycle_timer.cc:38 +#: cycle_timer.cc:40 msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo" msgstr "CycleTimer::get:mhz()-funksjonen: kan ikkje opna /proc/cpuinfo" -#: cycle_timer.cc:50 +#: cycle_timer.cc:52 msgid "CycleTimer::get_mhz(): cannot locate cpu MHz in /proc/cpuinfo" msgstr "" "CycleTimer::get:mhz()-funksjonen: finn ikkje prosessor-MHz i /proc/cpuinfo" -#: cycle_timer.cc:73 +#: cycle_timer.cc:75 msgid "cannot locate cpu MHz in /proc/cpuinfo" msgstr "finn ikkje prosessor-MHz i /proc/cpuinfo" @@ -412,7 +433,7 @@ msgstr "finn ikkje prosessor-MHz i /proc/cpuinfo" msgid "audio" msgstr "lyd" -#: data_type.cc:28 session.cc:1791 session.cc:1794 +#: data_type.cc:28 session.cc:1808 session.cc:1811 msgid "MIDI" msgstr "MIDI" @@ -420,15 +441,15 @@ msgstr "MIDI" msgid "unknown" msgstr "ukjend" -#: delivery.cc:114 +#: delivery.cc:118 msgid "main outs" msgstr "hovudutgangar" -#: delivery.cc:117 send.cc:61 +#: delivery.cc:121 send.cc:62 msgid "listen" msgstr "høyr pÃ¥" -#: diskstream.cc:303 +#: diskstream.cc:302 msgid "Location \"%1\" not valid for track loop (start >= end)" msgstr "" "Staden \"%1\" er ikkje gyldig for Ã¥ spela spor i lykkje (start >= slutt)" @@ -441,23 +462,23 @@ msgstr "Greidde ikkje fÃ¥ port for eksportkanalen \"%1\", hoppar over kanalen" msgid "Export failed: %1" msgstr "Eksportfeil: %1" -#: export_filename.cc:118 +#: export_filename.cc:119 msgid "Existing export folder for this session (%1) does not exist - ignored" msgstr "" -#: export_filename.cc:229 +#: export_filename.cc:230 msgid "No Time" msgstr "Inga tid" -#: export_filename.cc:238 +#: export_filename.cc:239 msgid "Invalid time format" msgstr "Ugyldig tidsformat" -#: export_filename.cc:247 +#: export_filename.cc:248 msgid "No Date" msgstr "Ingen dato" -#: export_filename.cc:262 +#: export_filename.cc:263 msgid "Invalid date format" msgstr "Ugyldig datoformat" @@ -525,7 +546,7 @@ msgstr "Trekant" msgid "Rectangular" msgstr "Firkant" -#: export_formats.cc:52 session.cc:5014 session.cc:5030 +#: export_formats.cc:52 session.cc:5006 session.cc:5022 msgid "None" msgstr "Ingen" @@ -565,15 +586,15 @@ msgstr "Vorbis-punktformat" msgid "No sample format" msgstr "Ikkje noko punktformat" -#: export_handler.cc:335 +#: export_handler.cc:343 msgid "Editor: cannot open \"%1\" as export file for CD marker file" msgstr "Redigering: greier ikkje opna \"%1\" som eksportfil for CD-markørfil" -#: export_handler.cc:417 export_handler.cc:420 +#: export_handler.cc:425 export_handler.cc:428 msgid "an error occured while writing a TOC/CUE file: %1" msgstr "" -#: export_handler.cc:642 export_handler.cc:700 +#: export_handler.cc:650 export_handler.cc:708 msgid "Cannot convert %1 to Latin-1 text" msgstr "" @@ -636,7 +657,7 @@ msgid "" msgstr "" "%1 støttar berre %2 kanalar, men du har %3 kanalar i kanaloppsettet ditt" -#: file_source.cc:198 session_state.cc:2807 +#: file_source.cc:198 session_state.cc:2843 msgid "" "there are already 1000 files with names like %1; versioning discontinued" msgstr "Det er alt 1000 filer med namn som %1, kuttar ut versjonsnamn" @@ -645,31 +666,29 @@ msgstr "Det er alt 1000 filer med namn som %1, kuttar ut versjonsnamn" msgid "cannot rename file source from %1 to %2 (%3)" msgstr "kan ikkje døypa om filkjelda frÃ¥ %1 til %2 (%3)" -#: file_source.cc:250 file_source.cc:378 +#: file_source.cc:248 file_source.cc:372 msgid "FileSource: search path not set" msgstr "Filkjelde: søkjestigen er ikkje sett opp" -#: file_source.cc:313 file_source.cc:448 -msgid "Filesource: cannot find required file (%1): while searching %2" -msgstr "Filkjelde: Kan ikkje finna fila (%1) under søking i %2" +#: file_source.cc:309 file_source.cc:439 +msgid "Filesource: cannot find required file (%1)" +msgstr "" -#: file_source.cc:440 +#: file_source.cc:432 msgid "" -"FileSource: \"%1\" is ambigous when searching %2\n" +"FileSource: \"%1\" is ambigous when searching\n" "\t" msgstr "" -"Filkjelde: \"%1\" er tvetydig nÃ¥r du søkjer %2\n" -"\t" -#: file_source.cc:494 +#: file_source.cc:484 msgid "Filesource: cannot find required file (%1): %2" msgstr "Filkjelde: Kan ikkje finna den naudsynte fila %1: %2" -#: file_source.cc:501 +#: file_source.cc:492 msgid "Filesource: cannot check for existing file (%1): %2" msgstr "Filkjelde:Kan ikkje sjÃ¥ etter eksisterande fil %1: %2" -#: file_source.cc:535 +#: file_source.cc:526 msgid "" "Programming error! %1 tried to rename a file over another file! It's safe to " "continue working, but please report this to the developers." @@ -678,7 +697,7 @@ msgstr "" "eksisterer. Det er trygt Ã¥ halda fram Ã¥ arbeida, men ver god Ã¥ seia frÃ¥ til " "utviklarane." -#: file_source.cc:540 +#: file_source.cc:531 msgid "cannot rename file %1 to %2 (%3)" msgstr "kan ikkje døypa om %1 til %2 (%3)" @@ -692,15 +711,15 @@ msgid "" "cannot run" msgstr "" -#: filesystem_paths.cc:91 +#: filesystem_paths.cc:96 msgid "ARDOUR_DLL_PATH not set in environment - exiting\n" msgstr "" -#: filesystem_paths.cc:107 +#: filesystem_paths.cc:125 msgid "ARDOUR_CONFIG_PATH not set in environment - exiting\n" msgstr "" -#: filesystem_paths.cc:127 +#: filesystem_paths.cc:148 msgid "ARDOUR_DATA_PATH not set in environment - exiting\n" msgstr "" @@ -712,88 +731,84 @@ msgstr "lydfilter: feil med Ã¥ laga namn for ny fil bygd pÃ¥ %1" msgid "filter: error creating new file %1 (%2)" msgstr "lydfilter: feil med Ã¥ laga den nye fila %1 (%2)" -#: find_session.cc:51 -msgid "Could not resolve path: %1 (%2)" -msgstr "Greidde ikkje finna stigen: %1: (%2)" - -#: find_session.cc:63 +#: find_session.cc:59 msgid "cannot check session path %1 (%2)" msgstr "greier ikkje sjekka øktstigen %1 (%2)" -#: find_session.cc:89 +#: find_session.cc:85 msgid "cannot check statefile %1 (%2)" msgstr "greier ikkje sjekka tilstandsfila %1 (%2)" -#: find_session.cc:125 +#: find_session.cc:121 msgid "%1 is not a snapshot file" msgstr "%1 er ikkje ei snøggbiletefil" -#: find_session.cc:142 +#: find_session.cc:138 msgid "cannot determine current working directory (%1)" msgstr "greier ikkje avgjera kva som er arbeidsmappa no (%1)" -#: find_session.cc:159 +#: find_session.cc:155 msgid "unknown file type for session %1" msgstr "ukjend filtype for økta %1" -#: globals.cc:207 +#: globals.cc:216 msgid "Could not set system open files limit to \"unlimited\"" msgstr "Greidde ikkje setja systemgrensa for opne filer til \"uavgrensa\"" -#: globals.cc:209 +#: globals.cc:218 msgid "Could not set system open files limit to %1" msgstr "Greidde ikkje setja grensa for opne systemfiler til %1" -#: globals.cc:213 +#: globals.cc:222 msgid "Your system is configured to limit %1 to only %2 open files" msgstr "" -#: globals.cc:217 +#: globals.cc:226 msgid "Could not get system open files limit (%1)" msgstr "Greidde ikkje fÃ¥ tak i grensa for opne systemfiler (%1)" -#: globals.cc:268 +#: globals.cc:280 msgid "Loading configuration" msgstr "Lastar oppsettet" -#: import.cc:207 +#: import.cc:208 msgid "Could not find a source for %1 even though we are updating this file!" msgstr "" "Greier ikkje finna kjelda for %1, sjølv om det er denne fila me oppdaterer!" -#: import.cc:236 +#: import.cc:237 msgid "Unable to create file %1 during import" msgstr "Greier ikkje laga fila %1 under import!" -#: import.cc:262 +#: import.cc:263 msgid "Resampling %1 from %2kHz to %3kHz" msgstr "Kodar om %1 frÃ¥ %2kHz til %3kHz" -#: import.cc:268 +#: import.cc:269 msgid "Copying %1" msgstr "Kopierer%1" -#: import.cc:446 +#: import.cc:455 msgid "Track %1 of %2 contained no usable MIDI data" msgstr "Spor %1 av %2 inneheld ingen brukbare MIDI-data" -#: import.cc:453 +#: import.cc:462 msgid "MIDI file %1 was not readable (no reason available)" msgstr "" -#: import.cc:499 +#: import.cc:508 msgid "Import: cannot open input sound file \"%1\"" msgstr "Import: greier ikkje opna inn-lydfila \"%1\"" -#: import.cc:510 +#: import.cc:519 msgid "Import: error opening MIDI file" msgstr "Import: greidde ikkje opna MIDI-fil" -#: import.cc:549 +#: import.cc:558 msgid "Loading MIDI file %1" msgstr "Lastar MIDI-fila %1" -#: import.cc:614 +#: import.cc:623 msgid "Failed to remove some files after failed/cancelled import operation" msgstr "" @@ -805,154 +820,154 @@ msgstr "" msgid "preset %1 (bank %2)" msgstr "" -#: internal_send.cc:278 internal_send.cc:279 +#: internal_send.cc:300 internal_send.cc:301 msgid "%1 - cannot find any track/bus with the ID %2 to connect to" msgstr "" -#: io.cc:208 +#: io.cc:209 msgid "IO: cannot disconnect port %1 from %2" msgstr "IU: kan ikkje kopla porten %1 frÃ¥ %2" -#: io.cc:343 io.cc:428 +#: io.cc:344 io.cc:431 msgid "IO: cannot register input port %1" msgstr "IU: greier ikkje registrera inngangsporten %1" -#: io.cc:348 io.cc:433 +#: io.cc:349 io.cc:436 msgid "IO: cannot register output port %1" msgstr "IU: greier ikkje registrera utgangsporten %1" -#: io.cc:591 io.cc:647 +#: io.cc:598 io.cc:654 msgid "incorrect XML node \"%1\" passed to IO object" msgstr "feil XML-punkt, \"%1\", sendt til IU-objektet" -#: io.cc:706 +#: io.cc:713 msgid "in" msgstr "inn" -#: io.cc:706 +#: io.cc:713 msgid "out" msgstr "ut" -#: io.cc:707 +#: io.cc:714 msgid "input" msgstr "inngang" -#: io.cc:707 +#: io.cc:714 msgid "output" msgstr "utgang" -#: io.cc:717 +#: io.cc:724 msgid "Unknown bundle \"%1\" listed for %2 of %3" msgstr "Ukjend bundel \"%1\" lista for %2 av %3" -#: io.cc:783 +#: io.cc:790 msgid "Bundle %1 was not available - \"%2\" used instead" msgstr "Bundelen %1 var ikkje tilgjengeleg - brukte \"%2\" i staden" -#: io.cc:786 +#: io.cc:793 msgid "No %1 bundles available as a replacement" msgstr "Ingen %1-bundlar klare som erstatting" -#: io.cc:889 +#: io.cc:896 msgid "%1: cannot create I/O ports" msgstr "%1: greier ikkje laga I/U-portar" -#: io.cc:1017 io.cc:1121 +#: io.cc:1024 io.cc:1128 msgid "IO: badly formed string in XML node for inputs \"%1\"" msgstr "IU: feilforma streng i XML-opunkt for inngangane \"%1\"" -#: io.cc:1022 io.cc:1126 +#: io.cc:1029 io.cc:1133 msgid "bad input string in XML node \"%1\"" msgstr "feil inngangsstreng i XML-punktet \"%1\"" -#: io.cc:1060 +#: io.cc:1067 msgid "IO: badly formed string in XML node for outputs \"%1\"" msgstr "IU: feilforma streng i XML-punktet for utgangane \"%1\"" -#: io.cc:1065 +#: io.cc:1072 msgid "IO: bad output string in XML node \"%1\"" msgstr "IU: feil utgangsstreng i XML-punktet \"%1\"" -#: io.cc:1411 +#: io.cc:1417 #, c-format msgid "%s %u" msgstr "%s %u" -#: io.cc:1458 +#: io.cc:1464 #, c-format msgid "%s in" msgstr " %s inn" -#: io.cc:1460 +#: io.cc:1466 #, c-format msgid "%s out" msgstr "%s ut" -#: io.cc:1535 session.cc:686 session.cc:715 +#: io.cc:1541 session.cc:689 session.cc:718 msgid "mono" msgstr "mono" -#: io.cc:1537 session.cc:699 session.cc:729 +#: io.cc:1543 session.cc:702 session.cc:732 msgid "L" msgstr "V" -#: io.cc:1537 session.cc:701 session.cc:731 +#: io.cc:1543 session.cc:704 session.cc:734 msgid "R" msgstr "H" -#: io.cc:1539 io.cc:1545 +#: io.cc:1545 io.cc:1551 #, c-format msgid "%d" msgstr "%d" -#: ladspa_plugin.cc:86 +#: ladspa_plugin.cc:93 +msgid "LADSPA: Unable to open module: " +msgstr "" + +#: ladspa_plugin.cc:99 msgid "LADSPA: module has no descriptor function." msgstr "LADSPA: modulen har ingen skildringsfunksjon" -#: ladspa_plugin.cc:91 +#: ladspa_plugin.cc:106 msgid "LADSPA: plugin has gone away since discovery!" msgstr "LADSPA: tilleggsprogrammet har vorte borte sidan det vart oppdaga!" -#: ladspa_plugin.cc:98 +#: ladspa_plugin.cc:113 msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing" msgstr "" "LADSPA: kan ikkje bruka \"%1\", sidan han ikkje kan prosessera pÃ¥ staden" -#: ladspa_plugin.cc:297 +#: ladspa_plugin.cc:311 msgid "" "illegal parameter number used with plugin \"%1\". This may indicate a change " "in the plugin design, and presets may be invalid" msgstr "" -#: ladspa_plugin.cc:376 ladspa_plugin.cc:426 +#: ladspa_plugin.cc:390 ladspa_plugin.cc:440 msgid "Bad node sent to LadspaPlugin::set_state" msgstr "Feil punkt sendt til LadspaPlugin::set_state" -#: ladspa_plugin.cc:391 ladspa_plugin.cc:440 +#: ladspa_plugin.cc:405 ladspa_plugin.cc:454 msgid "LADSPA: no ladspa port number" msgstr "LADSPA: ikkje noko Ladspa-portnummer" -#: ladspa_plugin.cc:397 ladspa_plugin.cc:446 +#: ladspa_plugin.cc:411 ladspa_plugin.cc:460 msgid "LADSPA: no ladspa port data" msgstr "LADSPA: ingen portdata" -#: ladspa_plugin.cc:717 -msgid "LADSPA: cannot load module from \"%1\"" -msgstr "LADSPA: greier ikkje lasta modul frÃ¥ \"%1\"" - -#: ladspa_plugin.cc:827 +#: ladspa_plugin.cc:840 msgid "Could not locate HOME. Preset not removed." msgstr "Greidde ikkje finna heimemappa. Har ikkje fjera ferdigoppsett." -#: ladspa_plugin.cc:864 ladspa_plugin.cc:870 +#: ladspa_plugin.cc:879 ladspa_plugin.cc:885 msgid "Could not create %1. Preset not saved. (%2)" msgstr "Greidde ikkje laga %1. Har ikkje lagra ferdigoppsett. (%2)" -#: ladspa_plugin.cc:877 +#: ladspa_plugin.cc:892 msgid "Error saving presets file %1." msgstr "Feil med Ã¥ lagra ferdigoppsettfila %1." -#: ladspa_plugin.cc:915 +#: ladspa_plugin.cc:934 msgid "Could not locate HOME. Preset not saved." msgstr "Greidde ikkje finna heimemappa. Har ikkje lagra ferdigoppsett." @@ -992,7 +1007,7 @@ msgstr "Stader: forsøk pÃ¥ Ã¥ bruka ukjend stad som vald stad" msgid "incorrect XML mode passed to Locations::set_state" msgstr "feil XML-modus send til Locations::set_state" -#: location.cc:842 session.cc:4516 session_state.cc:1031 +#: location.cc:842 session.cc:4533 session_state.cc:1025 msgid "session" msgstr "økt" @@ -1057,40 +1072,39 @@ msgid "Session and LTC framerate mismatch: LTC:%1 Session:%2." msgstr "" #: ltc_slave.cc:591 -#, c-format msgid "flywheel" msgstr "" -#: midi_diskstream.cc:167 +#: midi_diskstream.cc:166 msgid "" "%1: I/O configuration change %4 requested to use %2, but channel setup is %3" msgstr "%1: I/U-oppsettsendringa %4 ba om Ã¥ bruka %2, men kanaloppsettet er %3" -#: midi_diskstream.cc:219 +#: midi_diskstream.cc:218 msgid "MidiDiskstream: Playlist \"%1\" isn't a midi playlist" msgstr "" -#: midi_diskstream.cc:270 +#: midi_diskstream.cc:269 msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!" msgstr "MIDI-diskstraum %1: det finst inga speleliste Ã¥ kopiera!" -#: midi_diskstream.cc:699 +#: midi_diskstream.cc:698 msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3" msgstr "MIDI-diskstraum %1: greidde ikkje lesa %2 frÃ¥ spelelista, ramme %3" -#: midi_diskstream.cc:834 +#: midi_diskstream.cc:833 msgid "MidiDiskstream %1: cannot write to disk" msgstr "MIDI-diskstraum %1: greidde ikkje skriva til disk" -#: midi_diskstream.cc:868 +#: midi_diskstream.cc:867 msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!" msgstr "MIDI-diskstraum \"%1\": greier ikkje skriva opptaket til disken!" -#: midi_diskstream.cc:955 +#: midi_diskstream.cc:954 msgid "%1: could not create region for complete midi file" msgstr "%1: greidde ikkje laga bolk for heil midifil" -#: midi_diskstream.cc:992 +#: midi_diskstream.cc:991 msgid "MidiDiskstream: could not create region for captured midi!" msgstr "MIDI-diskstraum: greidde ikkje laga bolk frÃ¥ midi-opptaket!" @@ -1102,27 +1116,27 @@ msgstr "Fann ingen NoteID for noteeigenskapsendringa - sÃ¥g bort frÃ¥" msgid "No SysExID found for sys-ex property change - ignored" msgstr "Fann ingen SysExID for sys-ex-eigenskapsendring - sÃ¥g bort frÃ¥" -#: midi_model.cc:2010 +#: midi_model.cc:2012 msgid "transpose" msgstr "transponer" -#: midi_patch_manager.cc:126 +#: midi_patch_manager.cc:127 msgid "Duplicate MIDI device `%1' in `%2' ignored" msgstr "" -#: midi_source.cc:125 +#: midi_source.cc:124 msgid "Missing parameter property on InterpolationStyle" msgstr "Manglar parametereigenskap pÃ¥ InterpolationStyle" -#: midi_source.cc:132 +#: midi_source.cc:131 msgid "Missing style property on InterpolationStyle" msgstr "Manglar stileigenskap pÃ¥ InterpolationStyle" -#: midi_source.cc:144 +#: midi_source.cc:143 msgid "Missing parameter property on AutomationState" msgstr "Manglar parameterigenskap pÃ¥ AutomationStyle" -#: midi_source.cc:151 +#: midi_source.cc:150 msgid "Missing state property on AutomationState" msgstr "Manglar statuseigenskap pÃ¥ AutomationState" @@ -1166,22 +1180,22 @@ msgstr "polaritetskontroll" msgid "solo control" msgstr "solo kontroll" -#: mtc_slave.cc:238 +#: mtc_slave.cc:240 msgid "MTC Slave: atomic read of current time failed, sleeping!" msgstr "MTC-slave: greidde ikkje lesa gyldig tid. Søv." -#: mtc_slave.cc:361 +#: mtc_slave.cc:362 msgid "" "Unknown rate/drop value %1 in incoming MTC stream, session values used " "instead" msgstr "" "Ukjent rate/sleppverdi %1 i innkomande MTC-straum, bruker øktverdiar i staden" -#: mtc_slave.cc:381 +#: mtc_slave.cc:382 msgid "Session framerate adjusted from %1 TO: MTC's %2." msgstr "" -#: mtc_slave.cc:395 +#: mtc_slave.cc:396 msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3." msgstr "" @@ -1241,33 +1255,37 @@ msgstr "fast tid-bolkkopi" msgid "Pannable given XML data for %1 - ignored" msgstr "Panoreringa fekk XML-data for %1 - ignorert" -#: panner_manager.cc:76 -msgid "looking for panners in %1" -msgstr "ser etter panoreringar i %1" +#: panner_manager.cc:80 +msgid "looking for panners in %1\n" +msgstr "" -#: panner_manager.cc:100 -msgid "Panner discovered: \"%1\" in %2" +#: panner_manager.cc:108 +msgid "Panner discovered: \"%1\" in %2\n" msgstr "" -#: panner_manager.cc:117 +#: panner_manager.cc:125 msgid "PannerManager: cannot load module \"%1\" (%2)" msgstr "Panoreringsstyring: kan ikkje lasta modulen \"%1\" (%2)" -#: panner_manager.cc:124 +#: panner_manager.cc:132 msgid "PannerManager: module \"%1\" has no descriptor function." msgstr "Panoreringsstyring: modulen \"%1\" har ingen skildringsfunksjon." -#: panner_manager.cc:187 +#: panner_manager.cc:219 msgid "no panner discovered for in/out = %1/%2" msgstr "fann inga panorering for inn/ut = %1/%2" -#: panner_shell.cc:179 +#: panner_shell.cc:126 +msgid "select panner: %1\n" +msgstr "" + +#: panner_shell.cc:245 msgid "Unknown panner plugin \"%1\" found in pan state - ignored" msgstr "" "Ukjent panoreringstilleggsprogram, \"%1\", funne i panoreringstilstand. " "Hoppa over." -#: panner_shell.cc:185 +#: panner_shell.cc:251 msgid "panner plugin node has no type information!" msgstr "tilleggsprogrampunktet for panoreringa har ingen typeinformasjon!" @@ -1287,19 +1305,19 @@ msgstr "Fann ingen speleliste-ID i PlaylistSource-XML!" msgid "Could not construct playlist for PlaylistSource from session data!" msgstr "Greidde ikkje byggja speleliste for PlaylistSource frÃ¥ øktdata!" -#: plugin.cc:324 +#: plugin.cc:328 msgid "" "Plugin presets are not supported in this build of %1. Consider paying for a " "full version" msgstr "" -#: plugin.cc:398 +#: plugin.cc:402 msgid "" "Saving plugin settings is not supported in this build of %1. Consider paying " "for the full version" msgstr "" -#: plugin_insert.cc:598 +#: plugin_insert.cc:589 msgid "programming error: " msgstr "programmeringsfeil: " @@ -1337,43 +1355,43 @@ msgstr "" "PluginInsert: fann ikkje den automasjonsferdige kontrollen %1, sÃ¥g bort frÃ¥ " "han." -#: plugin_manager.cc:161 +#: plugin_manager.cc:165 msgid "Discovering Plugins" msgstr "Finn innstikk" -#: plugin_manager.cc:335 +#: plugin_manager.cc:286 msgid "Could not parse rdf file: %1" msgstr "Greidde ikkje tolka rdf-fila: %1" -#: plugin_manager.cc:374 +#: plugin_manager.cc:330 msgid "LADSPA: cannot load module \"%1\" (%2)" msgstr "LADSPA: greier ikkje lasta modulen \"%1\" (%2)" -#: plugin_manager.cc:381 +#: plugin_manager.cc:337 msgid "LADSPA: module \"%1\" has no descriptor function." msgstr "LADSPA: modulen \"%1\" har ingen skildringsfunksjon." -#: plugin_manager.cc:602 +#: plugin_manager.cc:567 msgid "" "VST plugin %1 does not support processReplacing, and so cannot be used in %2 " "at this time" msgstr "" -#: plugin_manager.cc:709 +#: plugin_manager.cc:680 msgid "" "linuxVST plugin %1 does not support processReplacing, and so cannot be used " "in %2 at this time" msgstr "" -#: plugin_manager.cc:870 +#: plugin_manager.cc:841 msgid "unknown plugin status type \"%1\" - all entries ignored" msgstr "\"%1\" er ein ukjend utvidingsstatustype, sÃ¥g bort frÃ¥ alt" -#: plugin_manager.cc:887 +#: plugin_manager.cc:858 msgid "unknown plugin type \"%1\" - ignored" msgstr "\"%1\" er ein ukjend innstikktype - hoppa over" -#: port.cc:410 +#: port.cc:412 msgid "could not reregister %1" msgstr "greidde ikkje registrera %1." @@ -1381,11 +1399,11 @@ msgstr "greidde ikkje registrera %1." msgid "insert %1" msgstr "set inn %1" -#: port_insert.cc:198 +#: port_insert.cc:197 msgid "XML node describing port insert is missing the `type' field" msgstr "XML-punktet som skildrar portinnstikket manglar 'type'-feltet" -#: port_insert.cc:203 +#: port_insert.cc:202 msgid "non-port insert XML used for port plugin insert" msgstr "" "tappingspunkt-XML som ikkje er ein port er brukt for porttilleggstapping" @@ -1420,11 +1438,11 @@ msgstr "Lydmaskineri: Klarte ikkje kopla %1 (%2) til %3 (%4)." msgid "Re-establising port %1 failed" msgstr "" -#: processor.cc:207 +#: processor.cc:208 msgid "No %1 property flag in element %2" msgstr "Ikkje noko %1-eigenskapsflagg i elementet %2" -#: processor.cc:216 +#: processor.cc:217 msgid "No child node with active property" msgstr "Ingen undernode med aktiv eigenskap" @@ -1490,11 +1508,11 @@ msgstr "%1 samansett-%2.1 (%3)" msgid "cannot create new name for region \"%1\"" msgstr "greier ikkje laga nytt namn for bolken \"%1\"" -#: resampled_source.cc:98 +#: resampled_source.cc:102 msgid "Import: %1" msgstr "Import: %1" -#: resampled_source.cc:128 +#: resampled_source.cc:132 srcfilesource.cc:76 msgid "Import: src_new() failed : %1" msgstr "Import: src_new()-funkjsonen lukkast ikkje: %1" @@ -1502,27 +1520,27 @@ msgstr "Import: src_new()-funkjsonen lukkast ikkje: %1" msgid "return %1" msgstr "retur %1" -#: route.cc:1075 route.cc:2528 +#: route.cc:1081 route.cc:2541 msgid "unknown Processor type \"%1\"; ignored" msgstr "\"%1\" er ein ukjend prosesseringstype, hoppa over" -#: route.cc:1087 +#: route.cc:1093 msgid "processor could not be created. Ignored." msgstr "greidde ikkje laga prosessering. Hoppa over." -#: route.cc:1962 route.cc:2187 +#: route.cc:1975 route.cc:2200 msgid "Bad node sent to Route::set_state() [%1]" msgstr "Feil punkt sendt til Route::set_state()-funksjonen [%1]" -#: route.cc:2022 +#: route.cc:2035 msgid "Pannable state found for route (%1) without a panner!" msgstr "Fann panoreringsstatus for ruta (%1) utan panorering!" -#: route.cc:2096 route.cc:2100 route.cc:2301 route.cc:2305 +#: route.cc:2109 route.cc:2113 route.cc:2314 route.cc:2318 msgid "badly formed order key string in state file! [%1] ... ignored." msgstr "feilforma tingingsnykjelstreng i tilstandsfil! [%1] ... hoppa over." -#: route.cc:2311 +#: route.cc:2324 msgid "Converting deprecated order key for %1 using Editor order %2" msgstr "" @@ -1539,15 +1557,15 @@ msgstr "" msgid "error writing tempo-adjusted data to %1" msgstr "greidde ikkje skriva tempo-justert fil til %1" -#: send.cc:59 +#: send.cc:60 msgid "aux %1" msgstr "" -#: send.cc:63 +#: send.cc:64 msgid "send %1" msgstr "send %1" -#: send.cc:65 +#: send.cc:66 msgid "programming error: send created using role %1" msgstr "" @@ -1571,149 +1589,149 @@ msgstr "" msgid "Set up standard connections" msgstr "Set opp standartilkoplingar" -#: session.cc:635 +#: session.cc:638 msgid "could not setup Click I/O" msgstr "greidde ikkje setja opp klikk-I/U" -#: session.cc:683 +#: session.cc:686 #, c-format msgid "out %<PRIu32>" msgstr "ut %<PRIu32>" -#: session.cc:697 +#: session.cc:700 #, c-format msgid "out %<PRIu32>+%<PRIu32>" msgstr "ut %<PRIu32>+%<PRIu32>" -#: session.cc:712 +#: session.cc:715 #, c-format msgid "in %<PRIu32>" msgstr "inn %<PRIu32>" -#: session.cc:726 +#: session.cc:729 #, c-format msgid "in %<PRIu32>+%<PRIu32>" msgstr "inn %<PRIu32>+%<PRIu32>" -#: session.cc:790 +#: session.cc:793 msgid "cannot connect master output %1 to %2" msgstr "greier ikkje kopla til hovudutgangane %1 til %2" -#: session.cc:849 +#: session.cc:862 msgid "monitor" msgstr "lytting" -#: session.cc:894 +#: session.cc:907 msgid "cannot connect control input %1 to %2" msgstr "greier ikkje kopla til kontrollinngangane %1 til %2" -#: session.cc:914 +#: session.cc:927 msgid "The preferred I/O for the monitor bus (%1) cannot be found" msgstr "Greidde ikkje finna føretrekt I/U for lyttebussen (%1)" -#: session.cc:945 +#: session.cc:958 msgid "cannot connect control output %1 to %2" msgstr "greier ikkje kopla til kontrollutgangane %1 til %2" -#: session.cc:1009 +#: session.cc:1026 msgid "cannot create Auditioner: no auditioning of regions possible" msgstr "greier ikkje laga Lytting: det er ikkje rÃ¥d Ã¥ lytta pÃ¥ nokon bolkar." -#: session.cc:1193 +#: session.cc:1210 msgid "Session: you can't use that location for auto punch (start <= end)" msgstr "Økt: du kan ikkje bruka denne staden for autoinnslag (start<=slutt)" -#: session.cc:1233 +#: session.cc:1250 msgid "" "You cannot use this location for auto-loop because it has zero or negative " "length" msgstr "" -#: session.cc:1547 +#: session.cc:1564 msgid "feedback loop setup between %1 and %2" msgstr "rundgang-lykkjeoppsett mellom %1 og %2" -#: session.cc:1843 +#: session.cc:1860 msgid "Session: could not create new midi track." msgstr "Økt: greidde ikkje laga nytt midispor." -#: session.cc:1849 +#: session.cc:1866 msgid "" "No more JACK ports are available. You will need to stop %1 and restart JACK " "with more ports if you need this many tracks." msgstr "" -#: session.cc:2026 session.cc:2029 +#: session.cc:2043 session.cc:2046 msgid "Audio" msgstr "Lyd" -#: session.cc:2053 session.cc:2061 session.cc:2138 session.cc:2146 +#: session.cc:2070 session.cc:2078 session.cc:2155 session.cc:2163 msgid "cannot configure %1 in/%2 out configuration for new audio track" msgstr "" "greier ikkje stilla inn %1 inn/%2 ut-innstillingane for det nye lydsporet" -#: session.cc:2084 +#: session.cc:2101 msgid "Session: could not create new audio track." msgstr "Økt: greidde ikkje laga nytt lydspor." -#: session.cc:2116 session.cc:2119 +#: session.cc:2133 session.cc:2136 msgid "Bus" msgstr "Buss" -#: session.cc:2169 +#: session.cc:2186 msgid "Session: could not create new audio route." msgstr "Økt: greidde ikkje laga ny lydrute." -#: session.cc:2228 session.cc:2238 +#: session.cc:2245 session.cc:2255 msgid "Session: UINT_MAX routes? impossible!" msgstr "Økt: UINT_MAX-ruter? GÃ¥r ikkje an!" -#: session.cc:2260 +#: session.cc:2277 msgid "Session: cannot create track/bus from template description" msgstr "Økt: greier ikkje laga spor/buss frÃ¥ malskildringa" -#: session.cc:2286 +#: session.cc:2303 msgid "Session: could not create new route from template" msgstr "Økt: greidde ikkje laga ny lydrute frÃ¥ malen" -#: session.cc:2315 +#: session.cc:2332 msgid "Adding new tracks/busses failed" msgstr "" -#: session.cc:3419 +#: session.cc:3436 msgid "FATAL ERROR! Could not find a suitable version of %1 for a rename" msgstr "" "ALVORLEG FEIL! Greidde ikkje finna ei høveleg utgÃ¥ve av %1 for Ã¥ døypa om" -#: session.cc:3539 session.cc:3597 +#: session.cc:3556 session.cc:3614 msgid "There are already %1 recordings for %2, which I consider too many." msgstr "Det er alt %1 opptak for %2, og eg synest det er for mange." -#: session.cc:3987 +#: session.cc:4004 msgid "send ID %1 appears to be in use already" msgstr "send-IDen %1 ser ut til Ã¥ vera i bruk frÃ¥ før" -#: session.cc:3999 +#: session.cc:4016 msgid "aux send ID %1 appears to be in use already" msgstr "" -#: session.cc:4011 +#: session.cc:4028 msgid "return ID %1 appears to be in use already" msgstr "retur-IDen %1 ser ut til Ã¥ vera i bruk frÃ¥ før" -#: session.cc:4023 +#: session.cc:4040 msgid "insert ID %1 appears to be in use already" msgstr "send-IDen %2 ser ut til Ã¥ vera i bruk frÃ¥ før" -#: session.cc:4150 +#: session.cc:4167 msgid "Cannot write a range where end <= start (e.g. %1 <= %2)" msgstr "Kan ikkje skriva eit omrÃ¥de der slutten <= starten (td. %1 <= %2)" -#: session.cc:4179 +#: session.cc:4196 msgid "too many bounced versions of playlist \"%1\"" msgstr "for mange samanmiksa versjonar av spelelista \"%1\"" -#: session.cc:4189 +#: session.cc:4206 msgid "cannot create new audio file \"%1\" for %2" msgstr "greier ikkje laga ny lydfil \"%1\" for %2" @@ -1752,7 +1770,7 @@ msgstr "greier ikkje laga øktmappa i stigen \"%1\", feil: %2" msgid "Session subdirectory does not exist at path %1" msgstr "Undermappa for økta finst ikkje i stigen %1" -#: session_events.cc:184 +#: session_events.cc:185 msgid "Session: cannot have two events of type %1 at the same frame (%2)." msgstr "Økt: du kan ikkje ha to handlingar av typen %1 pÃ¥ same ramma (%2)." @@ -1764,13 +1782,13 @@ msgstr "%1: greier ikkje finna %2 for eksportering" msgid "Export ended unexpectedly: %1" msgstr "" -#: session_ltc.cc:222 +#: session_ltc.cc:221 msgid "" "LTC encoder: invalid framerate - LTC encoding is disabled for the remainder " "of this session." msgstr "" -#: session_midi.cc:520 +#: session_midi.cc:519 msgid "Session: cannot send quarter-frame MTC message (%1)" msgstr "Økt: greidde ikkje senda kvartramme-MTC-melding (%1)" @@ -1782,91 +1800,87 @@ msgstr "Økt: greier ikkje laga speleliste ut frÃ¥ XML-skildringa." msgid "Session: error in no roll for %1" msgstr "Økt: feil pÃ¥ ingen rull for %1" -#: session_process.cc:1157 +#: session_process.cc:1159 msgid "Programming error: illegal event type in process_event (%1)" msgstr "Programmeringsfeil: ulovleg handlingstype i process-event (%1)" -#: session_state.cc:140 -msgid "Could not use path %1 (%2)" -msgstr "" - -#: session_state.cc:184 +#: session_state.cc:178 msgid "solo cut control (dB)" msgstr "solokutt-kontroll (dB)" -#: session_state.cc:208 +#: session_state.cc:202 msgid "Set block size and sample rate" msgstr "Set blokkstorleik og punktrate" -#: session_state.cc:213 +#: session_state.cc:207 msgid "Using configuration" msgstr "Bruker oppsett" -#: session_state.cc:325 +#: session_state.cc:319 msgid "Reset Remote Controls" msgstr "Still tilbake fjernkontrollar" -#: session_state.cc:417 +#: session_state.cc:411 msgid "Session: cannot create session peakfile folder \"%1\" (%2)" msgstr "Økt: greier ikkje laga mappa \"%1\" for økttoppfiler (%2)" -#: session_state.cc:424 +#: session_state.cc:418 msgid "Session: cannot create session sounds dir \"%1\" (%2)" msgstr "Økt: greier ikkje laga øktmappa \"%1\" for lydfiler (%2)" -#: session_state.cc:431 +#: session_state.cc:425 msgid "Session: cannot create session midi dir \"%1\" (%2)" msgstr "Økt: greier ikkje laga midimappa \"%1\" for økta (%2)" -#: session_state.cc:438 +#: session_state.cc:432 msgid "Session: cannot create session dead sounds folder \"%1\" (%2)" msgstr "Økt: greier ikkje laga mappa \"%1\" for daudlyd (%2)" -#: session_state.cc:445 +#: session_state.cc:439 msgid "Session: cannot create session export folder \"%1\" (%2)" msgstr "Økt: greidde ikkje laga mappa \"%1\" for eksportlyd (%2)" -#: session_state.cc:452 +#: session_state.cc:446 msgid "Session: cannot create session analysis folder \"%1\" (%2)" msgstr "Økt: greidde ikkje laga mappa \"%1\" for øktanalyse (%2)" -#: session_state.cc:459 +#: session_state.cc:453 msgid "Session: cannot create session plugins folder \"%1\" (%2)" msgstr "Økt: greier ikkje laga utvidingmappa \"%1\" for økta (%2)" -#: session_state.cc:466 +#: session_state.cc:460 msgid "Session: cannot create session externals folder \"%1\" (%2)" msgstr "" -#: session_state.cc:480 +#: session_state.cc:474 msgid "Session: cannot create session folder \"%1\" (%2)" msgstr "Økt: greidde ikkje laga øktmappa \"%1\" (%2)" -#: session_state.cc:514 +#: session_state.cc:508 msgid "Could not open %1 for writing session template" msgstr "" -#: session_state.cc:520 +#: session_state.cc:514 msgid "Could not open session template %1 for reading" msgstr "" -#: session_state.cc:539 +#: session_state.cc:533 msgid "master" msgstr "master" -#: session_state.cc:600 +#: session_state.cc:594 msgid "Could not remove pending capture state at path \"%1\" (%2)" msgstr "" -#: session_state.cc:624 +#: session_state.cc:618 msgid "could not rename snapshot %1 to %2 (%3)" msgstr "greidde ikkje døypa om snøggbiletet %1 til %2 (%3)" -#: session_state.cc:652 +#: session_state.cc:646 msgid "Could not remove session file at path \"%1\" (%2)" msgstr "" -#: session_state.cc:669 +#: session_state.cc:663 msgid "" "the %1 audio engine is not connected and state saving would lose all I/O " "connections. Session not saved" @@ -1874,134 +1888,134 @@ msgstr "" "lydmotoren i %1 er ikkje kopla til, og Ã¥ lagra statusen ville kasta bort " "alle I/U-tilkoplingar. Økta er ikkje lagra" -#: session_state.cc:720 +#: session_state.cc:714 msgid "state could not be saved to %1" msgstr "greidde ikkje lagra tilstanden til %1" -#: session_state.cc:722 session_state.cc:733 +#: session_state.cc:716 session_state.cc:727 msgid "Could not remove temporary session file at path \"%1\" (%2)" msgstr "" -#: session_state.cc:730 -msgid "could not rename temporary session file %1 to %2" -msgstr "greidde ikkje døypa om mellombels øktfil %1 til %2" +#: session_state.cc:724 +msgid "could not rename temporary session file %1 to %2 (%3)" +msgstr "" -#: session_state.cc:798 +#: session_state.cc:792 msgid "%1: session file \"%2\" doesn't exist!" msgstr "" -#: session_state.cc:810 +#: session_state.cc:804 msgid "Could not understand session file %1" msgstr "" -#: session_state.cc:819 +#: session_state.cc:813 msgid "Session file %1 is not a session" msgstr "Øktfila %1 er ikkje ei økt" -#: session_state.cc:1125 +#: session_state.cc:1119 msgid "programming error: Session: incorrect XML node sent to set_state()" msgstr "" "programmeringsfeil: Økt: feil XML-punkt sendt til set_state()-funksjonen" -#: session_state.cc:1179 +#: session_state.cc:1173 msgid "Session: XML state has no options section" msgstr "Økt: XML-tilstandsfila har ikkje noko avsnitt om instillingar" -#: session_state.cc:1184 +#: session_state.cc:1178 msgid "Session: XML state has no metadata section" msgstr "Økt: XML-fila har inga avdeling for metadata" -#: session_state.cc:1195 +#: session_state.cc:1189 msgid "Session: XML state has no sources section" msgstr "Økt: XML-tilstandsfila har ikkje noko avsnitt om kjelder" -#: session_state.cc:1202 +#: session_state.cc:1196 msgid "Session: XML state has no Tempo Map section" msgstr "Økt: XML-fila har ikkje noko avsnitt om tempokart" -#: session_state.cc:1209 +#: session_state.cc:1203 msgid "Session: XML state has no locations section" msgstr "Økt: XML-fila har ikkje noko avsnitt om stader" -#: session_state.cc:1235 +#: session_state.cc:1229 msgid "Session: XML state has no Regions section" msgstr "Økt: XML-tilstandsfila har ikkje noko avsnitt om bolkar" -#: session_state.cc:1242 +#: session_state.cc:1236 msgid "Session: XML state has no playlists section" msgstr "Økt: XML-tilstandsfila har ikkje noko avsnitt om spelelister" -#: session_state.cc:1262 +#: session_state.cc:1256 msgid "Session: XML state has no bundles section" msgstr "Økt: XML-fila har inga avdeling for bundlar" -#: session_state.cc:1274 +#: session_state.cc:1268 msgid "Session: XML state has no diskstreams section" msgstr "Økt: XML-fila har ikkje nok avsnitt om diskstraumar" -#: session_state.cc:1282 +#: session_state.cc:1276 msgid "Session: XML state has no routes section" msgstr "Økt: XML-fila har ikkje noko avsnitt om ruter" -#: session_state.cc:1294 +#: session_state.cc:1288 msgid "Session: XML state has no route groups section" msgstr "Økt: XML-fila har inga avdeling for rutegrupper" -#: session_state.cc:1303 +#: session_state.cc:1297 msgid "Session: XML state has no edit groups section" msgstr "Økt: XML-fila har ikkje noko avsnitt om grupperedigering" -#: session_state.cc:1310 +#: session_state.cc:1304 msgid "Session: XML state has no mix groups section" msgstr "Økt: XML-fila har ikkje noko avsnitt om miksgrupper" -#: session_state.cc:1318 +#: session_state.cc:1312 msgid "Session: XML state has no click section" msgstr "Økt: XML-fila har ikkje noko avsnitt om klikk" -#: session_state.cc:1360 +#: session_state.cc:1354 msgid "Session: cannot create Route from XML description." msgstr "Økt: greier ikkje laga rute ut frÃ¥ XML-skildringa." -#: session_state.cc:1364 +#: session_state.cc:1358 msgid "Loaded track/bus %1" msgstr "Lasta spor/buss %1" -#: session_state.cc:1462 +#: session_state.cc:1456 msgid "Could not find diskstream for route" msgstr "Greidde ikkje finna diskstraumen for rute" -#: session_state.cc:1516 +#: session_state.cc:1510 msgid "Session: cannot create Region from XML description." msgstr "Økt: greier ikkje laga bolkar ut frÃ¥ XML-skildringa." -#: session_state.cc:1520 +#: session_state.cc:1514 msgid "Can not load state for region '%1'" msgstr "Greier ikkje laga status for bolken '%1'" -#: session_state.cc:1556 +#: session_state.cc:1550 msgid "Regions in compound description not found (ID's %1 and %2): ignored" msgstr "Fann ikkje bolkar i samansetjingsstatus (IDar %1 og %2): ignorert" -#: session_state.cc:1584 +#: session_state.cc:1578 msgid "Nested source has no ID info in session file! (ignored)" msgstr "" -#: session_state.cc:1596 +#: session_state.cc:1590 msgid "Cannot reconstruct nested source for region %1" msgstr "Greier ikkje rekonstruera nøsta kjelde for bolken %1" -#: session_state.cc:1658 +#: session_state.cc:1652 msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)" msgstr "Økt: XML-punktet som skildrar ein lydbolk er uferdig (manglar kjelde)" -#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707 +#: session_state.cc:1660 session_state.cc:1681 session_state.cc:1701 msgid "" "Session: XMLNode describing a AudioRegion references an unknown source id =%1" msgstr "" "Økt: XML-punktet som skildrar ein lydbolk peikar pÃ¥ ein ukjend kjelde-ID = %1" -#: session_state.cc:1672 session_state.cc:1693 session_state.cc:1713 +#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707 msgid "" "Session: XMLNode describing a AudioRegion references a non-audio source id =" "%1" @@ -2009,7 +2023,7 @@ msgstr "" "Økt: XML-punktet som skildrar ein lydbolk peikar pÃ¥ ein kjelde-ID %1 som " "ikkje er ei lydfil" -#: session_state.cc:1736 +#: session_state.cc:1730 msgid "" "Session: XMLNode describing an AudioRegion is missing some master sources; " "ignored" @@ -2017,25 +2031,25 @@ msgstr "" "Økt: XML-punktet som skildrar ein lydbolk manglar nokre masterkjelder, ser " "bort frÃ¥" -#: session_state.cc:1770 +#: session_state.cc:1764 msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)" msgstr "Økt: XML-punktet som skildrar ein midibolk er uferdig (manglar kjelde)" -#: session_state.cc:1778 +#: session_state.cc:1772 msgid "" "Session: XMLNode describing a MidiRegion references an unknown source id =%1" msgstr "" "Økt: XML-punktet som skildrar ein midibolk peikar pÃ¥ ein ukjend kjelde-ID = " "%1" -#: session_state.cc:1784 +#: session_state.cc:1778 msgid "" "Session: XMLNode describing a MidiRegion references a non-midi source id =%1" msgstr "" "Økt: XML-punktet som skildrar ein midibolk peikar pÃ¥ ein kjelde-ID %1 som " "ikkje er ei midi-fil" -#: session_state.cc:1852 +#: session_state.cc:1846 msgid "" "cannot create new file from region name \"%1\" with ident = \"%2\": too many " "existing files with similar names" @@ -2043,105 +2057,101 @@ msgstr "" "greier ikkje laga ny fil frÃ¥ bolknamn \"%1\" med ident = \"%2\": det finst " "for mange med same namnet" -#: session_state.cc:1875 +#: session_state.cc:1869 msgid "Session: cannot create Source from XML description." msgstr "Økt: greier ikkje laga kjelde ut frÃ¥ XML-skildringa." -#: session_state.cc:1909 +#: session_state.cc:1903 msgid "A sound file is missing. It will be replaced by silence." msgstr "Det manglar ei lydfil. Ho vil bli erstatta med stille." -#: session_state.cc:1932 +#: session_state.cc:1926 msgid "Found a sound file that cannot be used by %1. Talk to the progammers." msgstr "Fann ei lydfil som %1 ikkje kan bruka. Prat med utviklarane." -#: session_state.cc:1949 +#: session_state.cc:1943 msgid "Could not create templates directory \"%1\" (%2)" msgstr "" -#: session_state.cc:1962 +#: session_state.cc:1956 msgid "Template \"%1\" already exists - new version not created" msgstr "Malen \"%1\" finst alt - laga ingen ny versjon" -#: session_state.cc:1968 +#: session_state.cc:1962 msgid "Could not create directory for Session template\"%1\" (%2)" msgstr "" -#: session_state.cc:1978 +#: session_state.cc:1972 msgid "template not saved" msgstr "malen vart ikkje lagra" -#: session_state.cc:1988 +#: session_state.cc:1982 msgid "Could not create directory for Session template plugin state\"%1\" (%2)" msgstr "" -#: session_state.cc:2183 +#: session_state.cc:2225 msgid "Unknown node \"%1\" found in Bundles list from session file" msgstr "" -#: session_state.cc:2725 session_state.cc:2731 -msgid "Cannot expand path %1 (%2)" -msgstr "Greier ikkje utvida stigen %1 (%2)" - -#: session_state.cc:2784 +#: session_state.cc:2820 msgid "Session: cannot create dead file folder \"%1\" (%2)" msgstr "Økt: greier ikkje laga mappa \"%1\" for daudlyd (%2)" -#: session_state.cc:2823 +#: session_state.cc:2859 msgid "cannot rename unused file source from %1 to %2 (%3)" msgstr "kan ikkje døypa om den ubrukte filkjelda frÃ¥ %1 til %2 (%3)" -#: session_state.cc:2841 +#: session_state.cc:2877 msgid "cannot remove peakfile %1 for %2 (%3)" msgstr "kan ikkje fjerna toppfil %1 for %2 (%3)" -#: session_state.cc:3143 +#: session_state.cc:3179 msgid "could not backup old history file, current history not saved" msgstr "" "greidde ikkje ta tryggingskopi av den gamle historiefila, noverande historie " "vart ikkje lagra." -#: session_state.cc:3156 +#: session_state.cc:3192 msgid "history could not be saved to %1" msgstr "greidde ikkje lagra historia til %1" -#: session_state.cc:3159 +#: session_state.cc:3195 msgid "Could not remove history file at path \"%1\" (%2)" msgstr "" -#: session_state.cc:3163 +#: session_state.cc:3199 msgid "could not restore history file from backup %1 (%2)" msgstr "greidde ikkje henta fram att historiefila frÃ¥ tryggingskopien %1 (%2)" -#: session_state.cc:3188 +#: session_state.cc:3224 msgid "%1: no history file \"%2\" for this session." msgstr "%1: inga historiefil \"%2\" for denne økta." -#: session_state.cc:3194 +#: session_state.cc:3230 msgid "Could not understand session history file \"%1\"" msgstr "Skjønte ikkje økthistoriefila \"%1\"" -#: session_state.cc:3236 +#: session_state.cc:3272 msgid "Failed to downcast MidiSource for NoteDiffCommand" msgstr "Greidde ikkje kasta ned midi-kjelde for NoteDiffCommand" -#: session_state.cc:3247 +#: session_state.cc:3283 msgid "Failed to downcast MidiSource for SysExDiffCommand" msgstr "Greidde ikkje kasta ned midi-kjelde for SysExDiffCommand" -#: session_state.cc:3258 +#: session_state.cc:3294 msgid "Failed to downcast MidiSource for PatchChangeDiffCommand" msgstr "Greidde ikkje kasta ned midi-kjelde for PatchChangeDiffCommand" -#: session_state.cc:3266 +#: session_state.cc:3302 msgid "Couldn't figure out how to make a Command out of a %1 XMLNode." msgstr "Fann ikkje ut korleis eg skal laga ein kommando av eit %1-XML-punkt." -#: session_state.cc:3502 +#: session_state.cc:3538 msgid "Session: unknown diskstream type in XML" msgstr "Økt: ukjend diskstraumtype i XML" -#: session_state.cc:3507 +#: session_state.cc:3543 msgid "Session: could not load diskstream via XML state" msgstr "Økt: greidde ikkje lasta diskstraumen via XML-tilstand" @@ -2169,122 +2179,122 @@ msgstr "" "Allmenn varifart-kontroll kan ikkje brukast nÃ¥r %1 er kopla til JACK-" "transportkontrollen" -#: smf_source.cc:252 +#: smf_source.cc:262 msgid "Unable to read event prefix, corrupt MIDI ring" msgstr "" -#: smf_source.cc:265 +#: smf_source.cc:275 msgid "Event has time and size but no body, corrupt MIDI ring" msgstr "" -#: smf_source.cc:271 +#: smf_source.cc:281 msgid "Event time is before MIDI source position" msgstr "" -#: smf_source.cc:306 smf_source.cc:345 +#: smf_source.cc:316 smf_source.cc:355 msgid "Skipping event with unordered time %1" msgstr "" -#: smf_source.cc:410 +#: smf_source.cc:420 msgid "cannot open MIDI file %1 for write" msgstr "greier ikkje opna MIDI-fila %1 for skriving" -#: sndfile_helpers.cc:32 +#: sndfile_helpers.cc:34 msgid "WAV" msgstr "WAV" -#: sndfile_helpers.cc:33 +#: sndfile_helpers.cc:35 msgid "AIFF" msgstr "AIFF" -#: sndfile_helpers.cc:34 +#: sndfile_helpers.cc:36 msgid "CAF" msgstr "CAF" -#: sndfile_helpers.cc:35 +#: sndfile_helpers.cc:37 msgid "W64 (64 bit WAV)" msgstr "W64 (64-bits WAV)" -#: sndfile_helpers.cc:36 +#: sndfile_helpers.cc:38 msgid "FLAC" msgstr "FLAC" -#: sndfile_helpers.cc:37 +#: sndfile_helpers.cc:39 msgid "Ogg/Vorbis" msgstr "Ogg/Vorbis" -#: sndfile_helpers.cc:38 +#: sndfile_helpers.cc:40 msgid "raw (no header)" msgstr "rÃ¥ fil (utan tittellinje)" -#: sndfile_helpers.cc:43 +#: sndfile_helpers.cc:45 msgid ".wav" msgstr ".wav" -#: sndfile_helpers.cc:44 +#: sndfile_helpers.cc:46 msgid ".aiff" msgstr ".aiff" -#: sndfile_helpers.cc:45 +#: sndfile_helpers.cc:47 msgid ".caf" msgstr ".caf" -#: sndfile_helpers.cc:46 +#: sndfile_helpers.cc:48 msgid ".w64" msgstr ".w64" -#: sndfile_helpers.cc:47 +#: sndfile_helpers.cc:49 msgid ".flac" msgstr ".flac" -#: sndfile_helpers.cc:48 +#: sndfile_helpers.cc:50 msgid ".ogg" msgstr ".ogg" -#: sndfile_helpers.cc:49 +#: sndfile_helpers.cc:51 msgid ".raw" msgstr ".raw" -#: sndfile_helpers.cc:64 +#: sndfile_helpers.cc:66 msgid "Signed 16 bit PCM" msgstr "Signert 16bit PCM" -#: sndfile_helpers.cc:65 +#: sndfile_helpers.cc:67 msgid "Signed 24 bit PCM" msgstr "Signert 24bit PCM" -#: sndfile_helpers.cc:66 +#: sndfile_helpers.cc:68 msgid "Signed 32 bit PCM" msgstr "Signert 32bit PCM" -#: sndfile_helpers.cc:67 +#: sndfile_helpers.cc:69 msgid "Signed 8 bit PCM" msgstr "Signert 8bit PCM" -#: sndfile_helpers.cc:68 +#: sndfile_helpers.cc:70 msgid "32 bit float" msgstr "32-bit flytpunkt" -#: sndfile_helpers.cc:81 +#: sndfile_helpers.cc:83 msgid "Little-endian (Intel)" msgstr "Liten endian (Intel)" -#: sndfile_helpers.cc:82 +#: sndfile_helpers.cc:84 msgid "Big-endian (PowerPC)" msgstr "Viktigaste bit fyrst (Mac)" -#: sndfilesource.cc:201 +#: sndfilesource.cc:210 msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)" msgstr "Lydfilkjelde: greier ikkje opna fila \"%1\" for %2 (%3)" -#: sndfilesource.cc:209 +#: sndfilesource.cc:218 msgid "" "SndFileSource: file only contains %1 channels; %2 is invalid as a channel " "number" msgstr "" "Lydfilkjelde: fila inneheld berre %1 kanalar, %2 er eit ugyldig kanalnummer" -#: sndfilesource.cc:255 sndfilesource.cc:571 sndfilesource.cc:595 +#: sndfilesource.cc:264 sndfilesource.cc:604 sndfilesource.cc:628 msgid "" "cannot set broadcast info for audio file %1 (%2); dropping broadcast info " "for this file" @@ -2292,62 +2302,66 @@ msgstr "" "greier ikkje fastsetja kringkastingsinformasjon for lydfila %1 (%2), hoppar " "over kringkastingsinformasjonen for denne fila" -#: sndfilesource.cc:302 +#: sndfilesource.cc:311 msgid "could not allocate file %1 for reading." msgstr "greidde ikkje tildela fila %1 for Ã¥ lesa" -#: sndfilesource.cc:337 +#: sndfilesource.cc:346 msgid "SndFileSource: could not seek to frame %1 within %2 (%3)" msgstr "Lydfilkjelde: greier ikkje leita fram til ramma %1 innan %2 (%3)" -#: sndfilesource.cc:347 +#: sndfilesource.cc:356 msgid "" "SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)" msgstr "" -#: sndfilesource.cc:391 sndfilesource.cc:420 +#: sndfilesource.cc:400 sndfilesource.cc:429 msgid "attempt to write a non-writable audio file source (%1)" msgstr "prøvde Ã¥ skriva til ei ikkje-skrivbar lydkjeldefil (%1)" -#: sndfilesource.cc:396 utils.cc:510 utils.cc:534 utils.cc:548 utils.cc:567 +#: sndfilesource.cc:405 utils.cc:547 utils.cc:571 utils.cc:585 utils.cc:604 msgid "programming error: %1 %2" msgstr "programmeringsfeil: %1 %2" -#: sndfilesource.cc:523 +#: sndfilesource.cc:532 sndfilesource.cc:562 msgid "attempt to flush a non-writable audio file source (%1)" msgstr "prøvde Ã¥ tømma ei ikkje-skrivbar lydkjeldefil (%1)" -#: sndfilesource.cc:528 +#: sndfilesource.cc:537 sndfilesource.cc:557 msgid "attempt to flush an un-opened audio file source (%1)" msgstr "prøvde Ã¥ tømma ei uopna lydkjeldefil (%1)" -#: sndfilesource.cc:534 +#: sndfilesource.cc:543 msgid "could not allocate file %1 to write header" msgstr "greidde ikkje tildela fila %1 for Ã¥ skriva hovudet" -#: sndfilesource.cc:548 +#: sndfilesource.cc:568 +msgid "could not allocate file %1 to flush contents" +msgstr "" + +#: sndfilesource.cc:581 msgid "" "attempt to store broadcast info in a non-writable audio file source (%1)" msgstr "" "prøvde Ã¥ lagra kringastingsinfo til ei ikkje-skrivbar lydkjeldefil (%1)" -#: sndfilesource.cc:553 +#: sndfilesource.cc:586 msgid "attempt to set BWF info for an un-opened audio file source (%1)" msgstr "prøvde Ã¥ laga BWF-info for ei uopna lydkjeldefil (%1)" -#: sndfilesource.cc:614 +#: sndfilesource.cc:647 msgid "%1: cannot seek to %2 (libsndfile error: %3)" msgstr "" -#: sndfilesource.cc:727 +#: sndfilesource.cc:760 msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)" msgstr "SndFileSource: \"%1\" feillesen returverdi: %2 av %5 (%3: %4)" -#: sndfilesource.cc:740 sndfilesource.cc:790 sndfilesource.cc:797 +#: sndfilesource.cc:773 sndfilesource.cc:823 sndfilesource.cc:830 msgid "SndFileSource: \"%1\" bad write (%2)" msgstr "SndFileSource: \"%1\" feilskriving (%2)" -#: sndfilesource.cc:820 +#: sndfilesource.cc:853 msgid "" "Filesource: start time is already set for existing file (%1): Cannot change " "start time." @@ -2355,21 +2369,25 @@ msgstr "" "Filkjelde: starttida er alt sett for denne fila (%1): kan ikkje endra " "starttid." -#: speakers.cc:239 +#: speakers.cc:280 msgid "Speaker information is missing azimuth - speaker ignored" msgstr "Høgtalaroppsettet manglar asimutvinkel - høgtalaren ikkje medteken" -#: speakers.cc:245 +#: speakers.cc:286 msgid "Speaker information is missing elevation - speaker ignored" msgstr "" "Høgtalaroppsettet manglar opplysingar om høgd over golvet - høgtalaren ikkje " "medteken" -#: speakers.cc:251 +#: speakers.cc:292 msgid "Speaker information is missing distance - speaker ignored" msgstr "" "Høgtalaroppsettet manglar opplysingar om avstand - høgtalaren ikkje medteken" +#: srcfilesource.cc:135 +msgid "SrcFileSource: %1" +msgstr "" + #: tape_file_matcher.cc:46 msgid "Cannot compile tape track regexp for use (%1)" msgstr "Greier ikkje setja saman bandspor-reguttrykk til bruk (%1)" @@ -2522,54 +2540,82 @@ msgstr "Punktet for kanalen har ingen \"type\"-eigenskap" msgid "Node for Port has no \"name\" property" msgstr "Punktet for porten har ingen \"namn\"-eigenskap" -#: utils.cc:358 utils.cc:382 +#: utils.cc:395 utils.cc:419 msgid "Splice" msgstr "Splitt" -#: utils.cc:360 utils.cc:375 +#: utils.cc:397 utils.cc:412 msgid "Slide" msgstr "Gli" -#: utils.cc:362 utils.cc:378 +#: utils.cc:399 utils.cc:415 msgid "Lock" msgstr "LÃ¥s" -#: utils.cc:365 +#: utils.cc:402 msgid "programming error: unknown edit mode string \"%1\"" msgstr "programmeringsfeil: ukjend redigeringsmodus-streng \"%1\"" -#: utils.cc:389 utils.cc:421 +#: utils.cc:426 utils.cc:458 msgid "MIDI Timecode" msgstr "MIDI-tidskode" -#: utils.cc:389 utils.cc:419 +#: utils.cc:426 utils.cc:456 msgid "MTC" msgstr "MTC" -#: utils.cc:393 utils.cc:428 +#: utils.cc:430 utils.cc:465 msgid "MIDI Clock" msgstr "MIDI-klokke" -#: utils.cc:397 utils.cc:415 utils.cc:435 +#: utils.cc:434 utils.cc:452 utils.cc:472 msgid "JACK" msgstr "JACK" -#: utils.cc:401 +#: utils.cc:438 msgid "programming error: unknown sync source string \"%1\"" msgstr "programmeringsfeil: ukjend synkkjeldestreng \"%1\"" -#: utils.cc:426 +#: utils.cc:463 msgid "M-Clock" msgstr "" -#: utils.cc:432 +#: utils.cc:469 msgid "LTC" msgstr "" -#: utils.cc:602 +#: utils.cc:639 msgid "programming error: unknown native header format: %1" msgstr "programmeringsfeil: ukjent opphavleg hovudformat: \"%1\"" -#: utils.cc:617 +#: utils.cc:654 msgid "cannot open directory %1 (%2)" msgstr "greier ikkje opna mappa %1 (%2)" + +#~ msgid "Auditioning of non-audio regions not yet supported" +#~ msgstr "Me har ikkje laga lytting for bolkar som ikkje er lyd enno" + +#~ msgid "Filesource: cannot find required file (%1): while searching %2" +#~ msgstr "Filkjelde: Kan ikkje finna fila (%1) under søking i %2" + +#~ msgid "" +#~ "FileSource: \"%1\" is ambigous when searching %2\n" +#~ "\t" +#~ msgstr "" +#~ "Filkjelde: \"%1\" er tvetydig nÃ¥r du søkjer %2\n" +#~ "\t" + +#~ msgid "Could not resolve path: %1 (%2)" +#~ msgstr "Greidde ikkje finna stigen: %1: (%2)" + +#~ msgid "LADSPA: cannot load module from \"%1\"" +#~ msgstr "LADSPA: greier ikkje lasta modul frÃ¥ \"%1\"" + +#~ msgid "looking for panners in %1" +#~ msgstr "ser etter panoreringar i %1" + +#~ msgid "could not rename temporary session file %1 to %2" +#~ msgstr "greidde ikkje døypa om mellombels øktfil %1 til %2" + +#~ msgid "Cannot expand path %1 (%2)" +#~ msgstr "Greier ikkje utvida stigen %1 (%2)" diff --git a/libs/ardour/po/pl.po b/libs/ardour/po/pl.po index 05dd5c642a..bab49e326f 100644 --- a/libs/ardour/po/pl.po +++ b/libs/ardour/po/pl.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: libardour3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-11-05 11:11-0500\n" +"POT-Creation-Date: 2014-02-10 17:53+0100\n" "PO-Revision-Date: 2008-04-10 10:51+0100\n" "Last-Translator: Piotr Zaryk <pzaryk@gmail.com>\n" "Language-Team: Polish <pl@li.org>\n" @@ -20,64 +20,64 @@ msgstr "" msgid "Fader" msgstr "" -#: audio_diskstream.cc:244 +#: audio_diskstream.cc:242 msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist" msgstr "" -#: audio_diskstream.cc:296 +#: audio_diskstream.cc:294 msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!" msgstr "" -#: audio_diskstream.cc:848 audio_diskstream.cc:858 +#: audio_diskstream.cc:846 audio_diskstream.cc:856 msgid "" "AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3" msgstr "" -#: audio_diskstream.cc:1014 +#: audio_diskstream.cc:1012 msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3" msgstr "" -#: audio_diskstream.cc:1383 audio_diskstream.cc:1400 +#: audio_diskstream.cc:1381 audio_diskstream.cc:1398 msgid "AudioDiskstream %1: cannot write to disk" msgstr "" -#: audio_diskstream.cc:1443 +#: audio_diskstream.cc:1441 msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!" msgstr "" -#: audio_diskstream.cc:1537 +#: audio_diskstream.cc:1535 msgid "%1: could not create region for complete audio file" msgstr "" -#: audio_diskstream.cc:1571 +#: audio_diskstream.cc:1569 msgid "AudioDiskstream: could not create region for captured audio!" msgstr "" -#: audio_diskstream.cc:1679 +#: audio_diskstream.cc:1677 msgid "programmer error: %1" msgstr "bÅ‚Ä…d programisty: %1" -#: audio_diskstream.cc:1905 +#: audio_diskstream.cc:1903 msgid "AudioDiskstream: channel %1 out of range" msgstr "" -#: audio_diskstream.cc:1919 midi_diskstream.cc:1210 +#: audio_diskstream.cc:1917 midi_diskstream.cc:1209 msgid "%1:%2 new capture file not initialized correctly" msgstr "" -#: audio_diskstream.cc:2200 +#: audio_diskstream.cc:2198 msgid "%1: cannot restore pending capture source file %2" msgstr "" -#: audio_diskstream.cc:2222 +#: audio_diskstream.cc:2220 msgid "%1: incorrect number of pending sources listed - ignoring them all" msgstr "" -#: audio_diskstream.cc:2246 +#: audio_diskstream.cc:2244 msgid "%1: cannot create whole-file region from pending capture sources" msgstr "" -#: audio_library.cc:71 +#: audio_library.cc:81 msgid "Could not open %1. Audio Library not saved" msgstr "" @@ -117,11 +117,11 @@ msgstr "" msgid "Audio Playlists (unused)" msgstr "" -#: audio_playlist_source.cc:171 audiosource.cc:913 file_source.cc:529 +#: audio_playlist_source.cc:171 audiosource.cc:891 file_source.cc:520 #: midi_playlist_source.cc:144 midi_playlist_source.cc:152 -#: midi_playlist_source.cc:159 midi_source.cc:371 plugin_insert.cc:643 -#: rb_effect.cc:333 session.cc:2619 session.cc:2652 session.cc:3797 -#: session_handle.cc:87 sndfilesource.cc:121 +#: midi_playlist_source.cc:159 midi_source.cc:370 plugin_insert.cc:634 +#: rb_effect.cc:333 session.cc:2636 session.cc:2669 session.cc:3814 +#: session_handle.cc:87 sndfilesource.cc:122 msgid "programming error: %1" msgstr "" @@ -145,23 +145,23 @@ msgid "" "Channels: " msgstr "" -#: audio_track.cc:167 +#: audio_track.cc:161 msgid "Unknown bundle \"%1\" listed for input of %2" msgstr "" -#: audio_track.cc:169 +#: audio_track.cc:163 msgid "in 1" msgstr "wejÅ›cie 1" -#: audio_track.cc:170 +#: audio_track.cc:164 msgid "No input bundles available as a replacement" msgstr "" -#: audio_track.cc:174 +#: audio_track.cc:168 msgid "Bundle %1 was not available - \"in 1\" used instead" msgstr "" -#: audio_track.cc:183 +#: audio_track.cc:177 msgid "improper input channel list in XML node (%1)" msgstr "" @@ -185,23 +185,23 @@ msgstr "" msgid "VAMP Plugin \"%1\" could not be loaded" msgstr "" -#: audioengine.cc:488 +#: audioengine.cc:495 msgid "looking for backends in %1\n" msgstr "" -#: audioengine.cc:511 +#: audioengine.cc:518 msgid "AudioEngine: cannot load module \"%1\" (%2)" msgstr "" -#: audioengine.cc:517 +#: audioengine.cc:524 msgid "AudioEngine: backend at \"%1\" has no descriptor function." msgstr "" -#: audioengine.cc:589 +#: audioengine.cc:596 msgid "Could not create backend for %1: %2" msgstr "" -#: audioregion.cc:1643 +#: audioregion.cc:1651 msgid "" "You have requested an operation that requires audio analysis.\n" "\n" @@ -216,11 +216,11 @@ msgid "" "this and future transient-detection operations.\n" msgstr "" -#: audiosource.cc:199 +#: audiosource.cc:210 msgid "cannot rename peakfile for %1 from %2 to %3 (%4)" msgstr "" -#: audiosource.cc:226 +#: audiosource.cc:239 msgid "AudioSource: cannot stat peakfile \"%1\"" msgstr "" @@ -228,47 +228,68 @@ msgstr "" msgid "cannot read sample data for unscaled peak computation" msgstr "" -#: audiosource.cc:387 +#: audiosource.cc:386 msgid "AudioSource: cannot open peakpath (a) \"%1\" (%2)" msgstr "" -#: audiosource.cc:463 +#: audiosource.cc:395 audiosource.cc:473 +msgid "" +"AudioSource: could not seek to correct location in peak file \"%1\" (%2)" +msgstr "" + +#: audiosource.cc:453 msgid "AudioSource: cannot open peakpath (b) \"%1\" (%2)" msgstr "" -#: audiosource.cc:587 +#: audiosource.cc:567 msgid "" "AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)" msgstr "" -#: audiosource.cc:667 +#: audiosource.cc:634 msgid "%1: could not write read raw data for peak computation (%2)" msgstr "" -#: audiosource.cc:706 +#: audiosource.cc:672 msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)" msgstr "" -#: audiosource.cc:773 audiosource.cc:886 +#: audiosource.cc:739 audiosource.cc:861 +msgid "%1: could not seek in peak file data (%2)" +msgstr "" + +#: audiosource.cc:744 audiosource.cc:870 msgid "%1: could not write peak file data (%2)" msgstr "" -#: audiosource.cc:924 +#: audiosource.cc:903 msgid "could not truncate peakfile %1 to %2 (error: %3)" msgstr "" -#: auditioner.cc:87 -msgid "no outputs available for auditioner - manual connection required" +#: auditioner.cc:95 +msgid "Falling back to Reasonable Synth for Midi Audition" +msgstr "" + +#: auditioner.cc:97 +msgid "No synth for midi-audition found." msgstr "" -#: auditioner.cc:135 -msgid "Auditioning of non-audio regions not yet supported" +#: auditioner.cc:152 +msgid "no outputs available for auditioner - manual connection required" msgstr "" -#: auditioner.cc:160 +#: auditioner.cc:392 auditioner.cc:438 msgid "Cannot setup auditioner processing flow for %1 channels" msgstr "" +#: auditioner.cc:426 +msgid "Failed to load synth for MIDI-Audition." +msgstr "" + +#: auditioner.cc:445 +msgid "Auditioning of regions other than Audio or Midi is not supported." +msgstr "" + #: automatable.cc:81 msgid "Automation node has no path property" msgstr "" @@ -300,23 +321,23 @@ msgid "" "AutomationList: passed XML node called %1, not \"AutomationList\" - ignored" msgstr "" -#: butler.cc:91 +#: butler.cc:80 msgid "Cannot create transport request signal pipe (%1)" msgstr "" -#: butler.cc:97 butler.cc:103 +#: butler.cc:86 butler.cc:92 msgid "UI: cannot set O_NONBLOCK on butler request pipe (%1)" msgstr "" -#: butler.cc:109 +#: butler.cc:124 msgid "Session: could not create butler thread" msgstr "" -#: butler.cc:156 +#: butler.cc:165 msgid "poll on butler request pipe failed (%1)" msgstr "" -#: butler.cc:163 +#: butler.cc:172 msgid "Error on butler thread request pipe: fd=%1 err=%2" msgstr "" @@ -324,55 +345,55 @@ msgstr "" msgid "Error reading from butler request pipe" msgstr "" -#: butler.cc:248 +#: butler.cc:301 msgid "Butler read ahead failure on dstream %1" msgstr "" -#: butler.cc:285 +#: butler.cc:338 msgid "Butler write-behind failure on dstream %1" msgstr "" -#: control_protocol_manager.cc:134 +#: control_protocol_manager.cc:164 msgid "control protocol name \"%1\" has no descriptor" msgstr "" -#: control_protocol_manager.cc:141 +#: control_protocol_manager.cc:171 msgid "control protocol name \"%1\" could not be initialized" msgstr "" -#: control_protocol_manager.cc:201 +#: control_protocol_manager.cc:237 msgid "Instantiating mandatory control protocol %1" msgstr "" -#: control_protocol_manager.cc:222 +#: control_protocol_manager.cc:258 msgid "looking for control protocols in %1\n" msgstr "" -#: control_protocol_manager.cc:247 +#: control_protocol_manager.cc:283 msgid "Control protocol %1 not usable" msgstr "" -#: control_protocol_manager.cc:264 +#: control_protocol_manager.cc:300 msgid "Control surface protocol discovered: \"%1\"\n" msgstr "" -#: control_protocol_manager.cc:282 +#: control_protocol_manager.cc:318 msgid "ControlProtocolManager: cannot load module \"%1\" (%2)" msgstr "" -#: control_protocol_manager.cc:290 +#: control_protocol_manager.cc:324 msgid "ControlProtocolManager: module \"%1\" has no descriptor function." msgstr "" -#: cycle_timer.cc:38 +#: cycle_timer.cc:40 msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo" msgstr "" -#: cycle_timer.cc:50 +#: cycle_timer.cc:52 msgid "CycleTimer::get_mhz(): cannot locate cpu MHz in /proc/cpuinfo" msgstr "" -#: cycle_timer.cc:73 +#: cycle_timer.cc:75 msgid "cannot locate cpu MHz in /proc/cpuinfo" msgstr "nie można zlokalizować taktowania CPU w /proc/cpuinfo" @@ -380,7 +401,7 @@ msgstr "nie można zlokalizować taktowania CPU w /proc/cpuinfo" msgid "audio" msgstr "" -#: data_type.cc:28 session.cc:1791 session.cc:1794 +#: data_type.cc:28 session.cc:1808 session.cc:1811 msgid "MIDI" msgstr "" @@ -388,15 +409,15 @@ msgstr "" msgid "unknown" msgstr "" -#: delivery.cc:114 +#: delivery.cc:118 msgid "main outs" msgstr "" -#: delivery.cc:117 send.cc:61 +#: delivery.cc:121 send.cc:62 msgid "listen" msgstr "" -#: diskstream.cc:303 +#: diskstream.cc:302 msgid "Location \"%1\" not valid for track loop (start >= end)" msgstr "" @@ -408,23 +429,23 @@ msgstr "" msgid "Export failed: %1" msgstr "" -#: export_filename.cc:118 +#: export_filename.cc:119 msgid "Existing export folder for this session (%1) does not exist - ignored" msgstr "" -#: export_filename.cc:229 +#: export_filename.cc:230 msgid "No Time" msgstr "" -#: export_filename.cc:238 +#: export_filename.cc:239 msgid "Invalid time format" msgstr "" -#: export_filename.cc:247 +#: export_filename.cc:248 msgid "No Date" msgstr "" -#: export_filename.cc:262 +#: export_filename.cc:263 msgid "Invalid date format" msgstr "" @@ -492,7 +513,7 @@ msgstr "" msgid "Rectangular" msgstr "" -#: export_formats.cc:52 session.cc:5014 session.cc:5030 +#: export_formats.cc:52 session.cc:5006 session.cc:5022 msgid "None" msgstr "" @@ -532,15 +553,15 @@ msgstr "" msgid "No sample format" msgstr "" -#: export_handler.cc:335 +#: export_handler.cc:343 msgid "Editor: cannot open \"%1\" as export file for CD marker file" msgstr "" -#: export_handler.cc:417 export_handler.cc:420 +#: export_handler.cc:425 export_handler.cc:428 msgid "an error occured while writing a TOC/CUE file: %1" msgstr "" -#: export_handler.cc:642 export_handler.cc:700 +#: export_handler.cc:650 export_handler.cc:708 msgid "Cannot convert %1 to Latin-1 text" msgstr "" @@ -602,7 +623,7 @@ msgid "" "configuration" msgstr "" -#: file_source.cc:198 session_state.cc:2807 +#: file_source.cc:198 session_state.cc:2843 msgid "" "there are already 1000 files with names like %1; versioning discontinued" msgstr "" @@ -611,35 +632,35 @@ msgstr "" msgid "cannot rename file source from %1 to %2 (%3)" msgstr "" -#: file_source.cc:250 file_source.cc:378 +#: file_source.cc:248 file_source.cc:372 msgid "FileSource: search path not set" msgstr "" -#: file_source.cc:313 file_source.cc:448 -msgid "Filesource: cannot find required file (%1): while searching %2" +#: file_source.cc:309 file_source.cc:439 +msgid "Filesource: cannot find required file (%1)" msgstr "" -#: file_source.cc:440 +#: file_source.cc:432 msgid "" -"FileSource: \"%1\" is ambigous when searching %2\n" +"FileSource: \"%1\" is ambigous when searching\n" "\t" msgstr "" -#: file_source.cc:494 +#: file_source.cc:484 msgid "Filesource: cannot find required file (%1): %2" msgstr "" -#: file_source.cc:501 +#: file_source.cc:492 msgid "Filesource: cannot check for existing file (%1): %2" msgstr "" -#: file_source.cc:535 +#: file_source.cc:526 msgid "" "Programming error! %1 tried to rename a file over another file! It's safe to " "continue working, but please report this to the developers." msgstr "" -#: file_source.cc:540 +#: file_source.cc:531 msgid "cannot rename file %1 to %2 (%3)" msgstr "" @@ -653,15 +674,15 @@ msgid "" "cannot run" msgstr "" -#: filesystem_paths.cc:91 +#: filesystem_paths.cc:96 msgid "ARDOUR_DLL_PATH not set in environment - exiting\n" msgstr "" -#: filesystem_paths.cc:107 +#: filesystem_paths.cc:125 msgid "ARDOUR_CONFIG_PATH not set in environment - exiting\n" msgstr "" -#: filesystem_paths.cc:127 +#: filesystem_paths.cc:148 msgid "ARDOUR_DATA_PATH not set in environment - exiting\n" msgstr "" @@ -673,87 +694,83 @@ msgstr "" msgid "filter: error creating new file %1 (%2)" msgstr "" -#: find_session.cc:51 -msgid "Could not resolve path: %1 (%2)" -msgstr "" - -#: find_session.cc:63 +#: find_session.cc:59 msgid "cannot check session path %1 (%2)" msgstr "" -#: find_session.cc:89 +#: find_session.cc:85 msgid "cannot check statefile %1 (%2)" msgstr "" -#: find_session.cc:125 +#: find_session.cc:121 msgid "%1 is not a snapshot file" msgstr "" -#: find_session.cc:142 +#: find_session.cc:138 msgid "cannot determine current working directory (%1)" msgstr "" -#: find_session.cc:159 +#: find_session.cc:155 msgid "unknown file type for session %1" msgstr "" -#: globals.cc:207 +#: globals.cc:216 msgid "Could not set system open files limit to \"unlimited\"" msgstr "" -#: globals.cc:209 +#: globals.cc:218 msgid "Could not set system open files limit to %1" msgstr "" -#: globals.cc:213 +#: globals.cc:222 msgid "Your system is configured to limit %1 to only %2 open files" msgstr "" -#: globals.cc:217 +#: globals.cc:226 msgid "Could not get system open files limit (%1)" msgstr "" -#: globals.cc:268 +#: globals.cc:280 msgid "Loading configuration" msgstr "" -#: import.cc:207 +#: import.cc:208 msgid "Could not find a source for %1 even though we are updating this file!" msgstr "" -#: import.cc:236 +#: import.cc:237 msgid "Unable to create file %1 during import" msgstr "" -#: import.cc:262 +#: import.cc:263 msgid "Resampling %1 from %2kHz to %3kHz" msgstr "" -#: import.cc:268 +#: import.cc:269 msgid "Copying %1" msgstr "" -#: import.cc:446 +#: import.cc:455 msgid "Track %1 of %2 contained no usable MIDI data" msgstr "" -#: import.cc:453 +#: import.cc:462 msgid "MIDI file %1 was not readable (no reason available)" msgstr "" -#: import.cc:499 +#: import.cc:508 msgid "Import: cannot open input sound file \"%1\"" msgstr "" -#: import.cc:510 +#: import.cc:519 msgid "Import: error opening MIDI file" msgstr "" -#: import.cc:549 +#: import.cc:558 msgid "Loading MIDI file %1" msgstr "" -#: import.cc:614 +#: import.cc:623 msgid "Failed to remove some files after failed/cancelled import operation" msgstr "" @@ -765,153 +782,153 @@ msgstr "" msgid "preset %1 (bank %2)" msgstr "" -#: internal_send.cc:278 internal_send.cc:279 +#: internal_send.cc:300 internal_send.cc:301 msgid "%1 - cannot find any track/bus with the ID %2 to connect to" msgstr "" -#: io.cc:208 +#: io.cc:209 msgid "IO: cannot disconnect port %1 from %2" msgstr "" -#: io.cc:343 io.cc:428 +#: io.cc:344 io.cc:431 msgid "IO: cannot register input port %1" msgstr "" -#: io.cc:348 io.cc:433 +#: io.cc:349 io.cc:436 msgid "IO: cannot register output port %1" msgstr "" -#: io.cc:591 io.cc:647 +#: io.cc:598 io.cc:654 msgid "incorrect XML node \"%1\" passed to IO object" msgstr "" -#: io.cc:706 +#: io.cc:713 msgid "in" msgstr "wejÅ›cie" -#: io.cc:706 +#: io.cc:713 msgid "out" msgstr "wyjÅ›cie" -#: io.cc:707 +#: io.cc:714 msgid "input" msgstr "" -#: io.cc:707 +#: io.cc:714 msgid "output" msgstr "" -#: io.cc:717 +#: io.cc:724 msgid "Unknown bundle \"%1\" listed for %2 of %3" msgstr "" -#: io.cc:783 +#: io.cc:790 msgid "Bundle %1 was not available - \"%2\" used instead" msgstr "" -#: io.cc:786 +#: io.cc:793 msgid "No %1 bundles available as a replacement" msgstr "" -#: io.cc:889 +#: io.cc:896 msgid "%1: cannot create I/O ports" msgstr "" -#: io.cc:1017 io.cc:1121 +#: io.cc:1024 io.cc:1128 msgid "IO: badly formed string in XML node for inputs \"%1\"" msgstr "" -#: io.cc:1022 io.cc:1126 +#: io.cc:1029 io.cc:1133 msgid "bad input string in XML node \"%1\"" msgstr "" -#: io.cc:1060 +#: io.cc:1067 msgid "IO: badly formed string in XML node for outputs \"%1\"" msgstr "" -#: io.cc:1065 +#: io.cc:1072 msgid "IO: bad output string in XML node \"%1\"" msgstr "" -#: io.cc:1411 +#: io.cc:1417 #, c-format msgid "%s %u" msgstr "%s %u" -#: io.cc:1458 +#: io.cc:1464 #, c-format msgid "%s in" msgstr "" -#: io.cc:1460 +#: io.cc:1466 #, c-format msgid "%s out" msgstr "" -#: io.cc:1535 session.cc:686 session.cc:715 +#: io.cc:1541 session.cc:689 session.cc:718 msgid "mono" msgstr "" -#: io.cc:1537 session.cc:699 session.cc:729 +#: io.cc:1543 session.cc:702 session.cc:732 msgid "L" msgstr "" -#: io.cc:1537 session.cc:701 session.cc:731 +#: io.cc:1543 session.cc:704 session.cc:734 msgid "R" msgstr "" -#: io.cc:1539 io.cc:1545 +#: io.cc:1545 io.cc:1551 #, c-format msgid "%d" msgstr "" -#: ladspa_plugin.cc:86 +#: ladspa_plugin.cc:93 +msgid "LADSPA: Unable to open module: " +msgstr "" + +#: ladspa_plugin.cc:99 msgid "LADSPA: module has no descriptor function." msgstr "" -#: ladspa_plugin.cc:91 +#: ladspa_plugin.cc:106 msgid "LADSPA: plugin has gone away since discovery!" msgstr "" -#: ladspa_plugin.cc:98 +#: ladspa_plugin.cc:113 msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing" msgstr "" -#: ladspa_plugin.cc:297 +#: ladspa_plugin.cc:311 msgid "" "illegal parameter number used with plugin \"%1\". This may indicate a change " "in the plugin design, and presets may be invalid" msgstr "" -#: ladspa_plugin.cc:376 ladspa_plugin.cc:426 +#: ladspa_plugin.cc:390 ladspa_plugin.cc:440 msgid "Bad node sent to LadspaPlugin::set_state" msgstr "" -#: ladspa_plugin.cc:391 ladspa_plugin.cc:440 +#: ladspa_plugin.cc:405 ladspa_plugin.cc:454 msgid "LADSPA: no ladspa port number" msgstr "" -#: ladspa_plugin.cc:397 ladspa_plugin.cc:446 +#: ladspa_plugin.cc:411 ladspa_plugin.cc:460 msgid "LADSPA: no ladspa port data" msgstr "" -#: ladspa_plugin.cc:717 -msgid "LADSPA: cannot load module from \"%1\"" -msgstr "" - -#: ladspa_plugin.cc:827 +#: ladspa_plugin.cc:840 msgid "Could not locate HOME. Preset not removed." msgstr "" -#: ladspa_plugin.cc:864 ladspa_plugin.cc:870 +#: ladspa_plugin.cc:879 ladspa_plugin.cc:885 msgid "Could not create %1. Preset not saved. (%2)" msgstr "" -#: ladspa_plugin.cc:877 +#: ladspa_plugin.cc:892 msgid "Error saving presets file %1." msgstr "" -#: ladspa_plugin.cc:915 +#: ladspa_plugin.cc:934 msgid "Could not locate HOME. Preset not saved." msgstr "" @@ -951,7 +968,7 @@ msgstr "" msgid "incorrect XML mode passed to Locations::set_state" msgstr "" -#: location.cc:842 session.cc:4516 session_state.cc:1031 +#: location.cc:842 session.cc:4533 session_state.cc:1025 msgid "session" msgstr "" @@ -1006,40 +1023,39 @@ msgid "Session and LTC framerate mismatch: LTC:%1 Session:%2." msgstr "" #: ltc_slave.cc:591 -#, c-format msgid "flywheel" msgstr "" -#: midi_diskstream.cc:167 +#: midi_diskstream.cc:166 msgid "" "%1: I/O configuration change %4 requested to use %2, but channel setup is %3" msgstr "" -#: midi_diskstream.cc:219 +#: midi_diskstream.cc:218 msgid "MidiDiskstream: Playlist \"%1\" isn't a midi playlist" msgstr "" -#: midi_diskstream.cc:270 +#: midi_diskstream.cc:269 msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!" msgstr "" -#: midi_diskstream.cc:699 +#: midi_diskstream.cc:698 msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3" msgstr "" -#: midi_diskstream.cc:834 +#: midi_diskstream.cc:833 msgid "MidiDiskstream %1: cannot write to disk" msgstr "" -#: midi_diskstream.cc:868 +#: midi_diskstream.cc:867 msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!" msgstr "" -#: midi_diskstream.cc:955 +#: midi_diskstream.cc:954 msgid "%1: could not create region for complete midi file" msgstr "" -#: midi_diskstream.cc:992 +#: midi_diskstream.cc:991 msgid "MidiDiskstream: could not create region for captured midi!" msgstr "" @@ -1051,27 +1067,27 @@ msgstr "" msgid "No SysExID found for sys-ex property change - ignored" msgstr "" -#: midi_model.cc:2010 +#: midi_model.cc:2012 msgid "transpose" msgstr "" -#: midi_patch_manager.cc:126 +#: midi_patch_manager.cc:127 msgid "Duplicate MIDI device `%1' in `%2' ignored" msgstr "" -#: midi_source.cc:125 +#: midi_source.cc:124 msgid "Missing parameter property on InterpolationStyle" msgstr "" -#: midi_source.cc:132 +#: midi_source.cc:131 msgid "Missing style property on InterpolationStyle" msgstr "" -#: midi_source.cc:144 +#: midi_source.cc:143 msgid "Missing parameter property on AutomationState" msgstr "" -#: midi_source.cc:151 +#: midi_source.cc:150 msgid "Missing state property on AutomationState" msgstr "" @@ -1115,21 +1131,21 @@ msgstr "" msgid "solo control" msgstr "" -#: mtc_slave.cc:238 +#: mtc_slave.cc:240 msgid "MTC Slave: atomic read of current time failed, sleeping!" msgstr "" -#: mtc_slave.cc:361 +#: mtc_slave.cc:362 msgid "" "Unknown rate/drop value %1 in incoming MTC stream, session values used " "instead" msgstr "" -#: mtc_slave.cc:381 +#: mtc_slave.cc:382 msgid "Session framerate adjusted from %1 TO: MTC's %2." msgstr "" -#: mtc_slave.cc:395 +#: mtc_slave.cc:396 msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3." msgstr "" @@ -1189,31 +1205,35 @@ msgstr "" msgid "Pannable given XML data for %1 - ignored" msgstr "" -#: panner_manager.cc:76 -msgid "looking for panners in %1" +#: panner_manager.cc:80 +msgid "looking for panners in %1\n" msgstr "" -#: panner_manager.cc:100 -msgid "Panner discovered: \"%1\" in %2" +#: panner_manager.cc:108 +msgid "Panner discovered: \"%1\" in %2\n" msgstr "" -#: panner_manager.cc:117 +#: panner_manager.cc:125 msgid "PannerManager: cannot load module \"%1\" (%2)" msgstr "" -#: panner_manager.cc:124 +#: panner_manager.cc:132 msgid "PannerManager: module \"%1\" has no descriptor function." msgstr "" -#: panner_manager.cc:187 +#: panner_manager.cc:219 msgid "no panner discovered for in/out = %1/%2" msgstr "" -#: panner_shell.cc:179 +#: panner_shell.cc:126 +msgid "select panner: %1\n" +msgstr "" + +#: panner_shell.cc:245 msgid "Unknown panner plugin \"%1\" found in pan state - ignored" msgstr "" -#: panner_shell.cc:185 +#: panner_shell.cc:251 msgid "panner plugin node has no type information!" msgstr "" @@ -1233,19 +1253,19 @@ msgstr "" msgid "Could not construct playlist for PlaylistSource from session data!" msgstr "" -#: plugin.cc:324 +#: plugin.cc:328 msgid "" "Plugin presets are not supported in this build of %1. Consider paying for a " "full version" msgstr "" -#: plugin.cc:398 +#: plugin.cc:402 msgid "" "Saving plugin settings is not supported in this build of %1. Consider paying " "for the full version" msgstr "" -#: plugin_insert.cc:598 +#: plugin_insert.cc:589 msgid "programming error: " msgstr "" @@ -1279,43 +1299,43 @@ msgstr "" msgid "PluginInsert: automatable control %1 not found - ignored" msgstr "" -#: plugin_manager.cc:161 +#: plugin_manager.cc:165 msgid "Discovering Plugins" msgstr "" -#: plugin_manager.cc:335 +#: plugin_manager.cc:286 msgid "Could not parse rdf file: %1" msgstr "" -#: plugin_manager.cc:374 +#: plugin_manager.cc:330 msgid "LADSPA: cannot load module \"%1\" (%2)" msgstr "" -#: plugin_manager.cc:381 +#: plugin_manager.cc:337 msgid "LADSPA: module \"%1\" has no descriptor function." msgstr "" -#: plugin_manager.cc:602 +#: plugin_manager.cc:567 msgid "" "VST plugin %1 does not support processReplacing, and so cannot be used in %2 " "at this time" msgstr "" -#: plugin_manager.cc:709 +#: plugin_manager.cc:680 msgid "" "linuxVST plugin %1 does not support processReplacing, and so cannot be used " "in %2 at this time" msgstr "" -#: plugin_manager.cc:870 +#: plugin_manager.cc:841 msgid "unknown plugin status type \"%1\" - all entries ignored" msgstr "" -#: plugin_manager.cc:887 +#: plugin_manager.cc:858 msgid "unknown plugin type \"%1\" - ignored" msgstr "" -#: port.cc:410 +#: port.cc:412 msgid "could not reregister %1" msgstr "nie można byÅ‚o zarejestrować %1" @@ -1323,11 +1343,11 @@ msgstr "nie można byÅ‚o zarejestrować %1" msgid "insert %1" msgstr "" -#: port_insert.cc:198 +#: port_insert.cc:197 msgid "XML node describing port insert is missing the `type' field" msgstr "" -#: port_insert.cc:203 +#: port_insert.cc:202 msgid "non-port insert XML used for port plugin insert" msgstr "" @@ -1359,11 +1379,11 @@ msgstr "" msgid "Re-establising port %1 failed" msgstr "" -#: processor.cc:207 +#: processor.cc:208 msgid "No %1 property flag in element %2" msgstr "" -#: processor.cc:216 +#: processor.cc:217 msgid "No child node with active property" msgstr "" @@ -1427,11 +1447,11 @@ msgstr "" msgid "cannot create new name for region \"%1\"" msgstr "" -#: resampled_source.cc:98 +#: resampled_source.cc:102 msgid "Import: %1" msgstr "" -#: resampled_source.cc:128 +#: resampled_source.cc:132 srcfilesource.cc:76 msgid "Import: src_new() failed : %1" msgstr "" @@ -1439,27 +1459,27 @@ msgstr "" msgid "return %1" msgstr "" -#: route.cc:1075 route.cc:2528 +#: route.cc:1081 route.cc:2541 msgid "unknown Processor type \"%1\"; ignored" msgstr "" -#: route.cc:1087 +#: route.cc:1093 msgid "processor could not be created. Ignored." msgstr "" -#: route.cc:1962 route.cc:2187 +#: route.cc:1975 route.cc:2200 msgid "Bad node sent to Route::set_state() [%1]" msgstr "" -#: route.cc:2022 +#: route.cc:2035 msgid "Pannable state found for route (%1) without a panner!" msgstr "" -#: route.cc:2096 route.cc:2100 route.cc:2301 route.cc:2305 +#: route.cc:2109 route.cc:2113 route.cc:2314 route.cc:2318 msgid "badly formed order key string in state file! [%1] ... ignored." msgstr "" -#: route.cc:2311 +#: route.cc:2324 msgid "Converting deprecated order key for %1 using Editor order %2" msgstr "" @@ -1475,15 +1495,15 @@ msgstr "" msgid "error writing tempo-adjusted data to %1" msgstr "" -#: send.cc:59 +#: send.cc:60 msgid "aux %1" msgstr "" -#: send.cc:63 +#: send.cc:64 msgid "send %1" msgstr "" -#: send.cc:65 +#: send.cc:66 msgid "programming error: send created using role %1" msgstr "" @@ -1507,147 +1527,147 @@ msgstr "" msgid "Set up standard connections" msgstr "" -#: session.cc:635 +#: session.cc:638 msgid "could not setup Click I/O" msgstr "nie można byÅ‚o ustawić I/O metronomu" -#: session.cc:683 +#: session.cc:686 #, c-format msgid "out %<PRIu32>" msgstr "wyjÅ›cie %<PRIu32>" -#: session.cc:697 +#: session.cc:700 #, c-format msgid "out %<PRIu32>+%<PRIu32>" msgstr "wyjÅ›cie %<PRIu32>+%<PRIu32>" -#: session.cc:712 +#: session.cc:715 #, c-format msgid "in %<PRIu32>" msgstr "wejÅ›cie %<PRIu32>" -#: session.cc:726 +#: session.cc:729 #, c-format msgid "in %<PRIu32>+%<PRIu32>" msgstr "wejÅ›cie %<PRIu32>+%<PRIu32>" -#: session.cc:790 +#: session.cc:793 msgid "cannot connect master output %1 to %2" msgstr "" -#: session.cc:849 +#: session.cc:862 msgid "monitor" msgstr "monitor" -#: session.cc:894 +#: session.cc:907 msgid "cannot connect control input %1 to %2" msgstr "" -#: session.cc:914 +#: session.cc:927 msgid "The preferred I/O for the monitor bus (%1) cannot be found" msgstr "" -#: session.cc:945 +#: session.cc:958 msgid "cannot connect control output %1 to %2" msgstr "" -#: session.cc:1009 +#: session.cc:1026 msgid "cannot create Auditioner: no auditioning of regions possible" msgstr "" -#: session.cc:1193 +#: session.cc:1210 msgid "Session: you can't use that location for auto punch (start <= end)" msgstr "" -#: session.cc:1233 +#: session.cc:1250 msgid "" "You cannot use this location for auto-loop because it has zero or negative " "length" msgstr "" -#: session.cc:1547 +#: session.cc:1564 msgid "feedback loop setup between %1 and %2" msgstr "" -#: session.cc:1843 +#: session.cc:1860 msgid "Session: could not create new midi track." msgstr "" -#: session.cc:1849 +#: session.cc:1866 msgid "" "No more JACK ports are available. You will need to stop %1 and restart JACK " "with more ports if you need this many tracks." msgstr "" -#: session.cc:2026 session.cc:2029 +#: session.cc:2043 session.cc:2046 msgid "Audio" msgstr "" -#: session.cc:2053 session.cc:2061 session.cc:2138 session.cc:2146 +#: session.cc:2070 session.cc:2078 session.cc:2155 session.cc:2163 msgid "cannot configure %1 in/%2 out configuration for new audio track" msgstr "" -#: session.cc:2084 +#: session.cc:2101 msgid "Session: could not create new audio track." msgstr "" -#: session.cc:2116 session.cc:2119 +#: session.cc:2133 session.cc:2136 msgid "Bus" msgstr "" -#: session.cc:2169 +#: session.cc:2186 msgid "Session: could not create new audio route." msgstr "" -#: session.cc:2228 session.cc:2238 +#: session.cc:2245 session.cc:2255 msgid "Session: UINT_MAX routes? impossible!" msgstr "" -#: session.cc:2260 +#: session.cc:2277 msgid "Session: cannot create track/bus from template description" msgstr "" -#: session.cc:2286 +#: session.cc:2303 msgid "Session: could not create new route from template" msgstr "" -#: session.cc:2315 +#: session.cc:2332 msgid "Adding new tracks/busses failed" msgstr "" -#: session.cc:3419 +#: session.cc:3436 msgid "FATAL ERROR! Could not find a suitable version of %1 for a rename" msgstr "" -#: session.cc:3539 session.cc:3597 +#: session.cc:3556 session.cc:3614 msgid "There are already %1 recordings for %2, which I consider too many." msgstr "" -#: session.cc:3987 +#: session.cc:4004 msgid "send ID %1 appears to be in use already" msgstr "" -#: session.cc:3999 +#: session.cc:4016 msgid "aux send ID %1 appears to be in use already" msgstr "" -#: session.cc:4011 +#: session.cc:4028 msgid "return ID %1 appears to be in use already" msgstr "" -#: session.cc:4023 +#: session.cc:4040 msgid "insert ID %1 appears to be in use already" msgstr "" -#: session.cc:4150 +#: session.cc:4167 msgid "Cannot write a range where end <= start (e.g. %1 <= %2)" msgstr "" -#: session.cc:4179 +#: session.cc:4196 msgid "too many bounced versions of playlist \"%1\"" msgstr "" -#: session.cc:4189 +#: session.cc:4206 msgid "cannot create new audio file \"%1\" for %2" msgstr "" @@ -1682,7 +1702,7 @@ msgstr "" msgid "Session subdirectory does not exist at path %1" msgstr "" -#: session_events.cc:184 +#: session_events.cc:185 msgid "Session: cannot have two events of type %1 at the same frame (%2)." msgstr "" @@ -1694,13 +1714,13 @@ msgstr "" msgid "Export ended unexpectedly: %1" msgstr "" -#: session_ltc.cc:222 +#: session_ltc.cc:221 msgid "" "LTC encoder: invalid framerate - LTC encoding is disabled for the remainder " "of this session." msgstr "" -#: session_midi.cc:520 +#: session_midi.cc:519 msgid "Session: cannot send quarter-frame MTC message (%1)" msgstr "" @@ -1712,350 +1732,342 @@ msgstr "" msgid "Session: error in no roll for %1" msgstr "" -#: session_process.cc:1157 +#: session_process.cc:1159 msgid "Programming error: illegal event type in process_event (%1)" msgstr "" -#: session_state.cc:140 -msgid "Could not use path %1 (%2)" -msgstr "" - -#: session_state.cc:184 +#: session_state.cc:178 msgid "solo cut control (dB)" msgstr "" -#: session_state.cc:208 +#: session_state.cc:202 msgid "Set block size and sample rate" msgstr "" -#: session_state.cc:213 +#: session_state.cc:207 msgid "Using configuration" msgstr "" -#: session_state.cc:325 +#: session_state.cc:319 msgid "Reset Remote Controls" msgstr "" -#: session_state.cc:417 +#: session_state.cc:411 msgid "Session: cannot create session peakfile folder \"%1\" (%2)" msgstr "" -#: session_state.cc:424 +#: session_state.cc:418 msgid "Session: cannot create session sounds dir \"%1\" (%2)" msgstr "" -#: session_state.cc:431 +#: session_state.cc:425 msgid "Session: cannot create session midi dir \"%1\" (%2)" msgstr "" -#: session_state.cc:438 +#: session_state.cc:432 msgid "Session: cannot create session dead sounds folder \"%1\" (%2)" msgstr "" -#: session_state.cc:445 +#: session_state.cc:439 msgid "Session: cannot create session export folder \"%1\" (%2)" msgstr "" -#: session_state.cc:452 +#: session_state.cc:446 msgid "Session: cannot create session analysis folder \"%1\" (%2)" msgstr "" -#: session_state.cc:459 +#: session_state.cc:453 msgid "Session: cannot create session plugins folder \"%1\" (%2)" msgstr "" -#: session_state.cc:466 +#: session_state.cc:460 msgid "Session: cannot create session externals folder \"%1\" (%2)" msgstr "" -#: session_state.cc:480 +#: session_state.cc:474 msgid "Session: cannot create session folder \"%1\" (%2)" msgstr "" -#: session_state.cc:514 +#: session_state.cc:508 msgid "Could not open %1 for writing session template" msgstr "" -#: session_state.cc:520 +#: session_state.cc:514 msgid "Could not open session template %1 for reading" msgstr "" -#: session_state.cc:539 +#: session_state.cc:533 msgid "master" msgstr "główna" -#: session_state.cc:600 +#: session_state.cc:594 msgid "Could not remove pending capture state at path \"%1\" (%2)" msgstr "" -#: session_state.cc:624 +#: session_state.cc:618 msgid "could not rename snapshot %1 to %2 (%3)" msgstr "" -#: session_state.cc:652 +#: session_state.cc:646 msgid "Could not remove session file at path \"%1\" (%2)" msgstr "" -#: session_state.cc:669 +#: session_state.cc:663 msgid "" "the %1 audio engine is not connected and state saving would lose all I/O " "connections. Session not saved" msgstr "" -#: session_state.cc:720 +#: session_state.cc:714 msgid "state could not be saved to %1" msgstr "" -#: session_state.cc:722 session_state.cc:733 +#: session_state.cc:716 session_state.cc:727 msgid "Could not remove temporary session file at path \"%1\" (%2)" msgstr "" -#: session_state.cc:730 -msgid "could not rename temporary session file %1 to %2" +#: session_state.cc:724 +msgid "could not rename temporary session file %1 to %2 (%3)" msgstr "" -#: session_state.cc:798 +#: session_state.cc:792 msgid "%1: session file \"%2\" doesn't exist!" msgstr "" -#: session_state.cc:810 +#: session_state.cc:804 msgid "Could not understand session file %1" msgstr "" -#: session_state.cc:819 +#: session_state.cc:813 msgid "Session file %1 is not a session" msgstr "" -#: session_state.cc:1125 +#: session_state.cc:1119 msgid "programming error: Session: incorrect XML node sent to set_state()" msgstr "" -#: session_state.cc:1179 +#: session_state.cc:1173 msgid "Session: XML state has no options section" msgstr "" -#: session_state.cc:1184 +#: session_state.cc:1178 msgid "Session: XML state has no metadata section" msgstr "" -#: session_state.cc:1195 +#: session_state.cc:1189 msgid "Session: XML state has no sources section" msgstr "" -#: session_state.cc:1202 +#: session_state.cc:1196 msgid "Session: XML state has no Tempo Map section" msgstr "" -#: session_state.cc:1209 +#: session_state.cc:1203 msgid "Session: XML state has no locations section" msgstr "" -#: session_state.cc:1235 +#: session_state.cc:1229 msgid "Session: XML state has no Regions section" msgstr "" -#: session_state.cc:1242 +#: session_state.cc:1236 msgid "Session: XML state has no playlists section" msgstr "" -#: session_state.cc:1262 +#: session_state.cc:1256 msgid "Session: XML state has no bundles section" msgstr "" -#: session_state.cc:1274 +#: session_state.cc:1268 msgid "Session: XML state has no diskstreams section" msgstr "" -#: session_state.cc:1282 +#: session_state.cc:1276 msgid "Session: XML state has no routes section" msgstr "" -#: session_state.cc:1294 +#: session_state.cc:1288 msgid "Session: XML state has no route groups section" msgstr "" -#: session_state.cc:1303 +#: session_state.cc:1297 msgid "Session: XML state has no edit groups section" msgstr "" -#: session_state.cc:1310 +#: session_state.cc:1304 msgid "Session: XML state has no mix groups section" msgstr "" -#: session_state.cc:1318 +#: session_state.cc:1312 msgid "Session: XML state has no click section" msgstr "" -#: session_state.cc:1360 +#: session_state.cc:1354 msgid "Session: cannot create Route from XML description." msgstr "" -#: session_state.cc:1364 +#: session_state.cc:1358 msgid "Loaded track/bus %1" msgstr "" -#: session_state.cc:1462 +#: session_state.cc:1456 msgid "Could not find diskstream for route" msgstr "" -#: session_state.cc:1516 +#: session_state.cc:1510 msgid "Session: cannot create Region from XML description." msgstr "" -#: session_state.cc:1520 +#: session_state.cc:1514 msgid "Can not load state for region '%1'" msgstr "" -#: session_state.cc:1556 +#: session_state.cc:1550 msgid "Regions in compound description not found (ID's %1 and %2): ignored" msgstr "" -#: session_state.cc:1584 +#: session_state.cc:1578 msgid "Nested source has no ID info in session file! (ignored)" msgstr "" -#: session_state.cc:1596 +#: session_state.cc:1590 msgid "Cannot reconstruct nested source for region %1" msgstr "" -#: session_state.cc:1658 +#: session_state.cc:1652 msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)" msgstr "" -#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707 +#: session_state.cc:1660 session_state.cc:1681 session_state.cc:1701 msgid "" "Session: XMLNode describing a AudioRegion references an unknown source id =%1" msgstr "" -#: session_state.cc:1672 session_state.cc:1693 session_state.cc:1713 +#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707 msgid "" "Session: XMLNode describing a AudioRegion references a non-audio source id =" "%1" msgstr "" -#: session_state.cc:1736 +#: session_state.cc:1730 msgid "" "Session: XMLNode describing an AudioRegion is missing some master sources; " "ignored" msgstr "" -#: session_state.cc:1770 +#: session_state.cc:1764 msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)" msgstr "" -#: session_state.cc:1778 +#: session_state.cc:1772 msgid "" "Session: XMLNode describing a MidiRegion references an unknown source id =%1" msgstr "" -#: session_state.cc:1784 +#: session_state.cc:1778 msgid "" "Session: XMLNode describing a MidiRegion references a non-midi source id =%1" msgstr "" -#: session_state.cc:1852 +#: session_state.cc:1846 msgid "" "cannot create new file from region name \"%1\" with ident = \"%2\": too many " "existing files with similar names" msgstr "" -#: session_state.cc:1875 +#: session_state.cc:1869 msgid "Session: cannot create Source from XML description." msgstr "" -#: session_state.cc:1909 +#: session_state.cc:1903 msgid "A sound file is missing. It will be replaced by silence." msgstr "" -#: session_state.cc:1932 +#: session_state.cc:1926 msgid "Found a sound file that cannot be used by %1. Talk to the progammers." msgstr "" -#: session_state.cc:1949 +#: session_state.cc:1943 msgid "Could not create templates directory \"%1\" (%2)" msgstr "" -#: session_state.cc:1962 +#: session_state.cc:1956 msgid "Template \"%1\" already exists - new version not created" msgstr "" -#: session_state.cc:1968 +#: session_state.cc:1962 msgid "Could not create directory for Session template\"%1\" (%2)" msgstr "" -#: session_state.cc:1978 +#: session_state.cc:1972 msgid "template not saved" msgstr "" -#: session_state.cc:1988 +#: session_state.cc:1982 msgid "Could not create directory for Session template plugin state\"%1\" (%2)" msgstr "" -#: session_state.cc:2183 +#: session_state.cc:2225 msgid "Unknown node \"%1\" found in Bundles list from session file" msgstr "" -#: session_state.cc:2725 session_state.cc:2731 -msgid "Cannot expand path %1 (%2)" -msgstr "" - -#: session_state.cc:2784 +#: session_state.cc:2820 msgid "Session: cannot create dead file folder \"%1\" (%2)" msgstr "" -#: session_state.cc:2823 +#: session_state.cc:2859 msgid "cannot rename unused file source from %1 to %2 (%3)" msgstr "" -#: session_state.cc:2841 +#: session_state.cc:2877 msgid "cannot remove peakfile %1 for %2 (%3)" msgstr "" -#: session_state.cc:3143 +#: session_state.cc:3179 msgid "could not backup old history file, current history not saved" msgstr "" -#: session_state.cc:3156 +#: session_state.cc:3192 msgid "history could not be saved to %1" msgstr "" -#: session_state.cc:3159 +#: session_state.cc:3195 msgid "Could not remove history file at path \"%1\" (%2)" msgstr "" -#: session_state.cc:3163 +#: session_state.cc:3199 msgid "could not restore history file from backup %1 (%2)" msgstr "" -#: session_state.cc:3188 +#: session_state.cc:3224 msgid "%1: no history file \"%2\" for this session." msgstr "" -#: session_state.cc:3194 +#: session_state.cc:3230 msgid "Could not understand session history file \"%1\"" msgstr "" -#: session_state.cc:3236 +#: session_state.cc:3272 msgid "Failed to downcast MidiSource for NoteDiffCommand" msgstr "" -#: session_state.cc:3247 +#: session_state.cc:3283 msgid "Failed to downcast MidiSource for SysExDiffCommand" msgstr "" -#: session_state.cc:3258 +#: session_state.cc:3294 msgid "Failed to downcast MidiSource for PatchChangeDiffCommand" msgstr "" -#: session_state.cc:3266 +#: session_state.cc:3302 msgid "Couldn't figure out how to make a Command out of a %1 XMLNode." msgstr "" -#: session_state.cc:3502 +#: session_state.cc:3538 msgid "Session: unknown diskstream type in XML" msgstr "" -#: session_state.cc:3507 +#: session_state.cc:3543 msgid "Session: could not load diskstream via XML state" msgstr "" @@ -2079,198 +2091,206 @@ msgid "" "control" msgstr "" -#: smf_source.cc:252 +#: smf_source.cc:262 msgid "Unable to read event prefix, corrupt MIDI ring" msgstr "" -#: smf_source.cc:265 +#: smf_source.cc:275 msgid "Event has time and size but no body, corrupt MIDI ring" msgstr "" -#: smf_source.cc:271 +#: smf_source.cc:281 msgid "Event time is before MIDI source position" msgstr "" -#: smf_source.cc:306 smf_source.cc:345 +#: smf_source.cc:316 smf_source.cc:355 msgid "Skipping event with unordered time %1" msgstr "" -#: smf_source.cc:410 +#: smf_source.cc:420 msgid "cannot open MIDI file %1 for write" msgstr "" -#: sndfile_helpers.cc:32 +#: sndfile_helpers.cc:34 msgid "WAV" msgstr "WAV" -#: sndfile_helpers.cc:33 +#: sndfile_helpers.cc:35 msgid "AIFF" msgstr "AIFF" -#: sndfile_helpers.cc:34 +#: sndfile_helpers.cc:36 msgid "CAF" msgstr "CAF" -#: sndfile_helpers.cc:35 +#: sndfile_helpers.cc:37 msgid "W64 (64 bit WAV)" msgstr "W64 (64 bit WAV)" -#: sndfile_helpers.cc:36 +#: sndfile_helpers.cc:38 msgid "FLAC" msgstr "" -#: sndfile_helpers.cc:37 +#: sndfile_helpers.cc:39 msgid "Ogg/Vorbis" msgstr "" -#: sndfile_helpers.cc:38 +#: sndfile_helpers.cc:40 msgid "raw (no header)" msgstr "raw (brak nagłówka)" -#: sndfile_helpers.cc:43 +#: sndfile_helpers.cc:45 msgid ".wav" msgstr ".wav" -#: sndfile_helpers.cc:44 +#: sndfile_helpers.cc:46 msgid ".aiff" msgstr ".aiff" -#: sndfile_helpers.cc:45 +#: sndfile_helpers.cc:47 msgid ".caf" msgstr ".caf" -#: sndfile_helpers.cc:46 +#: sndfile_helpers.cc:48 msgid ".w64" msgstr ".w64" -#: sndfile_helpers.cc:47 +#: sndfile_helpers.cc:49 msgid ".flac" msgstr "" -#: sndfile_helpers.cc:48 +#: sndfile_helpers.cc:50 msgid ".ogg" msgstr "" -#: sndfile_helpers.cc:49 +#: sndfile_helpers.cc:51 msgid ".raw" msgstr ".raw" -#: sndfile_helpers.cc:64 +#: sndfile_helpers.cc:66 msgid "Signed 16 bit PCM" msgstr "" -#: sndfile_helpers.cc:65 +#: sndfile_helpers.cc:67 msgid "Signed 24 bit PCM" msgstr "" -#: sndfile_helpers.cc:66 +#: sndfile_helpers.cc:68 msgid "Signed 32 bit PCM" msgstr "" -#: sndfile_helpers.cc:67 +#: sndfile_helpers.cc:69 msgid "Signed 8 bit PCM" msgstr "" -#: sndfile_helpers.cc:68 +#: sndfile_helpers.cc:70 msgid "32 bit float" msgstr "" -#: sndfile_helpers.cc:81 +#: sndfile_helpers.cc:83 msgid "Little-endian (Intel)" msgstr "Little-endian (Intel)" -#: sndfile_helpers.cc:82 +#: sndfile_helpers.cc:84 msgid "Big-endian (PowerPC)" msgstr "" -#: sndfilesource.cc:201 +#: sndfilesource.cc:210 msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)" msgstr "" -#: sndfilesource.cc:209 +#: sndfilesource.cc:218 msgid "" "SndFileSource: file only contains %1 channels; %2 is invalid as a channel " "number" msgstr "" -#: sndfilesource.cc:255 sndfilesource.cc:571 sndfilesource.cc:595 +#: sndfilesource.cc:264 sndfilesource.cc:604 sndfilesource.cc:628 msgid "" "cannot set broadcast info for audio file %1 (%2); dropping broadcast info " "for this file" msgstr "" -#: sndfilesource.cc:302 +#: sndfilesource.cc:311 msgid "could not allocate file %1 for reading." msgstr "" -#: sndfilesource.cc:337 +#: sndfilesource.cc:346 msgid "SndFileSource: could not seek to frame %1 within %2 (%3)" msgstr "" -#: sndfilesource.cc:347 +#: sndfilesource.cc:356 msgid "" "SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)" msgstr "" -#: sndfilesource.cc:391 sndfilesource.cc:420 +#: sndfilesource.cc:400 sndfilesource.cc:429 msgid "attempt to write a non-writable audio file source (%1)" msgstr "" -#: sndfilesource.cc:396 utils.cc:510 utils.cc:534 utils.cc:548 utils.cc:567 +#: sndfilesource.cc:405 utils.cc:547 utils.cc:571 utils.cc:585 utils.cc:604 msgid "programming error: %1 %2" msgstr "" -#: sndfilesource.cc:523 +#: sndfilesource.cc:532 sndfilesource.cc:562 msgid "attempt to flush a non-writable audio file source (%1)" msgstr "" -#: sndfilesource.cc:528 +#: sndfilesource.cc:537 sndfilesource.cc:557 msgid "attempt to flush an un-opened audio file source (%1)" msgstr "" -#: sndfilesource.cc:534 +#: sndfilesource.cc:543 msgid "could not allocate file %1 to write header" msgstr "" -#: sndfilesource.cc:548 +#: sndfilesource.cc:568 +msgid "could not allocate file %1 to flush contents" +msgstr "" + +#: sndfilesource.cc:581 msgid "" "attempt to store broadcast info in a non-writable audio file source (%1)" msgstr "" -#: sndfilesource.cc:553 +#: sndfilesource.cc:586 msgid "attempt to set BWF info for an un-opened audio file source (%1)" msgstr "" -#: sndfilesource.cc:614 +#: sndfilesource.cc:647 msgid "%1: cannot seek to %2 (libsndfile error: %3)" msgstr "" -#: sndfilesource.cc:727 +#: sndfilesource.cc:760 msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)" msgstr "" -#: sndfilesource.cc:740 sndfilesource.cc:790 sndfilesource.cc:797 +#: sndfilesource.cc:773 sndfilesource.cc:823 sndfilesource.cc:830 msgid "SndFileSource: \"%1\" bad write (%2)" msgstr "" -#: sndfilesource.cc:820 +#: sndfilesource.cc:853 msgid "" "Filesource: start time is already set for existing file (%1): Cannot change " "start time." msgstr "" -#: speakers.cc:239 +#: speakers.cc:280 msgid "Speaker information is missing azimuth - speaker ignored" msgstr "" -#: speakers.cc:245 +#: speakers.cc:286 msgid "Speaker information is missing elevation - speaker ignored" msgstr "" -#: speakers.cc:251 +#: speakers.cc:292 msgid "Speaker information is missing distance - speaker ignored" msgstr "" +#: srcfilesource.cc:135 +msgid "SrcFileSource: %1" +msgstr "" + #: tape_file_matcher.cc:46 msgid "Cannot compile tape track regexp for use (%1)" msgstr "" @@ -2418,54 +2438,54 @@ msgstr "" msgid "Node for Port has no \"name\" property" msgstr "" -#: utils.cc:358 utils.cc:382 +#: utils.cc:395 utils.cc:419 msgid "Splice" msgstr "" -#: utils.cc:360 utils.cc:375 +#: utils.cc:397 utils.cc:412 msgid "Slide" msgstr "" -#: utils.cc:362 utils.cc:378 +#: utils.cc:399 utils.cc:415 msgid "Lock" msgstr "" -#: utils.cc:365 +#: utils.cc:402 msgid "programming error: unknown edit mode string \"%1\"" msgstr "" -#: utils.cc:389 utils.cc:421 +#: utils.cc:426 utils.cc:458 msgid "MIDI Timecode" msgstr "" -#: utils.cc:389 utils.cc:419 +#: utils.cc:426 utils.cc:456 msgid "MTC" msgstr "MTC" -#: utils.cc:393 utils.cc:428 +#: utils.cc:430 utils.cc:465 msgid "MIDI Clock" msgstr "" -#: utils.cc:397 utils.cc:415 utils.cc:435 +#: utils.cc:434 utils.cc:452 utils.cc:472 msgid "JACK" msgstr "JACK" -#: utils.cc:401 +#: utils.cc:438 msgid "programming error: unknown sync source string \"%1\"" msgstr "" -#: utils.cc:426 +#: utils.cc:463 msgid "M-Clock" msgstr "" -#: utils.cc:432 +#: utils.cc:469 msgid "LTC" msgstr "" -#: utils.cc:602 +#: utils.cc:639 msgid "programming error: unknown native header format: %1" msgstr "" -#: utils.cc:617 +#: utils.cc:654 msgid "cannot open directory %1 (%2)" msgstr "" diff --git a/libs/ardour/po/ru.po b/libs/ardour/po/ru.po index fca85fb393..ba0743d83a 100644 --- a/libs/ardour/po/ru.po +++ b/libs/ardour/po/ru.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: libardour 3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-01-19 22:43+0400\n" +"POT-Creation-Date: 2014-02-10 17:53+0100\n" "PO-Revision-Date: 2014-01-19 22:42+0300\n" "Last-Translator: ÐлекÑандр Прокудин <alexandre.prokoudine@gmail.com>\n" "Language-Team: \n" @@ -24,64 +24,64 @@ msgstr "" msgid "Fader" msgstr "Фейдер" -#: audio_diskstream.cc:244 +#: audio_diskstream.cc:242 msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist" msgstr "" -#: audio_diskstream.cc:296 +#: audio_diskstream.cc:294 msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!" msgstr "" -#: audio_diskstream.cc:848 audio_diskstream.cc:858 +#: audio_diskstream.cc:846 audio_diskstream.cc:856 msgid "" "AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3" msgstr "" -#: audio_diskstream.cc:1014 +#: audio_diskstream.cc:1012 msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3" msgstr "" -#: audio_diskstream.cc:1383 audio_diskstream.cc:1400 +#: audio_diskstream.cc:1381 audio_diskstream.cc:1398 msgid "AudioDiskstream %1: cannot write to disk" msgstr "" -#: audio_diskstream.cc:1443 +#: audio_diskstream.cc:1441 msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!" msgstr "" -#: audio_diskstream.cc:1537 +#: audio_diskstream.cc:1535 msgid "%1: could not create region for complete audio file" msgstr "" -#: audio_diskstream.cc:1571 +#: audio_diskstream.cc:1569 msgid "AudioDiskstream: could not create region for captured audio!" msgstr "" -#: audio_diskstream.cc:1679 +#: audio_diskstream.cc:1677 msgid "programmer error: %1" msgstr "" -#: audio_diskstream.cc:1905 +#: audio_diskstream.cc:1903 msgid "AudioDiskstream: channel %1 out of range" msgstr "" -#: audio_diskstream.cc:1919 midi_diskstream.cc:1210 +#: audio_diskstream.cc:1917 midi_diskstream.cc:1209 msgid "%1:%2 new capture file not initialized correctly" msgstr "" -#: audio_diskstream.cc:2200 +#: audio_diskstream.cc:2198 msgid "%1: cannot restore pending capture source file %2" msgstr "" -#: audio_diskstream.cc:2222 +#: audio_diskstream.cc:2220 msgid "%1: incorrect number of pending sources listed - ignoring them all" msgstr "" -#: audio_diskstream.cc:2246 +#: audio_diskstream.cc:2244 msgid "%1: cannot create whole-file region from pending capture sources" msgstr "" -#: audio_library.cc:71 +#: audio_library.cc:81 msgid "Could not open %1. Audio Library not saved" msgstr "" @@ -121,11 +121,11 @@ msgstr "" msgid "Audio Playlists (unused)" msgstr "" -#: audio_playlist_source.cc:171 audiosource.cc:913 file_source.cc:529 +#: audio_playlist_source.cc:171 audiosource.cc:891 file_source.cc:520 #: midi_playlist_source.cc:144 midi_playlist_source.cc:152 -#: midi_playlist_source.cc:159 midi_source.cc:371 plugin_insert.cc:642 -#: rb_effect.cc:333 session.cc:2633 session.cc:2666 session.cc:3811 -#: session_handle.cc:87 sndfilesource.cc:121 +#: midi_playlist_source.cc:159 midi_source.cc:370 plugin_insert.cc:634 +#: rb_effect.cc:333 session.cc:2636 session.cc:2669 session.cc:3814 +#: session_handle.cc:87 sndfilesource.cc:122 msgid "programming error: %1" msgstr "programming error: %1" @@ -153,23 +153,23 @@ msgstr "" "\n" "Каналов: " -#: audio_track.cc:167 +#: audio_track.cc:161 msgid "Unknown bundle \"%1\" listed for input of %2" msgstr "" -#: audio_track.cc:169 +#: audio_track.cc:163 msgid "in 1" msgstr "" -#: audio_track.cc:170 +#: audio_track.cc:164 msgid "No input bundles available as a replacement" msgstr "" -#: audio_track.cc:174 +#: audio_track.cc:168 msgid "Bundle %1 was not available - \"in 1\" used instead" msgstr "" -#: audio_track.cc:183 +#: audio_track.cc:177 msgid "improper input channel list in XML node (%1)" msgstr "" @@ -193,23 +193,23 @@ msgstr "Ðе удалоÑÑŒ загрузить модуль VAMP под назв msgid "VAMP Plugin \"%1\" could not be loaded" msgstr "Ðе удалоÑÑŒ загрузить модуль VAMP под названием \"%1\"" -#: audioengine.cc:488 +#: audioengine.cc:495 msgid "looking for backends in %1\n" msgstr "" -#: audioengine.cc:511 +#: audioengine.cc:518 msgid "AudioEngine: cannot load module \"%1\" (%2)" msgstr "" -#: audioengine.cc:517 +#: audioengine.cc:524 msgid "AudioEngine: backend at \"%1\" has no descriptor function." msgstr "" -#: audioengine.cc:589 +#: audioengine.cc:596 msgid "Could not create backend for %1: %2" msgstr "Ðе удалоÑÑŒ Ñоздать движок Ð´Ð»Ñ %1: %2" -#: audioregion.cc:1643 +#: audioregion.cc:1651 msgid "" "You have requested an operation that requires audio analysis.\n" "\n" @@ -224,11 +224,11 @@ msgid "" "this and future transient-detection operations.\n" msgstr "" -#: audiosource.cc:199 +#: audiosource.cc:210 msgid "cannot rename peakfile for %1 from %2 to %3 (%4)" msgstr "cannot rename peakfile for %1 from %2 to %3 (%4)" -#: audiosource.cc:226 +#: audiosource.cc:239 msgid "AudioSource: cannot stat peakfile \"%1\"" msgstr "AudioSource: cannot stat peakfile \"%1\"" @@ -236,48 +236,69 @@ msgstr "AudioSource: cannot stat peakfile \"%1\"" msgid "cannot read sample data for unscaled peak computation" msgstr "cannot read sample data for unscaled peak computation" -#: audiosource.cc:387 +#: audiosource.cc:386 msgid "AudioSource: cannot open peakpath (a) \"%1\" (%2)" msgstr "AudioSource: cannot open peakpath (a) \"%1\" (%2)" -#: audiosource.cc:463 +#: audiosource.cc:395 audiosource.cc:473 +msgid "" +"AudioSource: could not seek to correct location in peak file \"%1\" (%2)" +msgstr "" + +#: audiosource.cc:453 msgid "AudioSource: cannot open peakpath (b) \"%1\" (%2)" msgstr "AudioSource: cannot open peakpath (b) \"%1\" (%2)" -#: audiosource.cc:587 +#: audiosource.cc:567 msgid "" "AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)" msgstr "" "AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)" -#: audiosource.cc:667 +#: audiosource.cc:634 msgid "%1: could not write read raw data for peak computation (%2)" msgstr "%1: could not write read raw data for peak computation (%2)" -#: audiosource.cc:706 +#: audiosource.cc:672 msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)" msgstr "AudioSource: cannot open peakpath (c) \"%1\" (%2)" -#: audiosource.cc:773 audiosource.cc:886 +#: audiosource.cc:739 audiosource.cc:861 +msgid "%1: could not seek in peak file data (%2)" +msgstr "" + +#: audiosource.cc:744 audiosource.cc:870 msgid "%1: could not write peak file data (%2)" msgstr "%1: could not write peak file data (%2)" -#: audiosource.cc:924 +#: audiosource.cc:903 msgid "could not truncate peakfile %1 to %2 (error: %3)" msgstr "could not truncate peakfile %1 to %2 (error: %3)" -#: auditioner.cc:112 -msgid "no outputs available for auditioner - manual connection required" +#: auditioner.cc:95 +msgid "Falling back to Reasonable Synth for Midi Audition" msgstr "" -#: auditioner.cc:174 -msgid "Auditioning of non-audio regions not yet supported" +#: auditioner.cc:97 +msgid "No synth for midi-audition found." msgstr "" -#: auditioner.cc:199 +#: auditioner.cc:152 +msgid "no outputs available for auditioner - manual connection required" +msgstr "" + +#: auditioner.cc:392 auditioner.cc:438 msgid "Cannot setup auditioner processing flow for %1 channels" msgstr "" +#: auditioner.cc:426 +msgid "Failed to load synth for MIDI-Audition." +msgstr "" + +#: auditioner.cc:445 +msgid "Auditioning of regions other than Audio or Midi is not supported." +msgstr "" + #: automatable.cc:81 msgid "Automation node has no path property" msgstr "" @@ -311,23 +332,23 @@ msgid "" "AutomationList: passed XML node called %1, not \"AutomationList\" - ignored" msgstr "" -#: butler.cc:91 +#: butler.cc:80 msgid "Cannot create transport request signal pipe (%1)" msgstr "" -#: butler.cc:97 butler.cc:103 +#: butler.cc:86 butler.cc:92 msgid "UI: cannot set O_NONBLOCK on butler request pipe (%1)" msgstr "" -#: butler.cc:109 +#: butler.cc:124 msgid "Session: could not create butler thread" msgstr "" -#: butler.cc:156 +#: butler.cc:165 msgid "poll on butler request pipe failed (%1)" msgstr "" -#: butler.cc:163 +#: butler.cc:172 msgid "Error on butler thread request pipe: fd=%1 err=%2" msgstr "" @@ -335,55 +356,55 @@ msgstr "" msgid "Error reading from butler request pipe" msgstr "" -#: butler.cc:256 +#: butler.cc:301 msgid "Butler read ahead failure on dstream %1" msgstr "" -#: butler.cc:293 +#: butler.cc:338 msgid "Butler write-behind failure on dstream %1" msgstr "" -#: control_protocol_manager.cc:162 +#: control_protocol_manager.cc:164 msgid "control protocol name \"%1\" has no descriptor" msgstr "" -#: control_protocol_manager.cc:169 +#: control_protocol_manager.cc:171 msgid "control protocol name \"%1\" could not be initialized" msgstr "" -#: control_protocol_manager.cc:233 +#: control_protocol_manager.cc:237 msgid "Instantiating mandatory control protocol %1" msgstr "" -#: control_protocol_manager.cc:254 +#: control_protocol_manager.cc:258 msgid "looking for control protocols in %1\n" msgstr "" -#: control_protocol_manager.cc:279 +#: control_protocol_manager.cc:283 msgid "Control protocol %1 not usable" msgstr "" -#: control_protocol_manager.cc:296 +#: control_protocol_manager.cc:300 msgid "Control surface protocol discovered: \"%1\"\n" msgstr "" -#: control_protocol_manager.cc:314 +#: control_protocol_manager.cc:318 msgid "ControlProtocolManager: cannot load module \"%1\" (%2)" msgstr "ControlProtocolManager: cannot load module \"%1\" (%2)" -#: control_protocol_manager.cc:322 +#: control_protocol_manager.cc:324 msgid "ControlProtocolManager: module \"%1\" has no descriptor function." msgstr "" -#: cycle_timer.cc:38 +#: cycle_timer.cc:40 msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo" msgstr "" -#: cycle_timer.cc:50 +#: cycle_timer.cc:52 msgid "CycleTimer::get_mhz(): cannot locate cpu MHz in /proc/cpuinfo" msgstr "" -#: cycle_timer.cc:73 +#: cycle_timer.cc:75 msgid "cannot locate cpu MHz in /proc/cpuinfo" msgstr "" @@ -391,7 +412,7 @@ msgstr "" msgid "audio" msgstr "" -#: data_type.cc:28 session.cc:1805 session.cc:1808 +#: data_type.cc:28 session.cc:1808 session.cc:1811 msgid "MIDI" msgstr "" @@ -407,7 +428,7 @@ msgstr "" msgid "listen" msgstr "" -#: diskstream.cc:303 +#: diskstream.cc:302 msgid "Location \"%1\" not valid for track loop (start >= end)" msgstr "" @@ -419,23 +440,23 @@ msgstr "" msgid "Export failed: %1" msgstr "" -#: export_filename.cc:118 +#: export_filename.cc:119 msgid "Existing export folder for this session (%1) does not exist - ignored" msgstr "" -#: export_filename.cc:229 +#: export_filename.cc:230 msgid "No Time" msgstr "Без времени" -#: export_filename.cc:238 +#: export_filename.cc:239 msgid "Invalid time format" msgstr "Ðекорректный формат времени" -#: export_filename.cc:247 +#: export_filename.cc:248 msgid "No Date" msgstr "Без даты" -#: export_filename.cc:262 +#: export_filename.cc:263 msgid "Invalid date format" msgstr "Ðекорректный формат даты" @@ -503,7 +524,7 @@ msgstr "Треугольное" msgid "Rectangular" msgstr "ПрÑмоугольное" -#: export_formats.cc:52 session.cc:5028 session.cc:5044 +#: export_formats.cc:52 session.cc:5006 session.cc:5022 msgid "None" msgstr "Ðет" @@ -543,15 +564,15 @@ msgstr "Формат ÑÑмплов Vorbis" msgid "No sample format" msgstr "Без формата ÑÑмплов" -#: export_handler.cc:342 +#: export_handler.cc:343 msgid "Editor: cannot open \"%1\" as export file for CD marker file" msgstr "" -#: export_handler.cc:424 export_handler.cc:427 +#: export_handler.cc:425 export_handler.cc:428 msgid "an error occured while writing a TOC/CUE file: %1" msgstr "" -#: export_handler.cc:649 export_handler.cc:707 +#: export_handler.cc:650 export_handler.cc:708 msgid "Cannot convert %1 to Latin-1 text" msgstr "" @@ -613,7 +634,7 @@ msgid "" "configuration" msgstr "" -#: file_source.cc:198 session_state.cc:2807 +#: file_source.cc:198 session_state.cc:2843 msgid "" "there are already 1000 files with names like %1; versioning discontinued" msgstr "" @@ -622,35 +643,35 @@ msgstr "" msgid "cannot rename file source from %1 to %2 (%3)" msgstr "" -#: file_source.cc:250 file_source.cc:378 +#: file_source.cc:248 file_source.cc:372 msgid "FileSource: search path not set" msgstr "" -#: file_source.cc:313 file_source.cc:448 -msgid "Filesource: cannot find required file (%1): while searching %2" +#: file_source.cc:309 file_source.cc:439 +msgid "Filesource: cannot find required file (%1)" msgstr "" -#: file_source.cc:440 +#: file_source.cc:432 msgid "" -"FileSource: \"%1\" is ambigous when searching %2\n" +"FileSource: \"%1\" is ambigous when searching\n" "\t" msgstr "" -#: file_source.cc:494 +#: file_source.cc:484 msgid "Filesource: cannot find required file (%1): %2" msgstr "" -#: file_source.cc:501 +#: file_source.cc:492 msgid "Filesource: cannot check for existing file (%1): %2" msgstr "" -#: file_source.cc:535 +#: file_source.cc:526 msgid "" "Programming error! %1 tried to rename a file over another file! It's safe to " "continue working, but please report this to the developers." msgstr "" -#: file_source.cc:540 +#: file_source.cc:531 msgid "cannot rename file %1 to %2 (%3)" msgstr "" @@ -664,15 +685,15 @@ msgid "" "cannot run" msgstr "" -#: filesystem_paths.cc:91 +#: filesystem_paths.cc:96 msgid "ARDOUR_DLL_PATH not set in environment - exiting\n" msgstr "" -#: filesystem_paths.cc:107 +#: filesystem_paths.cc:125 msgid "ARDOUR_CONFIG_PATH not set in environment - exiting\n" msgstr "" -#: filesystem_paths.cc:127 +#: filesystem_paths.cc:148 msgid "ARDOUR_DATA_PATH not set in environment - exiting\n" msgstr "" @@ -684,87 +705,83 @@ msgstr "" msgid "filter: error creating new file %1 (%2)" msgstr "" -#: find_session.cc:51 -msgid "Could not resolve path: %1 (%2)" -msgstr "" - -#: find_session.cc:63 +#: find_session.cc:59 msgid "cannot check session path %1 (%2)" msgstr "" -#: find_session.cc:89 +#: find_session.cc:85 msgid "cannot check statefile %1 (%2)" msgstr "" -#: find_session.cc:125 +#: find_session.cc:121 msgid "%1 is not a snapshot file" msgstr "" -#: find_session.cc:142 +#: find_session.cc:138 msgid "cannot determine current working directory (%1)" msgstr "" -#: find_session.cc:159 +#: find_session.cc:155 msgid "unknown file type for session %1" msgstr "" -#: globals.cc:207 +#: globals.cc:216 msgid "Could not set system open files limit to \"unlimited\"" msgstr "" -#: globals.cc:209 +#: globals.cc:218 msgid "Could not set system open files limit to %1" msgstr "" -#: globals.cc:213 +#: globals.cc:222 msgid "Your system is configured to limit %1 to only %2 open files" msgstr "" -#: globals.cc:217 +#: globals.cc:226 msgid "Could not get system open files limit (%1)" msgstr "" -#: globals.cc:268 +#: globals.cc:280 msgid "Loading configuration" msgstr "" -#: import.cc:207 +#: import.cc:208 msgid "Could not find a source for %1 even though we are updating this file!" msgstr "" -#: import.cc:236 +#: import.cc:237 msgid "Unable to create file %1 during import" msgstr "" -#: import.cc:262 +#: import.cc:263 msgid "Resampling %1 from %2kHz to %3kHz" msgstr "РеÑÑмплинг %1 из %2КГц в %3КГц" -#: import.cc:268 +#: import.cc:269 msgid "Copying %1" msgstr "КопируетÑÑ %1" -#: import.cc:446 +#: import.cc:455 msgid "Track %1 of %2 contained no usable MIDI data" msgstr "" -#: import.cc:453 +#: import.cc:462 msgid "MIDI file %1 was not readable (no reason available)" msgstr "MIDI-файл %1 нечитаем по неизвеÑтной причине" -#: import.cc:499 +#: import.cc:508 msgid "Import: cannot open input sound file \"%1\"" msgstr "" -#: import.cc:510 +#: import.cc:519 msgid "Import: error opening MIDI file" msgstr "" -#: import.cc:549 +#: import.cc:558 msgid "Loading MIDI file %1" msgstr "ЗагружаетÑÑ MIDI-файл %1" -#: import.cc:614 +#: import.cc:623 msgid "Failed to remove some files after failed/cancelled import operation" msgstr "" @@ -780,149 +797,149 @@ msgstr "" msgid "%1 - cannot find any track/bus with the ID %2 to connect to" msgstr "" -#: io.cc:208 +#: io.cc:209 msgid "IO: cannot disconnect port %1 from %2" msgstr "" -#: io.cc:343 io.cc:428 +#: io.cc:344 io.cc:431 msgid "IO: cannot register input port %1" msgstr "" -#: io.cc:348 io.cc:433 +#: io.cc:349 io.cc:436 msgid "IO: cannot register output port %1" msgstr "" -#: io.cc:591 io.cc:647 +#: io.cc:598 io.cc:654 msgid "incorrect XML node \"%1\" passed to IO object" msgstr "" -#: io.cc:706 +#: io.cc:713 msgid "in" msgstr "" -#: io.cc:706 +#: io.cc:713 msgid "out" msgstr "" -#: io.cc:707 +#: io.cc:714 msgid "input" msgstr "" -#: io.cc:707 +#: io.cc:714 msgid "output" msgstr "" -#: io.cc:717 +#: io.cc:724 msgid "Unknown bundle \"%1\" listed for %2 of %3" msgstr "" -#: io.cc:783 +#: io.cc:790 msgid "Bundle %1 was not available - \"%2\" used instead" msgstr "" -#: io.cc:786 +#: io.cc:793 msgid "No %1 bundles available as a replacement" msgstr "" -#: io.cc:889 +#: io.cc:896 msgid "%1: cannot create I/O ports" msgstr "" -#: io.cc:1017 io.cc:1121 +#: io.cc:1024 io.cc:1128 msgid "IO: badly formed string in XML node for inputs \"%1\"" msgstr "" -#: io.cc:1022 io.cc:1126 +#: io.cc:1029 io.cc:1133 msgid "bad input string in XML node \"%1\"" msgstr "" -#: io.cc:1060 +#: io.cc:1067 msgid "IO: badly formed string in XML node for outputs \"%1\"" msgstr "" -#: io.cc:1065 +#: io.cc:1072 msgid "IO: bad output string in XML node \"%1\"" msgstr "" -#: io.cc:1411 +#: io.cc:1417 #, c-format msgid "%s %u" msgstr "" -#: io.cc:1458 +#: io.cc:1464 #, c-format msgid "%s in" msgstr "" -#: io.cc:1460 +#: io.cc:1466 #, c-format msgid "%s out" msgstr "" -#: io.cc:1535 session.cc:686 session.cc:715 +#: io.cc:1541 session.cc:689 session.cc:718 msgid "mono" msgstr "" -#: io.cc:1537 session.cc:699 session.cc:729 +#: io.cc:1543 session.cc:702 session.cc:732 msgid "L" msgstr "" -#: io.cc:1537 session.cc:701 session.cc:731 +#: io.cc:1543 session.cc:704 session.cc:734 msgid "R" msgstr "" -#: io.cc:1539 io.cc:1545 +#: io.cc:1545 io.cc:1551 #, c-format msgid "%d" msgstr "" -#: ladspa_plugin.cc:86 +#: ladspa_plugin.cc:93 +msgid "LADSPA: Unable to open module: " +msgstr "" + +#: ladspa_plugin.cc:99 msgid "LADSPA: module has no descriptor function." msgstr "" -#: ladspa_plugin.cc:91 +#: ladspa_plugin.cc:106 msgid "LADSPA: plugin has gone away since discovery!" msgstr "" -#: ladspa_plugin.cc:98 +#: ladspa_plugin.cc:113 msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing" msgstr "" -#: ladspa_plugin.cc:297 +#: ladspa_plugin.cc:311 msgid "" "illegal parameter number used with plugin \"%1\". This may indicate a change " "in the plugin design, and presets may be invalid" msgstr "" -#: ladspa_plugin.cc:376 ladspa_plugin.cc:426 +#: ladspa_plugin.cc:390 ladspa_plugin.cc:440 msgid "Bad node sent to LadspaPlugin::set_state" msgstr "" -#: ladspa_plugin.cc:391 ladspa_plugin.cc:440 +#: ladspa_plugin.cc:405 ladspa_plugin.cc:454 msgid "LADSPA: no ladspa port number" msgstr "" -#: ladspa_plugin.cc:397 ladspa_plugin.cc:446 +#: ladspa_plugin.cc:411 ladspa_plugin.cc:460 msgid "LADSPA: no ladspa port data" msgstr "" -#: ladspa_plugin.cc:717 -msgid "LADSPA: cannot load module from \"%1\"" -msgstr "" - -#: ladspa_plugin.cc:827 +#: ladspa_plugin.cc:840 msgid "Could not locate HOME. Preset not removed." msgstr "" -#: ladspa_plugin.cc:864 ladspa_plugin.cc:870 +#: ladspa_plugin.cc:879 ladspa_plugin.cc:885 msgid "Could not create %1. Preset not saved. (%2)" msgstr "" -#: ladspa_plugin.cc:877 +#: ladspa_plugin.cc:892 msgid "Error saving presets file %1." msgstr "" -#: ladspa_plugin.cc:915 +#: ladspa_plugin.cc:934 msgid "Could not locate HOME. Preset not saved." msgstr "" @@ -962,7 +979,7 @@ msgstr "" msgid "incorrect XML mode passed to Locations::set_state" msgstr "" -#: location.cc:842 session.cc:4530 session_state.cc:1031 +#: location.cc:842 session.cc:4533 session_state.cc:1025 msgid "session" msgstr "" @@ -1021,40 +1038,39 @@ msgid "Session and LTC framerate mismatch: LTC:%1 Session:%2." msgstr "" #: ltc_slave.cc:591 -#, c-format msgid "flywheel" msgstr "" -#: midi_diskstream.cc:167 +#: midi_diskstream.cc:166 msgid "" "%1: I/O configuration change %4 requested to use %2, but channel setup is %3" msgstr "" -#: midi_diskstream.cc:219 +#: midi_diskstream.cc:218 msgid "MidiDiskstream: Playlist \"%1\" isn't a midi playlist" msgstr "" -#: midi_diskstream.cc:270 +#: midi_diskstream.cc:269 msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!" msgstr "" -#: midi_diskstream.cc:699 +#: midi_diskstream.cc:698 msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3" msgstr "" -#: midi_diskstream.cc:834 +#: midi_diskstream.cc:833 msgid "MidiDiskstream %1: cannot write to disk" msgstr "" -#: midi_diskstream.cc:868 +#: midi_diskstream.cc:867 msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!" msgstr "" -#: midi_diskstream.cc:955 +#: midi_diskstream.cc:954 msgid "%1: could not create region for complete midi file" msgstr "" -#: midi_diskstream.cc:992 +#: midi_diskstream.cc:991 msgid "MidiDiskstream: could not create region for captured midi!" msgstr "" @@ -1066,27 +1082,27 @@ msgstr "" msgid "No SysExID found for sys-ex property change - ignored" msgstr "" -#: midi_model.cc:2010 +#: midi_model.cc:2012 msgid "transpose" msgstr "" -#: midi_patch_manager.cc:126 +#: midi_patch_manager.cc:127 msgid "Duplicate MIDI device `%1' in `%2' ignored" msgstr "" -#: midi_source.cc:125 +#: midi_source.cc:124 msgid "Missing parameter property on InterpolationStyle" msgstr "" -#: midi_source.cc:132 +#: midi_source.cc:131 msgid "Missing style property on InterpolationStyle" msgstr "" -#: midi_source.cc:144 +#: midi_source.cc:143 msgid "Missing parameter property on AutomationState" msgstr "" -#: midi_source.cc:151 +#: midi_source.cc:150 msgid "Missing state property on AutomationState" msgstr "" @@ -1130,21 +1146,21 @@ msgstr "" msgid "solo control" msgstr "" -#: mtc_slave.cc:238 +#: mtc_slave.cc:240 msgid "MTC Slave: atomic read of current time failed, sleeping!" msgstr "" -#: mtc_slave.cc:361 +#: mtc_slave.cc:362 msgid "" "Unknown rate/drop value %1 in incoming MTC stream, session values used " "instead" msgstr "" -#: mtc_slave.cc:381 +#: mtc_slave.cc:382 msgid "Session framerate adjusted from %1 TO: MTC's %2." msgstr "" -#: mtc_slave.cc:395 +#: mtc_slave.cc:396 msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3." msgstr "" @@ -1204,23 +1220,23 @@ msgstr "" msgid "Pannable given XML data for %1 - ignored" msgstr "" -#: panner_manager.cc:79 +#: panner_manager.cc:80 msgid "looking for panners in %1\n" msgstr "" -#: panner_manager.cc:106 +#: panner_manager.cc:108 msgid "Panner discovered: \"%1\" in %2\n" msgstr "" -#: panner_manager.cc:123 +#: panner_manager.cc:125 msgid "PannerManager: cannot load module \"%1\" (%2)" msgstr "PannerManager: cannot load module \"%1\" (%2)" -#: panner_manager.cc:130 +#: panner_manager.cc:132 msgid "PannerManager: module \"%1\" has no descriptor function." msgstr "" -#: panner_manager.cc:215 +#: panner_manager.cc:219 msgid "no panner discovered for in/out = %1/%2" msgstr "" @@ -1252,89 +1268,89 @@ msgstr "" msgid "Could not construct playlist for PlaylistSource from session data!" msgstr "" -#: plugin.cc:324 +#: plugin.cc:328 msgid "" "Plugin presets are not supported in this build of %1. Consider paying for a " "full version" msgstr "" -#: plugin.cc:398 +#: plugin.cc:402 msgid "" "Saving plugin settings is not supported in this build of %1. Consider paying " "for the full version" msgstr "" -#: plugin_insert.cc:597 +#: plugin_insert.cc:589 msgid "programming error: " msgstr "ошибка программы: " -#: plugin_insert.cc:934 +#: plugin_insert.cc:926 msgid "XML node describing plugin is missing the `type' field" msgstr "" -#: plugin_insert.cc:949 +#: plugin_insert.cc:941 msgid "unknown plugin type %1 in plugin insert state" msgstr "" -#: plugin_insert.cc:977 +#: plugin_insert.cc:969 msgid "Plugin has no unique ID field" msgstr "" -#: plugin_insert.cc:986 +#: plugin_insert.cc:978 msgid "" "Found a reference to a plugin (\"%1\") that is unknown.\n" "Perhaps it was removed or moved since it was last used." msgstr "" -#: plugin_insert.cc:1102 +#: plugin_insert.cc:1094 msgid "PluginInsert: Auto: no ladspa port number" msgstr "" -#: plugin_insert.cc:1109 +#: plugin_insert.cc:1101 msgid "PluginInsert: Auto: port id out of range" msgstr "" -#: plugin_insert.cc:1145 +#: plugin_insert.cc:1137 msgid "PluginInsert: automatable control %1 not found - ignored" msgstr "" -#: plugin_manager.cc:161 +#: plugin_manager.cc:165 msgid "Discovering Plugins" msgstr "Обнаружение модулей" -#: plugin_manager.cc:335 +#: plugin_manager.cc:286 msgid "Could not parse rdf file: %1" msgstr "" -#: plugin_manager.cc:374 +#: plugin_manager.cc:330 msgid "LADSPA: cannot load module \"%1\" (%2)" msgstr "LADSPA: не удалоÑÑŒ загрузить модуль \"%1\" (%2)" -#: plugin_manager.cc:381 +#: plugin_manager.cc:337 msgid "LADSPA: module \"%1\" has no descriptor function." msgstr "" -#: plugin_manager.cc:602 +#: plugin_manager.cc:567 msgid "" "VST plugin %1 does not support processReplacing, and so cannot be used in %2 " "at this time" msgstr "" -#: plugin_manager.cc:709 +#: plugin_manager.cc:680 msgid "" "linuxVST plugin %1 does not support processReplacing, and so cannot be used " "in %2 at this time" msgstr "" -#: plugin_manager.cc:870 +#: plugin_manager.cc:841 msgid "unknown plugin status type \"%1\" - all entries ignored" msgstr "" -#: plugin_manager.cc:887 +#: plugin_manager.cc:858 msgid "unknown plugin type \"%1\" - ignored" msgstr "" -#: port.cc:410 +#: port.cc:412 msgid "could not reregister %1" msgstr "" @@ -1446,11 +1462,11 @@ msgstr "" msgid "cannot create new name for region \"%1\"" msgstr "" -#: resampled_source.cc:98 +#: resampled_source.cc:102 msgid "Import: %1" msgstr "Импорт: %1" -#: resampled_source.cc:128 srcfilesource.cc:76 +#: resampled_source.cc:132 srcfilesource.cc:76 msgid "Import: src_new() failed : %1" msgstr "" @@ -1458,27 +1474,27 @@ msgstr "" msgid "return %1" msgstr "" -#: route.cc:1077 route.cc:2518 +#: route.cc:1081 route.cc:2541 msgid "unknown Processor type \"%1\"; ignored" msgstr "" -#: route.cc:1089 +#: route.cc:1093 msgid "processor could not be created. Ignored." msgstr "" -#: route.cc:1952 route.cc:2177 +#: route.cc:1975 route.cc:2200 msgid "Bad node sent to Route::set_state() [%1]" msgstr "" -#: route.cc:2012 +#: route.cc:2035 msgid "Pannable state found for route (%1) without a panner!" msgstr "" -#: route.cc:2086 route.cc:2090 route.cc:2291 route.cc:2295 +#: route.cc:2109 route.cc:2113 route.cc:2314 route.cc:2318 msgid "badly formed order key string in state file! [%1] ... ignored." msgstr "" -#: route.cc:2301 +#: route.cc:2324 msgid "Converting deprecated order key for %1 using Editor order %2" msgstr "" @@ -1526,147 +1542,147 @@ msgstr "" msgid "Set up standard connections" msgstr "ÐаÑтройка обычных Ñоединений" -#: session.cc:635 +#: session.cc:638 msgid "could not setup Click I/O" msgstr "" -#: session.cc:683 +#: session.cc:686 #, c-format msgid "out %<PRIu32>" msgstr "" -#: session.cc:697 +#: session.cc:700 #, c-format msgid "out %<PRIu32>+%<PRIu32>" msgstr "" -#: session.cc:712 +#: session.cc:715 #, c-format msgid "in %<PRIu32>" msgstr "" -#: session.cc:726 +#: session.cc:729 #, c-format msgid "in %<PRIu32>+%<PRIu32>" msgstr "" -#: session.cc:790 +#: session.cc:793 msgid "cannot connect master output %1 to %2" msgstr "" -#: session.cc:859 +#: session.cc:862 msgid "monitor" msgstr "" -#: session.cc:904 +#: session.cc:907 msgid "cannot connect control input %1 to %2" msgstr "" -#: session.cc:924 +#: session.cc:927 msgid "The preferred I/O for the monitor bus (%1) cannot be found" msgstr "" -#: session.cc:955 +#: session.cc:958 msgid "cannot connect control output %1 to %2" msgstr "" -#: session.cc:1023 +#: session.cc:1026 msgid "cannot create Auditioner: no auditioning of regions possible" msgstr "" -#: session.cc:1207 +#: session.cc:1210 msgid "Session: you can't use that location for auto punch (start <= end)" msgstr "" -#: session.cc:1247 +#: session.cc:1250 msgid "" "You cannot use this location for auto-loop because it has zero or negative " "length" msgstr "" -#: session.cc:1561 +#: session.cc:1564 msgid "feedback loop setup between %1 and %2" msgstr "" -#: session.cc:1857 +#: session.cc:1860 msgid "Session: could not create new midi track." msgstr "" -#: session.cc:1863 +#: session.cc:1866 msgid "" "No more JACK ports are available. You will need to stop %1 and restart JACK " "with more ports if you need this many tracks." msgstr "" -#: session.cc:2040 session.cc:2043 +#: session.cc:2043 session.cc:2046 msgid "Audio" msgstr "" -#: session.cc:2067 session.cc:2075 session.cc:2152 session.cc:2160 +#: session.cc:2070 session.cc:2078 session.cc:2155 session.cc:2163 msgid "cannot configure %1 in/%2 out configuration for new audio track" msgstr "" -#: session.cc:2098 +#: session.cc:2101 msgid "Session: could not create new audio track." msgstr "" -#: session.cc:2130 session.cc:2133 +#: session.cc:2133 session.cc:2136 msgid "Bus" msgstr "" -#: session.cc:2183 +#: session.cc:2186 msgid "Session: could not create new audio route." msgstr "" -#: session.cc:2242 session.cc:2252 +#: session.cc:2245 session.cc:2255 msgid "Session: UINT_MAX routes? impossible!" msgstr "" -#: session.cc:2274 +#: session.cc:2277 msgid "Session: cannot create track/bus from template description" msgstr "" -#: session.cc:2300 +#: session.cc:2303 msgid "Session: could not create new route from template" msgstr "" -#: session.cc:2329 +#: session.cc:2332 msgid "Adding new tracks/busses failed" msgstr "Ðе удалоÑÑŒ добавить новые дорожки/шины" -#: session.cc:3433 +#: session.cc:3436 msgid "FATAL ERROR! Could not find a suitable version of %1 for a rename" msgstr "" -#: session.cc:3553 session.cc:3611 +#: session.cc:3556 session.cc:3614 msgid "There are already %1 recordings for %2, which I consider too many." msgstr "" -#: session.cc:4001 +#: session.cc:4004 msgid "send ID %1 appears to be in use already" msgstr "" -#: session.cc:4013 +#: session.cc:4016 msgid "aux send ID %1 appears to be in use already" msgstr "" -#: session.cc:4025 +#: session.cc:4028 msgid "return ID %1 appears to be in use already" msgstr "" -#: session.cc:4037 +#: session.cc:4040 msgid "insert ID %1 appears to be in use already" msgstr "" -#: session.cc:4164 +#: session.cc:4167 msgid "Cannot write a range where end <= start (e.g. %1 <= %2)" msgstr "" -#: session.cc:4193 +#: session.cc:4196 msgid "too many bounced versions of playlist \"%1\"" msgstr "" -#: session.cc:4203 +#: session.cc:4206 msgid "cannot create new audio file \"%1\" for %2" msgstr "" @@ -1701,7 +1717,7 @@ msgstr "" msgid "Session subdirectory does not exist at path %1" msgstr "" -#: session_events.cc:184 +#: session_events.cc:185 msgid "Session: cannot have two events of type %1 at the same frame (%2)." msgstr "" @@ -1713,13 +1729,13 @@ msgstr "" msgid "Export ended unexpectedly: %1" msgstr "" -#: session_ltc.cc:222 +#: session_ltc.cc:221 msgid "" "LTC encoder: invalid framerate - LTC encoding is disabled for the remainder " "of this session." msgstr "" -#: session_midi.cc:520 +#: session_midi.cc:519 msgid "Session: cannot send quarter-frame MTC message (%1)" msgstr "" @@ -1735,346 +1751,338 @@ msgstr "" msgid "Programming error: illegal event type in process_event (%1)" msgstr "" -#: session_state.cc:140 -msgid "Could not use path %1 (%2)" -msgstr "Ðе удалоÑÑŒ иÑпользовать раÑположение %1 (%2)" - -#: session_state.cc:184 +#: session_state.cc:178 msgid "solo cut control (dB)" msgstr "" -#: session_state.cc:208 +#: session_state.cc:202 msgid "Set block size and sample rate" msgstr "УÑтановка размера блока и чаÑтоты ÑÑмплированиÑ" -#: session_state.cc:213 +#: session_state.cc:207 msgid "Using configuration" msgstr "ПрименÑетÑÑ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ" -#: session_state.cc:325 +#: session_state.cc:319 msgid "Reset Remote Controls" msgstr "Ð¡Ð±Ñ€Ð¾Ñ ÑƒÐ´Ð°Ð»Ñ‘Ð½Ð½Ð¾Ð³Ð¾ управлениÑ" -#: session_state.cc:417 +#: session_state.cc:411 msgid "Session: cannot create session peakfile folder \"%1\" (%2)" msgstr "" -#: session_state.cc:424 +#: session_state.cc:418 msgid "Session: cannot create session sounds dir \"%1\" (%2)" msgstr "" -#: session_state.cc:431 +#: session_state.cc:425 msgid "Session: cannot create session midi dir \"%1\" (%2)" msgstr "" -#: session_state.cc:438 +#: session_state.cc:432 msgid "Session: cannot create session dead sounds folder \"%1\" (%2)" msgstr "" -#: session_state.cc:445 +#: session_state.cc:439 msgid "Session: cannot create session export folder \"%1\" (%2)" msgstr "" -#: session_state.cc:452 +#: session_state.cc:446 msgid "Session: cannot create session analysis folder \"%1\" (%2)" msgstr "" -#: session_state.cc:459 +#: session_state.cc:453 msgid "Session: cannot create session plugins folder \"%1\" (%2)" msgstr "Session: cannot create session plugins folder \"%1\" (%2)" -#: session_state.cc:466 +#: session_state.cc:460 msgid "Session: cannot create session externals folder \"%1\" (%2)" msgstr "Session: cannot create session externals folder \"%1\" (%2)" -#: session_state.cc:480 +#: session_state.cc:474 msgid "Session: cannot create session folder \"%1\" (%2)" msgstr "Session: cannot create session folder \"%1\" (%2)" -#: session_state.cc:514 +#: session_state.cc:508 msgid "Could not open %1 for writing session template" msgstr "Ðе удалоÑÑŒ открыть %1 Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи шаблона ÑеÑÑии" -#: session_state.cc:520 +#: session_state.cc:514 msgid "Could not open session template %1 for reading" msgstr "" -#: session_state.cc:539 +#: session_state.cc:533 msgid "master" msgstr "master" -#: session_state.cc:600 +#: session_state.cc:594 msgid "Could not remove pending capture state at path \"%1\" (%2)" msgstr "" -#: session_state.cc:624 +#: session_state.cc:618 msgid "could not rename snapshot %1 to %2 (%3)" msgstr "" -#: session_state.cc:652 +#: session_state.cc:646 msgid "Could not remove session file at path \"%1\" (%2)" msgstr "" -#: session_state.cc:669 +#: session_state.cc:663 msgid "" "the %1 audio engine is not connected and state saving would lose all I/O " "connections. Session not saved" msgstr "" -#: session_state.cc:720 +#: session_state.cc:714 msgid "state could not be saved to %1" msgstr "" -#: session_state.cc:722 session_state.cc:733 +#: session_state.cc:716 session_state.cc:727 msgid "Could not remove temporary session file at path \"%1\" (%2)" msgstr "" -#: session_state.cc:730 -msgid "could not rename temporary session file %1 to %2" +#: session_state.cc:724 +msgid "could not rename temporary session file %1 to %2 (%3)" msgstr "" -#: session_state.cc:798 +#: session_state.cc:792 msgid "%1: session file \"%2\" doesn't exist!" msgstr "%1: файл ÑеÑÑии «%2» не ÑущеÑтвует!" -#: session_state.cc:810 +#: session_state.cc:804 msgid "Could not understand session file %1" msgstr "" -#: session_state.cc:819 +#: session_state.cc:813 msgid "Session file %1 is not a session" msgstr "Файл ÑеÑÑии %1 не ÑвлÑетÑÑ ÑеÑÑией" -#: session_state.cc:1125 +#: session_state.cc:1119 msgid "programming error: Session: incorrect XML node sent to set_state()" msgstr "" -#: session_state.cc:1179 +#: session_state.cc:1173 msgid "Session: XML state has no options section" msgstr "" -#: session_state.cc:1184 +#: session_state.cc:1178 msgid "Session: XML state has no metadata section" msgstr "" -#: session_state.cc:1195 +#: session_state.cc:1189 msgid "Session: XML state has no sources section" msgstr "" -#: session_state.cc:1202 +#: session_state.cc:1196 msgid "Session: XML state has no Tempo Map section" msgstr "" -#: session_state.cc:1209 +#: session_state.cc:1203 msgid "Session: XML state has no locations section" msgstr "" -#: session_state.cc:1235 +#: session_state.cc:1229 msgid "Session: XML state has no Regions section" msgstr "" -#: session_state.cc:1242 +#: session_state.cc:1236 msgid "Session: XML state has no playlists section" msgstr "" -#: session_state.cc:1262 +#: session_state.cc:1256 msgid "Session: XML state has no bundles section" msgstr "" -#: session_state.cc:1274 +#: session_state.cc:1268 msgid "Session: XML state has no diskstreams section" msgstr "" -#: session_state.cc:1282 +#: session_state.cc:1276 msgid "Session: XML state has no routes section" msgstr "" -#: session_state.cc:1294 +#: session_state.cc:1288 msgid "Session: XML state has no route groups section" msgstr "" -#: session_state.cc:1303 +#: session_state.cc:1297 msgid "Session: XML state has no edit groups section" msgstr "" -#: session_state.cc:1310 +#: session_state.cc:1304 msgid "Session: XML state has no mix groups section" msgstr "" -#: session_state.cc:1318 +#: session_state.cc:1312 msgid "Session: XML state has no click section" msgstr "" -#: session_state.cc:1360 +#: session_state.cc:1354 msgid "Session: cannot create Route from XML description." msgstr "" -#: session_state.cc:1364 +#: session_state.cc:1358 msgid "Loaded track/bus %1" msgstr "Загружена дорожка/шина %1" -#: session_state.cc:1462 +#: session_state.cc:1456 msgid "Could not find diskstream for route" msgstr "" -#: session_state.cc:1516 +#: session_state.cc:1510 msgid "Session: cannot create Region from XML description." msgstr "" -#: session_state.cc:1520 +#: session_state.cc:1514 msgid "Can not load state for region '%1'" msgstr "" -#: session_state.cc:1556 +#: session_state.cc:1550 msgid "Regions in compound description not found (ID's %1 and %2): ignored" msgstr "" -#: session_state.cc:1584 +#: session_state.cc:1578 msgid "Nested source has no ID info in session file! (ignored)" msgstr "" -#: session_state.cc:1596 +#: session_state.cc:1590 msgid "Cannot reconstruct nested source for region %1" msgstr "" -#: session_state.cc:1658 +#: session_state.cc:1652 msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)" msgstr "" -#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707 +#: session_state.cc:1660 session_state.cc:1681 session_state.cc:1701 msgid "" "Session: XMLNode describing a AudioRegion references an unknown source id =%1" msgstr "" -#: session_state.cc:1672 session_state.cc:1693 session_state.cc:1713 +#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707 msgid "" "Session: XMLNode describing a AudioRegion references a non-audio source id =" "%1" msgstr "" -#: session_state.cc:1736 +#: session_state.cc:1730 msgid "" "Session: XMLNode describing an AudioRegion is missing some master sources; " "ignored" msgstr "" -#: session_state.cc:1770 +#: session_state.cc:1764 msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)" msgstr "" -#: session_state.cc:1778 +#: session_state.cc:1772 msgid "" "Session: XMLNode describing a MidiRegion references an unknown source id =%1" msgstr "" -#: session_state.cc:1784 +#: session_state.cc:1778 msgid "" "Session: XMLNode describing a MidiRegion references a non-midi source id =%1" msgstr "" -#: session_state.cc:1852 +#: session_state.cc:1846 msgid "" "cannot create new file from region name \"%1\" with ident = \"%2\": too many " "existing files with similar names" msgstr "" -#: session_state.cc:1875 +#: session_state.cc:1869 msgid "Session: cannot create Source from XML description." msgstr "" -#: session_state.cc:1909 +#: session_state.cc:1903 msgid "A sound file is missing. It will be replaced by silence." msgstr "" -#: session_state.cc:1932 +#: session_state.cc:1926 msgid "Found a sound file that cannot be used by %1. Talk to the progammers." msgstr "" -#: session_state.cc:1949 +#: session_state.cc:1943 msgid "Could not create templates directory \"%1\" (%2)" msgstr "Could not create templates directory \"%1\" (%2)" -#: session_state.cc:1962 +#: session_state.cc:1956 msgid "Template \"%1\" already exists - new version not created" msgstr "" -#: session_state.cc:1968 +#: session_state.cc:1962 msgid "Could not create directory for Session template\"%1\" (%2)" msgstr "Could not create directory for Session template\"%1\" (%2)" -#: session_state.cc:1978 +#: session_state.cc:1972 msgid "template not saved" msgstr "" -#: session_state.cc:1988 +#: session_state.cc:1982 msgid "Could not create directory for Session template plugin state\"%1\" (%2)" msgstr "" -#: session_state.cc:2183 +#: session_state.cc:2225 msgid "Unknown node \"%1\" found in Bundles list from session file" msgstr "" -#: session_state.cc:2725 session_state.cc:2731 -msgid "Cannot expand path %1 (%2)" -msgstr "Cannot expand path %1 (%2)" - -#: session_state.cc:2784 +#: session_state.cc:2820 msgid "Session: cannot create dead file folder \"%1\" (%2)" msgstr "Session: cannot create dead file folder \"%1\" (%2)" -#: session_state.cc:2823 +#: session_state.cc:2859 msgid "cannot rename unused file source from %1 to %2 (%3)" msgstr "" -#: session_state.cc:2841 +#: session_state.cc:2877 msgid "cannot remove peakfile %1 for %2 (%3)" msgstr "" -#: session_state.cc:3143 +#: session_state.cc:3179 msgid "could not backup old history file, current history not saved" msgstr "" -#: session_state.cc:3156 +#: session_state.cc:3192 msgid "history could not be saved to %1" msgstr "" -#: session_state.cc:3159 +#: session_state.cc:3195 msgid "Could not remove history file at path \"%1\" (%2)" msgstr "" -#: session_state.cc:3163 +#: session_state.cc:3199 msgid "could not restore history file from backup %1 (%2)" msgstr "" -#: session_state.cc:3188 +#: session_state.cc:3224 msgid "%1: no history file \"%2\" for this session." msgstr "" -#: session_state.cc:3194 +#: session_state.cc:3230 msgid "Could not understand session history file \"%1\"" msgstr "" -#: session_state.cc:3236 +#: session_state.cc:3272 msgid "Failed to downcast MidiSource for NoteDiffCommand" msgstr "" -#: session_state.cc:3247 +#: session_state.cc:3283 msgid "Failed to downcast MidiSource for SysExDiffCommand" msgstr "" -#: session_state.cc:3258 +#: session_state.cc:3294 msgid "Failed to downcast MidiSource for PatchChangeDiffCommand" msgstr "" -#: session_state.cc:3266 +#: session_state.cc:3302 msgid "Couldn't figure out how to make a Command out of a %1 XMLNode." msgstr "" -#: session_state.cc:3502 +#: session_state.cc:3538 msgid "Session: unknown diskstream type in XML" msgstr "" -#: session_state.cc:3507 +#: session_state.cc:3543 msgid "Session: could not load diskstream via XML state" msgstr "" @@ -2098,181 +2106,185 @@ msgid "" "control" msgstr "" -#: smf_source.cc:252 +#: smf_source.cc:262 msgid "Unable to read event prefix, corrupt MIDI ring" msgstr "" -#: smf_source.cc:265 +#: smf_source.cc:275 msgid "Event has time and size but no body, corrupt MIDI ring" msgstr "" -#: smf_source.cc:271 +#: smf_source.cc:281 msgid "Event time is before MIDI source position" msgstr "" -#: smf_source.cc:306 smf_source.cc:345 +#: smf_source.cc:316 smf_source.cc:355 msgid "Skipping event with unordered time %1" msgstr "" -#: smf_source.cc:410 +#: smf_source.cc:420 msgid "cannot open MIDI file %1 for write" msgstr "не удалоÑÑŒ открыть MIDI-файл %2 Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи" -#: sndfile_helpers.cc:32 +#: sndfile_helpers.cc:34 msgid "WAV" msgstr "WAV" -#: sndfile_helpers.cc:33 +#: sndfile_helpers.cc:35 msgid "AIFF" msgstr "AIFF" -#: sndfile_helpers.cc:34 +#: sndfile_helpers.cc:36 msgid "CAF" msgstr "CAF" -#: sndfile_helpers.cc:35 +#: sndfile_helpers.cc:37 msgid "W64 (64 bit WAV)" msgstr "W64 (64-разрÑдный WAV)" -#: sndfile_helpers.cc:36 +#: sndfile_helpers.cc:38 msgid "FLAC" msgstr "FLAC" -#: sndfile_helpers.cc:37 +#: sndfile_helpers.cc:39 msgid "Ogg/Vorbis" msgstr "Ogg/Vorbis" -#: sndfile_helpers.cc:38 +#: sndfile_helpers.cc:40 msgid "raw (no header)" msgstr "raw (без заголовка)" -#: sndfile_helpers.cc:43 +#: sndfile_helpers.cc:45 msgid ".wav" msgstr ".wav" -#: sndfile_helpers.cc:44 +#: sndfile_helpers.cc:46 msgid ".aiff" msgstr ".aiff" -#: sndfile_helpers.cc:45 +#: sndfile_helpers.cc:47 msgid ".caf" msgstr ".caf" -#: sndfile_helpers.cc:46 +#: sndfile_helpers.cc:48 msgid ".w64" msgstr ".w64" -#: sndfile_helpers.cc:47 +#: sndfile_helpers.cc:49 msgid ".flac" msgstr ".flac" -#: sndfile_helpers.cc:48 +#: sndfile_helpers.cc:50 msgid ".ogg" msgstr ".ogg" -#: sndfile_helpers.cc:49 +#: sndfile_helpers.cc:51 msgid ".raw" msgstr ".raw" -#: sndfile_helpers.cc:64 +#: sndfile_helpers.cc:66 msgid "Signed 16 bit PCM" msgstr "Signed 16 bit PCM" -#: sndfile_helpers.cc:65 +#: sndfile_helpers.cc:67 msgid "Signed 24 bit PCM" msgstr "Signed 24 bit PCM" -#: sndfile_helpers.cc:66 +#: sndfile_helpers.cc:68 msgid "Signed 32 bit PCM" msgstr "Signed 32 bit PCM" -#: sndfile_helpers.cc:67 +#: sndfile_helpers.cc:69 msgid "Signed 8 bit PCM" msgstr "Signed 8 bit PCM" -#: sndfile_helpers.cc:68 +#: sndfile_helpers.cc:70 msgid "32 bit float" msgstr "32 bit float" -#: sndfile_helpers.cc:81 +#: sndfile_helpers.cc:83 msgid "Little-endian (Intel)" msgstr "" -#: sndfile_helpers.cc:82 +#: sndfile_helpers.cc:84 msgid "Big-endian (PowerPC)" msgstr "" -#: sndfilesource.cc:201 +#: sndfilesource.cc:210 msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)" msgstr "" -#: sndfilesource.cc:209 +#: sndfilesource.cc:218 msgid "" "SndFileSource: file only contains %1 channels; %2 is invalid as a channel " "number" msgstr "" -#: sndfilesource.cc:255 sndfilesource.cc:571 sndfilesource.cc:595 +#: sndfilesource.cc:264 sndfilesource.cc:604 sndfilesource.cc:628 msgid "" "cannot set broadcast info for audio file %1 (%2); dropping broadcast info " "for this file" msgstr "" -#: sndfilesource.cc:302 +#: sndfilesource.cc:311 msgid "could not allocate file %1 for reading." msgstr "" -#: sndfilesource.cc:337 +#: sndfilesource.cc:346 msgid "SndFileSource: could not seek to frame %1 within %2 (%3)" msgstr "" -#: sndfilesource.cc:347 +#: sndfilesource.cc:356 msgid "" "SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)" msgstr "" -#: sndfilesource.cc:391 sndfilesource.cc:420 +#: sndfilesource.cc:400 sndfilesource.cc:429 msgid "attempt to write a non-writable audio file source (%1)" msgstr "" -#: sndfilesource.cc:396 utils.cc:545 utils.cc:569 utils.cc:583 utils.cc:602 +#: sndfilesource.cc:405 utils.cc:547 utils.cc:571 utils.cc:585 utils.cc:604 msgid "programming error: %1 %2" msgstr "programming error: %1 %2" -#: sndfilesource.cc:523 +#: sndfilesource.cc:532 sndfilesource.cc:562 msgid "attempt to flush a non-writable audio file source (%1)" msgstr "" -#: sndfilesource.cc:528 +#: sndfilesource.cc:537 sndfilesource.cc:557 msgid "attempt to flush an un-opened audio file source (%1)" msgstr "" -#: sndfilesource.cc:534 +#: sndfilesource.cc:543 msgid "could not allocate file %1 to write header" msgstr "" -#: sndfilesource.cc:548 +#: sndfilesource.cc:568 +msgid "could not allocate file %1 to flush contents" +msgstr "" + +#: sndfilesource.cc:581 msgid "" "attempt to store broadcast info in a non-writable audio file source (%1)" msgstr "" -#: sndfilesource.cc:553 +#: sndfilesource.cc:586 msgid "attempt to set BWF info for an un-opened audio file source (%1)" msgstr "" -#: sndfilesource.cc:614 +#: sndfilesource.cc:647 msgid "%1: cannot seek to %2 (libsndfile error: %3)" msgstr "" -#: sndfilesource.cc:727 +#: sndfilesource.cc:760 msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)" msgstr "" -#: sndfilesource.cc:740 sndfilesource.cc:790 sndfilesource.cc:797 +#: sndfilesource.cc:773 sndfilesource.cc:823 sndfilesource.cc:830 msgid "SndFileSource: \"%1\" bad write (%2)" msgstr "" -#: sndfilesource.cc:820 +#: sndfilesource.cc:853 msgid "" "Filesource: start time is already set for existing file (%1): Cannot change " "start time." @@ -2441,54 +2453,60 @@ msgstr "" msgid "Node for Port has no \"name\" property" msgstr "Node for Port has no \"name\" property" -#: utils.cc:393 utils.cc:417 +#: utils.cc:395 utils.cc:419 msgid "Splice" msgstr "" -#: utils.cc:395 utils.cc:410 +#: utils.cc:397 utils.cc:412 msgid "Slide" msgstr "" -#: utils.cc:397 utils.cc:413 +#: utils.cc:399 utils.cc:415 msgid "Lock" msgstr "" -#: utils.cc:400 +#: utils.cc:402 msgid "programming error: unknown edit mode string \"%1\"" msgstr "programming error: unknown edit mode string \"%1\"" -#: utils.cc:424 utils.cc:456 +#: utils.cc:426 utils.cc:458 msgid "MIDI Timecode" msgstr "" -#: utils.cc:424 utils.cc:454 +#: utils.cc:426 utils.cc:456 msgid "MTC" msgstr "MTC" -#: utils.cc:428 utils.cc:463 +#: utils.cc:430 utils.cc:465 msgid "MIDI Clock" msgstr "" -#: utils.cc:432 utils.cc:450 utils.cc:470 +#: utils.cc:434 utils.cc:452 utils.cc:472 msgid "JACK" msgstr "JACK" -#: utils.cc:436 +#: utils.cc:438 msgid "programming error: unknown sync source string \"%1\"" msgstr "programming error: unknown sync source string \"%1\"" -#: utils.cc:461 +#: utils.cc:463 msgid "M-Clock" msgstr "" -#: utils.cc:467 +#: utils.cc:469 msgid "LTC" msgstr "LTC" -#: utils.cc:637 +#: utils.cc:639 msgid "programming error: unknown native header format: %1" msgstr "programming error: unknown native header format: %1" -#: utils.cc:652 +#: utils.cc:654 msgid "cannot open directory %1 (%2)" msgstr "cannot open directory %1 (%2)" + +#~ msgid "Could not use path %1 (%2)" +#~ msgstr "Ðе удалоÑÑŒ иÑпользовать раÑположение %1 (%2)" + +#~ msgid "Cannot expand path %1 (%2)" +#~ msgstr "Cannot expand path %1 (%2)" diff --git a/libs/ardour/po/sv.po b/libs/ardour/po/sv.po index 5558fde391..df2d04ae0b 100644 --- a/libs/ardour/po/sv.po +++ b/libs/ardour/po/sv.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ardour\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-11-05 11:11-0500\n" +"POT-Creation-Date: 2014-02-10 17:53+0100\n" "PO-Revision-Date: 2006-10-03 01:09+GMT+1\n" "Last-Translator: Petter Sundlöf <petter.sundlof@findus.dhs.org>\n" "Language-Team: Swedish <sv@li.org>\n" @@ -20,64 +20,64 @@ msgstr "" msgid "Fader" msgstr "Volymreglage" -#: audio_diskstream.cc:244 +#: audio_diskstream.cc:242 msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist" msgstr "" -#: audio_diskstream.cc:296 +#: audio_diskstream.cc:294 msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!" msgstr "" -#: audio_diskstream.cc:848 audio_diskstream.cc:858 +#: audio_diskstream.cc:846 audio_diskstream.cc:856 msgid "" "AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3" msgstr "" -#: audio_diskstream.cc:1014 +#: audio_diskstream.cc:1012 msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3" msgstr "" -#: audio_diskstream.cc:1383 audio_diskstream.cc:1400 +#: audio_diskstream.cc:1381 audio_diskstream.cc:1398 msgid "AudioDiskstream %1: cannot write to disk" msgstr "" -#: audio_diskstream.cc:1443 +#: audio_diskstream.cc:1441 msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!" msgstr "" -#: audio_diskstream.cc:1537 +#: audio_diskstream.cc:1535 msgid "%1: could not create region for complete audio file" msgstr "" -#: audio_diskstream.cc:1571 +#: audio_diskstream.cc:1569 msgid "AudioDiskstream: could not create region for captured audio!" msgstr "" -#: audio_diskstream.cc:1679 +#: audio_diskstream.cc:1677 msgid "programmer error: %1" msgstr "" -#: audio_diskstream.cc:1905 +#: audio_diskstream.cc:1903 msgid "AudioDiskstream: channel %1 out of range" msgstr "" -#: audio_diskstream.cc:1919 midi_diskstream.cc:1210 +#: audio_diskstream.cc:1917 midi_diskstream.cc:1209 msgid "%1:%2 new capture file not initialized correctly" msgstr "" -#: audio_diskstream.cc:2200 +#: audio_diskstream.cc:2198 msgid "%1: cannot restore pending capture source file %2" msgstr "" -#: audio_diskstream.cc:2222 +#: audio_diskstream.cc:2220 msgid "%1: incorrect number of pending sources listed - ignoring them all" msgstr "" -#: audio_diskstream.cc:2246 +#: audio_diskstream.cc:2244 msgid "%1: cannot create whole-file region from pending capture sources" msgstr "" -#: audio_library.cc:71 +#: audio_library.cc:81 msgid "Could not open %1. Audio Library not saved" msgstr "" @@ -117,11 +117,11 @@ msgstr "" msgid "Audio Playlists (unused)" msgstr "" -#: audio_playlist_source.cc:171 audiosource.cc:913 file_source.cc:529 +#: audio_playlist_source.cc:171 audiosource.cc:891 file_source.cc:520 #: midi_playlist_source.cc:144 midi_playlist_source.cc:152 -#: midi_playlist_source.cc:159 midi_source.cc:371 plugin_insert.cc:643 -#: rb_effect.cc:333 session.cc:2619 session.cc:2652 session.cc:3797 -#: session_handle.cc:87 sndfilesource.cc:121 +#: midi_playlist_source.cc:159 midi_source.cc:370 plugin_insert.cc:634 +#: rb_effect.cc:333 session.cc:2636 session.cc:2669 session.cc:3814 +#: session_handle.cc:87 sndfilesource.cc:122 msgid "programming error: %1" msgstr "" @@ -145,23 +145,23 @@ msgid "" "Channels: " msgstr "" -#: audio_track.cc:167 +#: audio_track.cc:161 msgid "Unknown bundle \"%1\" listed for input of %2" msgstr "" -#: audio_track.cc:169 +#: audio_track.cc:163 msgid "in 1" msgstr "" -#: audio_track.cc:170 +#: audio_track.cc:164 msgid "No input bundles available as a replacement" msgstr "" -#: audio_track.cc:174 +#: audio_track.cc:168 msgid "Bundle %1 was not available - \"in 1\" used instead" msgstr "" -#: audio_track.cc:183 +#: audio_track.cc:177 msgid "improper input channel list in XML node (%1)" msgstr "" @@ -185,23 +185,23 @@ msgstr "" msgid "VAMP Plugin \"%1\" could not be loaded" msgstr "" -#: audioengine.cc:488 +#: audioengine.cc:495 msgid "looking for backends in %1\n" msgstr "" -#: audioengine.cc:511 +#: audioengine.cc:518 msgid "AudioEngine: cannot load module \"%1\" (%2)" msgstr "" -#: audioengine.cc:517 +#: audioengine.cc:524 msgid "AudioEngine: backend at \"%1\" has no descriptor function." msgstr "" -#: audioengine.cc:589 +#: audioengine.cc:596 msgid "Could not create backend for %1: %2" msgstr "" -#: audioregion.cc:1643 +#: audioregion.cc:1651 msgid "" "You have requested an operation that requires audio analysis.\n" "\n" @@ -216,11 +216,11 @@ msgid "" "this and future transient-detection operations.\n" msgstr "" -#: audiosource.cc:199 +#: audiosource.cc:210 msgid "cannot rename peakfile for %1 from %2 to %3 (%4)" msgstr "" -#: audiosource.cc:226 +#: audiosource.cc:239 msgid "AudioSource: cannot stat peakfile \"%1\"" msgstr "" @@ -228,47 +228,68 @@ msgstr "" msgid "cannot read sample data for unscaled peak computation" msgstr "" -#: audiosource.cc:387 +#: audiosource.cc:386 msgid "AudioSource: cannot open peakpath (a) \"%1\" (%2)" msgstr "" -#: audiosource.cc:463 +#: audiosource.cc:395 audiosource.cc:473 +msgid "" +"AudioSource: could not seek to correct location in peak file \"%1\" (%2)" +msgstr "" + +#: audiosource.cc:453 msgid "AudioSource: cannot open peakpath (b) \"%1\" (%2)" msgstr "" -#: audiosource.cc:587 +#: audiosource.cc:567 msgid "" "AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)" msgstr "" -#: audiosource.cc:667 +#: audiosource.cc:634 msgid "%1: could not write read raw data for peak computation (%2)" msgstr "" -#: audiosource.cc:706 +#: audiosource.cc:672 msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)" msgstr "" -#: audiosource.cc:773 audiosource.cc:886 +#: audiosource.cc:739 audiosource.cc:861 +msgid "%1: could not seek in peak file data (%2)" +msgstr "" + +#: audiosource.cc:744 audiosource.cc:870 msgid "%1: could not write peak file data (%2)" msgstr "" -#: audiosource.cc:924 +#: audiosource.cc:903 msgid "could not truncate peakfile %1 to %2 (error: %3)" msgstr "" -#: auditioner.cc:87 -msgid "no outputs available for auditioner - manual connection required" +#: auditioner.cc:95 +msgid "Falling back to Reasonable Synth for Midi Audition" +msgstr "" + +#: auditioner.cc:97 +msgid "No synth for midi-audition found." msgstr "" -#: auditioner.cc:135 -msgid "Auditioning of non-audio regions not yet supported" +#: auditioner.cc:152 +msgid "no outputs available for auditioner - manual connection required" msgstr "" -#: auditioner.cc:160 +#: auditioner.cc:392 auditioner.cc:438 msgid "Cannot setup auditioner processing flow for %1 channels" msgstr "" +#: auditioner.cc:426 +msgid "Failed to load synth for MIDI-Audition." +msgstr "" + +#: auditioner.cc:445 +msgid "Auditioning of regions other than Audio or Midi is not supported." +msgstr "" + #: automatable.cc:81 msgid "Automation node has no path property" msgstr "" @@ -300,23 +321,23 @@ msgid "" "AutomationList: passed XML node called %1, not \"AutomationList\" - ignored" msgstr "" -#: butler.cc:91 +#: butler.cc:80 msgid "Cannot create transport request signal pipe (%1)" msgstr "" -#: butler.cc:97 butler.cc:103 +#: butler.cc:86 butler.cc:92 msgid "UI: cannot set O_NONBLOCK on butler request pipe (%1)" msgstr "" -#: butler.cc:109 +#: butler.cc:124 msgid "Session: could not create butler thread" msgstr "" -#: butler.cc:156 +#: butler.cc:165 msgid "poll on butler request pipe failed (%1)" msgstr "" -#: butler.cc:163 +#: butler.cc:172 msgid "Error on butler thread request pipe: fd=%1 err=%2" msgstr "" @@ -324,55 +345,55 @@ msgstr "" msgid "Error reading from butler request pipe" msgstr "" -#: butler.cc:248 +#: butler.cc:301 msgid "Butler read ahead failure on dstream %1" msgstr "" -#: butler.cc:285 +#: butler.cc:338 msgid "Butler write-behind failure on dstream %1" msgstr "" -#: control_protocol_manager.cc:134 +#: control_protocol_manager.cc:164 msgid "control protocol name \"%1\" has no descriptor" msgstr "" -#: control_protocol_manager.cc:141 +#: control_protocol_manager.cc:171 msgid "control protocol name \"%1\" could not be initialized" msgstr "" -#: control_protocol_manager.cc:201 +#: control_protocol_manager.cc:237 msgid "Instantiating mandatory control protocol %1" msgstr "" -#: control_protocol_manager.cc:222 +#: control_protocol_manager.cc:258 msgid "looking for control protocols in %1\n" msgstr "" -#: control_protocol_manager.cc:247 +#: control_protocol_manager.cc:283 msgid "Control protocol %1 not usable" msgstr "" -#: control_protocol_manager.cc:264 +#: control_protocol_manager.cc:300 msgid "Control surface protocol discovered: \"%1\"\n" msgstr "" -#: control_protocol_manager.cc:282 +#: control_protocol_manager.cc:318 msgid "ControlProtocolManager: cannot load module \"%1\" (%2)" msgstr "" -#: control_protocol_manager.cc:290 +#: control_protocol_manager.cc:324 msgid "ControlProtocolManager: module \"%1\" has no descriptor function." msgstr "" -#: cycle_timer.cc:38 +#: cycle_timer.cc:40 msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo" msgstr "" -#: cycle_timer.cc:50 +#: cycle_timer.cc:52 msgid "CycleTimer::get_mhz(): cannot locate cpu MHz in /proc/cpuinfo" msgstr "" -#: cycle_timer.cc:73 +#: cycle_timer.cc:75 msgid "cannot locate cpu MHz in /proc/cpuinfo" msgstr "" @@ -380,7 +401,7 @@ msgstr "" msgid "audio" msgstr "" -#: data_type.cc:28 session.cc:1791 session.cc:1794 +#: data_type.cc:28 session.cc:1808 session.cc:1811 msgid "MIDI" msgstr "" @@ -388,15 +409,15 @@ msgstr "" msgid "unknown" msgstr "" -#: delivery.cc:114 +#: delivery.cc:118 msgid "main outs" msgstr "" -#: delivery.cc:117 send.cc:61 +#: delivery.cc:121 send.cc:62 msgid "listen" msgstr "" -#: diskstream.cc:303 +#: diskstream.cc:302 msgid "Location \"%1\" not valid for track loop (start >= end)" msgstr "" @@ -408,23 +429,23 @@ msgstr "" msgid "Export failed: %1" msgstr "" -#: export_filename.cc:118 +#: export_filename.cc:119 msgid "Existing export folder for this session (%1) does not exist - ignored" msgstr "" -#: export_filename.cc:229 +#: export_filename.cc:230 msgid "No Time" msgstr "Ingen tid" -#: export_filename.cc:238 +#: export_filename.cc:239 msgid "Invalid time format" msgstr "" -#: export_filename.cc:247 +#: export_filename.cc:248 msgid "No Date" msgstr "Inget datum" -#: export_filename.cc:262 +#: export_filename.cc:263 msgid "Invalid date format" msgstr "" @@ -492,7 +513,7 @@ msgstr "" msgid "Rectangular" msgstr "" -#: export_formats.cc:52 session.cc:5014 session.cc:5030 +#: export_formats.cc:52 session.cc:5006 session.cc:5022 msgid "None" msgstr "" @@ -532,15 +553,15 @@ msgstr "" msgid "No sample format" msgstr "" -#: export_handler.cc:335 +#: export_handler.cc:343 msgid "Editor: cannot open \"%1\" as export file for CD marker file" msgstr "" -#: export_handler.cc:417 export_handler.cc:420 +#: export_handler.cc:425 export_handler.cc:428 msgid "an error occured while writing a TOC/CUE file: %1" msgstr "" -#: export_handler.cc:642 export_handler.cc:700 +#: export_handler.cc:650 export_handler.cc:708 msgid "Cannot convert %1 to Latin-1 text" msgstr "" @@ -602,7 +623,7 @@ msgid "" "configuration" msgstr "" -#: file_source.cc:198 session_state.cc:2807 +#: file_source.cc:198 session_state.cc:2843 msgid "" "there are already 1000 files with names like %1; versioning discontinued" msgstr "" @@ -611,35 +632,35 @@ msgstr "" msgid "cannot rename file source from %1 to %2 (%3)" msgstr "" -#: file_source.cc:250 file_source.cc:378 +#: file_source.cc:248 file_source.cc:372 msgid "FileSource: search path not set" msgstr "" -#: file_source.cc:313 file_source.cc:448 -msgid "Filesource: cannot find required file (%1): while searching %2" +#: file_source.cc:309 file_source.cc:439 +msgid "Filesource: cannot find required file (%1)" msgstr "" -#: file_source.cc:440 +#: file_source.cc:432 msgid "" -"FileSource: \"%1\" is ambigous when searching %2\n" +"FileSource: \"%1\" is ambigous when searching\n" "\t" msgstr "" -#: file_source.cc:494 +#: file_source.cc:484 msgid "Filesource: cannot find required file (%1): %2" msgstr "" -#: file_source.cc:501 +#: file_source.cc:492 msgid "Filesource: cannot check for existing file (%1): %2" msgstr "" -#: file_source.cc:535 +#: file_source.cc:526 msgid "" "Programming error! %1 tried to rename a file over another file! It's safe to " "continue working, but please report this to the developers." msgstr "" -#: file_source.cc:540 +#: file_source.cc:531 msgid "cannot rename file %1 to %2 (%3)" msgstr "" @@ -653,15 +674,15 @@ msgid "" "cannot run" msgstr "" -#: filesystem_paths.cc:91 +#: filesystem_paths.cc:96 msgid "ARDOUR_DLL_PATH not set in environment - exiting\n" msgstr "" -#: filesystem_paths.cc:107 +#: filesystem_paths.cc:125 msgid "ARDOUR_CONFIG_PATH not set in environment - exiting\n" msgstr "" -#: filesystem_paths.cc:127 +#: filesystem_paths.cc:148 msgid "ARDOUR_DATA_PATH not set in environment - exiting\n" msgstr "" @@ -673,87 +694,83 @@ msgstr "" msgid "filter: error creating new file %1 (%2)" msgstr "" -#: find_session.cc:51 -msgid "Could not resolve path: %1 (%2)" -msgstr "" - -#: find_session.cc:63 +#: find_session.cc:59 msgid "cannot check session path %1 (%2)" msgstr "" -#: find_session.cc:89 +#: find_session.cc:85 msgid "cannot check statefile %1 (%2)" msgstr "" -#: find_session.cc:125 +#: find_session.cc:121 msgid "%1 is not a snapshot file" msgstr "" -#: find_session.cc:142 +#: find_session.cc:138 msgid "cannot determine current working directory (%1)" msgstr "" -#: find_session.cc:159 +#: find_session.cc:155 msgid "unknown file type for session %1" msgstr "" -#: globals.cc:207 +#: globals.cc:216 msgid "Could not set system open files limit to \"unlimited\"" msgstr "" -#: globals.cc:209 +#: globals.cc:218 msgid "Could not set system open files limit to %1" msgstr "" -#: globals.cc:213 +#: globals.cc:222 msgid "Your system is configured to limit %1 to only %2 open files" msgstr "" -#: globals.cc:217 +#: globals.cc:226 msgid "Could not get system open files limit (%1)" msgstr "" -#: globals.cc:268 +#: globals.cc:280 msgid "Loading configuration" msgstr "" -#: import.cc:207 +#: import.cc:208 msgid "Could not find a source for %1 even though we are updating this file!" msgstr "" -#: import.cc:236 +#: import.cc:237 msgid "Unable to create file %1 during import" msgstr "" -#: import.cc:262 +#: import.cc:263 msgid "Resampling %1 from %2kHz to %3kHz" msgstr "" -#: import.cc:268 +#: import.cc:269 msgid "Copying %1" msgstr "" -#: import.cc:446 +#: import.cc:455 msgid "Track %1 of %2 contained no usable MIDI data" msgstr "" -#: import.cc:453 +#: import.cc:462 msgid "MIDI file %1 was not readable (no reason available)" msgstr "" -#: import.cc:499 +#: import.cc:508 msgid "Import: cannot open input sound file \"%1\"" msgstr "" -#: import.cc:510 +#: import.cc:519 msgid "Import: error opening MIDI file" msgstr "" -#: import.cc:549 +#: import.cc:558 msgid "Loading MIDI file %1" msgstr "" -#: import.cc:614 +#: import.cc:623 msgid "Failed to remove some files after failed/cancelled import operation" msgstr "" @@ -765,153 +782,153 @@ msgstr "" msgid "preset %1 (bank %2)" msgstr "" -#: internal_send.cc:278 internal_send.cc:279 +#: internal_send.cc:300 internal_send.cc:301 msgid "%1 - cannot find any track/bus with the ID %2 to connect to" msgstr "" -#: io.cc:208 +#: io.cc:209 msgid "IO: cannot disconnect port %1 from %2" msgstr "" -#: io.cc:343 io.cc:428 +#: io.cc:344 io.cc:431 msgid "IO: cannot register input port %1" msgstr "" -#: io.cc:348 io.cc:433 +#: io.cc:349 io.cc:436 msgid "IO: cannot register output port %1" msgstr "" -#: io.cc:591 io.cc:647 +#: io.cc:598 io.cc:654 msgid "incorrect XML node \"%1\" passed to IO object" msgstr "" -#: io.cc:706 +#: io.cc:713 msgid "in" msgstr "" -#: io.cc:706 +#: io.cc:713 msgid "out" msgstr "" -#: io.cc:707 +#: io.cc:714 msgid "input" msgstr "ingÃ¥ng" -#: io.cc:707 +#: io.cc:714 msgid "output" msgstr "utgÃ¥ng" -#: io.cc:717 +#: io.cc:724 msgid "Unknown bundle \"%1\" listed for %2 of %3" msgstr "" -#: io.cc:783 +#: io.cc:790 msgid "Bundle %1 was not available - \"%2\" used instead" msgstr "" -#: io.cc:786 +#: io.cc:793 msgid "No %1 bundles available as a replacement" msgstr "" -#: io.cc:889 +#: io.cc:896 msgid "%1: cannot create I/O ports" msgstr "" -#: io.cc:1017 io.cc:1121 +#: io.cc:1024 io.cc:1128 msgid "IO: badly formed string in XML node for inputs \"%1\"" msgstr "" -#: io.cc:1022 io.cc:1126 +#: io.cc:1029 io.cc:1133 msgid "bad input string in XML node \"%1\"" msgstr "" -#: io.cc:1060 +#: io.cc:1067 msgid "IO: badly formed string in XML node for outputs \"%1\"" msgstr "" -#: io.cc:1065 +#: io.cc:1072 msgid "IO: bad output string in XML node \"%1\"" msgstr "" -#: io.cc:1411 +#: io.cc:1417 #, c-format msgid "%s %u" msgstr "" -#: io.cc:1458 +#: io.cc:1464 #, c-format msgid "%s in" msgstr "" -#: io.cc:1460 +#: io.cc:1466 #, c-format msgid "%s out" msgstr "" -#: io.cc:1535 session.cc:686 session.cc:715 +#: io.cc:1541 session.cc:689 session.cc:718 msgid "mono" msgstr "" -#: io.cc:1537 session.cc:699 session.cc:729 +#: io.cc:1543 session.cc:702 session.cc:732 msgid "L" msgstr "" -#: io.cc:1537 session.cc:701 session.cc:731 +#: io.cc:1543 session.cc:704 session.cc:734 msgid "R" msgstr "" -#: io.cc:1539 io.cc:1545 +#: io.cc:1545 io.cc:1551 #, c-format msgid "%d" msgstr "" -#: ladspa_plugin.cc:86 +#: ladspa_plugin.cc:93 +msgid "LADSPA: Unable to open module: " +msgstr "" + +#: ladspa_plugin.cc:99 msgid "LADSPA: module has no descriptor function." msgstr "" -#: ladspa_plugin.cc:91 +#: ladspa_plugin.cc:106 msgid "LADSPA: plugin has gone away since discovery!" msgstr "" -#: ladspa_plugin.cc:98 +#: ladspa_plugin.cc:113 msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing" msgstr "" -#: ladspa_plugin.cc:297 +#: ladspa_plugin.cc:311 msgid "" "illegal parameter number used with plugin \"%1\". This may indicate a change " "in the plugin design, and presets may be invalid" msgstr "" -#: ladspa_plugin.cc:376 ladspa_plugin.cc:426 +#: ladspa_plugin.cc:390 ladspa_plugin.cc:440 msgid "Bad node sent to LadspaPlugin::set_state" msgstr "" -#: ladspa_plugin.cc:391 ladspa_plugin.cc:440 +#: ladspa_plugin.cc:405 ladspa_plugin.cc:454 msgid "LADSPA: no ladspa port number" msgstr "" -#: ladspa_plugin.cc:397 ladspa_plugin.cc:446 +#: ladspa_plugin.cc:411 ladspa_plugin.cc:460 msgid "LADSPA: no ladspa port data" msgstr "" -#: ladspa_plugin.cc:717 -msgid "LADSPA: cannot load module from \"%1\"" -msgstr "" - -#: ladspa_plugin.cc:827 +#: ladspa_plugin.cc:840 msgid "Could not locate HOME. Preset not removed." msgstr "" -#: ladspa_plugin.cc:864 ladspa_plugin.cc:870 +#: ladspa_plugin.cc:879 ladspa_plugin.cc:885 msgid "Could not create %1. Preset not saved. (%2)" msgstr "" -#: ladspa_plugin.cc:877 +#: ladspa_plugin.cc:892 msgid "Error saving presets file %1." msgstr "" -#: ladspa_plugin.cc:915 +#: ladspa_plugin.cc:934 msgid "Could not locate HOME. Preset not saved." msgstr "" @@ -951,7 +968,7 @@ msgstr "" msgid "incorrect XML mode passed to Locations::set_state" msgstr "" -#: location.cc:842 session.cc:4516 session_state.cc:1031 +#: location.cc:842 session.cc:4533 session_state.cc:1025 msgid "session" msgstr "" @@ -1006,40 +1023,39 @@ msgid "Session and LTC framerate mismatch: LTC:%1 Session:%2." msgstr "" #: ltc_slave.cc:591 -#, c-format msgid "flywheel" msgstr "" -#: midi_diskstream.cc:167 +#: midi_diskstream.cc:166 msgid "" "%1: I/O configuration change %4 requested to use %2, but channel setup is %3" msgstr "" -#: midi_diskstream.cc:219 +#: midi_diskstream.cc:218 msgid "MidiDiskstream: Playlist \"%1\" isn't a midi playlist" msgstr "" -#: midi_diskstream.cc:270 +#: midi_diskstream.cc:269 msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!" msgstr "" -#: midi_diskstream.cc:699 +#: midi_diskstream.cc:698 msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3" msgstr "" -#: midi_diskstream.cc:834 +#: midi_diskstream.cc:833 msgid "MidiDiskstream %1: cannot write to disk" msgstr "" -#: midi_diskstream.cc:868 +#: midi_diskstream.cc:867 msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!" msgstr "" -#: midi_diskstream.cc:955 +#: midi_diskstream.cc:954 msgid "%1: could not create region for complete midi file" msgstr "" -#: midi_diskstream.cc:992 +#: midi_diskstream.cc:991 msgid "MidiDiskstream: could not create region for captured midi!" msgstr "" @@ -1051,27 +1067,27 @@ msgstr "" msgid "No SysExID found for sys-ex property change - ignored" msgstr "" -#: midi_model.cc:2010 +#: midi_model.cc:2012 msgid "transpose" msgstr "" -#: midi_patch_manager.cc:126 +#: midi_patch_manager.cc:127 msgid "Duplicate MIDI device `%1' in `%2' ignored" msgstr "" -#: midi_source.cc:125 +#: midi_source.cc:124 msgid "Missing parameter property on InterpolationStyle" msgstr "" -#: midi_source.cc:132 +#: midi_source.cc:131 msgid "Missing style property on InterpolationStyle" msgstr "" -#: midi_source.cc:144 +#: midi_source.cc:143 msgid "Missing parameter property on AutomationState" msgstr "" -#: midi_source.cc:151 +#: midi_source.cc:150 msgid "Missing state property on AutomationState" msgstr "" @@ -1115,21 +1131,21 @@ msgstr "" msgid "solo control" msgstr "" -#: mtc_slave.cc:238 +#: mtc_slave.cc:240 msgid "MTC Slave: atomic read of current time failed, sleeping!" msgstr "" -#: mtc_slave.cc:361 +#: mtc_slave.cc:362 msgid "" "Unknown rate/drop value %1 in incoming MTC stream, session values used " "instead" msgstr "" -#: mtc_slave.cc:381 +#: mtc_slave.cc:382 msgid "Session framerate adjusted from %1 TO: MTC's %2." msgstr "" -#: mtc_slave.cc:395 +#: mtc_slave.cc:396 msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3." msgstr "" @@ -1189,31 +1205,35 @@ msgstr "" msgid "Pannable given XML data for %1 - ignored" msgstr "" -#: panner_manager.cc:76 -msgid "looking for panners in %1" +#: panner_manager.cc:80 +msgid "looking for panners in %1\n" msgstr "" -#: panner_manager.cc:100 -msgid "Panner discovered: \"%1\" in %2" +#: panner_manager.cc:108 +msgid "Panner discovered: \"%1\" in %2\n" msgstr "" -#: panner_manager.cc:117 +#: panner_manager.cc:125 msgid "PannerManager: cannot load module \"%1\" (%2)" msgstr "" -#: panner_manager.cc:124 +#: panner_manager.cc:132 msgid "PannerManager: module \"%1\" has no descriptor function." msgstr "" -#: panner_manager.cc:187 +#: panner_manager.cc:219 msgid "no panner discovered for in/out = %1/%2" msgstr "" -#: panner_shell.cc:179 +#: panner_shell.cc:126 +msgid "select panner: %1\n" +msgstr "" + +#: panner_shell.cc:245 msgid "Unknown panner plugin \"%1\" found in pan state - ignored" msgstr "" -#: panner_shell.cc:185 +#: panner_shell.cc:251 msgid "panner plugin node has no type information!" msgstr "" @@ -1233,19 +1253,19 @@ msgstr "" msgid "Could not construct playlist for PlaylistSource from session data!" msgstr "" -#: plugin.cc:324 +#: plugin.cc:328 msgid "" "Plugin presets are not supported in this build of %1. Consider paying for a " "full version" msgstr "" -#: plugin.cc:398 +#: plugin.cc:402 msgid "" "Saving plugin settings is not supported in this build of %1. Consider paying " "for the full version" msgstr "" -#: plugin_insert.cc:598 +#: plugin_insert.cc:589 msgid "programming error: " msgstr "" @@ -1279,43 +1299,43 @@ msgstr "" msgid "PluginInsert: automatable control %1 not found - ignored" msgstr "" -#: plugin_manager.cc:161 +#: plugin_manager.cc:165 msgid "Discovering Plugins" msgstr "" -#: plugin_manager.cc:335 +#: plugin_manager.cc:286 msgid "Could not parse rdf file: %1" msgstr "" -#: plugin_manager.cc:374 +#: plugin_manager.cc:330 msgid "LADSPA: cannot load module \"%1\" (%2)" msgstr "" -#: plugin_manager.cc:381 +#: plugin_manager.cc:337 msgid "LADSPA: module \"%1\" has no descriptor function." msgstr "" -#: plugin_manager.cc:602 +#: plugin_manager.cc:567 msgid "" "VST plugin %1 does not support processReplacing, and so cannot be used in %2 " "at this time" msgstr "" -#: plugin_manager.cc:709 +#: plugin_manager.cc:680 msgid "" "linuxVST plugin %1 does not support processReplacing, and so cannot be used " "in %2 at this time" msgstr "" -#: plugin_manager.cc:870 +#: plugin_manager.cc:841 msgid "unknown plugin status type \"%1\" - all entries ignored" msgstr "" -#: plugin_manager.cc:887 +#: plugin_manager.cc:858 msgid "unknown plugin type \"%1\" - ignored" msgstr "" -#: port.cc:410 +#: port.cc:412 msgid "could not reregister %1" msgstr "" @@ -1323,11 +1343,11 @@ msgstr "" msgid "insert %1" msgstr "" -#: port_insert.cc:198 +#: port_insert.cc:197 msgid "XML node describing port insert is missing the `type' field" msgstr "" -#: port_insert.cc:203 +#: port_insert.cc:202 msgid "non-port insert XML used for port plugin insert" msgstr "" @@ -1359,11 +1379,11 @@ msgstr "AudioEngine: kan inte ansluta %1 (%2) till %3 (%4)" msgid "Re-establising port %1 failed" msgstr "" -#: processor.cc:207 +#: processor.cc:208 msgid "No %1 property flag in element %2" msgstr "" -#: processor.cc:216 +#: processor.cc:217 msgid "No child node with active property" msgstr "" @@ -1427,11 +1447,11 @@ msgstr "" msgid "cannot create new name for region \"%1\"" msgstr "" -#: resampled_source.cc:98 +#: resampled_source.cc:102 msgid "Import: %1" msgstr "" -#: resampled_source.cc:128 +#: resampled_source.cc:132 srcfilesource.cc:76 msgid "Import: src_new() failed : %1" msgstr "" @@ -1439,27 +1459,27 @@ msgstr "" msgid "return %1" msgstr "" -#: route.cc:1075 route.cc:2528 +#: route.cc:1081 route.cc:2541 msgid "unknown Processor type \"%1\"; ignored" msgstr "" -#: route.cc:1087 +#: route.cc:1093 msgid "processor could not be created. Ignored." msgstr "" -#: route.cc:1962 route.cc:2187 +#: route.cc:1975 route.cc:2200 msgid "Bad node sent to Route::set_state() [%1]" msgstr "" -#: route.cc:2022 +#: route.cc:2035 msgid "Pannable state found for route (%1) without a panner!" msgstr "" -#: route.cc:2096 route.cc:2100 route.cc:2301 route.cc:2305 +#: route.cc:2109 route.cc:2113 route.cc:2314 route.cc:2318 msgid "badly formed order key string in state file! [%1] ... ignored." msgstr "" -#: route.cc:2311 +#: route.cc:2324 msgid "Converting deprecated order key for %1 using Editor order %2" msgstr "" @@ -1475,15 +1495,15 @@ msgstr "" msgid "error writing tempo-adjusted data to %1" msgstr "" -#: send.cc:59 +#: send.cc:60 msgid "aux %1" msgstr "" -#: send.cc:63 +#: send.cc:64 msgid "send %1" msgstr "" -#: send.cc:65 +#: send.cc:66 msgid "programming error: send created using role %1" msgstr "" @@ -1507,147 +1527,147 @@ msgstr "" msgid "Set up standard connections" msgstr "" -#: session.cc:635 +#: session.cc:638 msgid "could not setup Click I/O" msgstr "" -#: session.cc:683 +#: session.cc:686 #, c-format msgid "out %<PRIu32>" msgstr "" -#: session.cc:697 +#: session.cc:700 #, c-format msgid "out %<PRIu32>+%<PRIu32>" msgstr "" -#: session.cc:712 +#: session.cc:715 #, c-format msgid "in %<PRIu32>" msgstr "" -#: session.cc:726 +#: session.cc:729 #, c-format msgid "in %<PRIu32>+%<PRIu32>" msgstr "" -#: session.cc:790 +#: session.cc:793 msgid "cannot connect master output %1 to %2" msgstr "" -#: session.cc:849 +#: session.cc:862 msgid "monitor" msgstr "" -#: session.cc:894 +#: session.cc:907 msgid "cannot connect control input %1 to %2" msgstr "" -#: session.cc:914 +#: session.cc:927 msgid "The preferred I/O for the monitor bus (%1) cannot be found" msgstr "" -#: session.cc:945 +#: session.cc:958 msgid "cannot connect control output %1 to %2" msgstr "" -#: session.cc:1009 +#: session.cc:1026 msgid "cannot create Auditioner: no auditioning of regions possible" msgstr "" -#: session.cc:1193 +#: session.cc:1210 msgid "Session: you can't use that location for auto punch (start <= end)" msgstr "" -#: session.cc:1233 +#: session.cc:1250 msgid "" "You cannot use this location for auto-loop because it has zero or negative " "length" msgstr "" -#: session.cc:1547 +#: session.cc:1564 msgid "feedback loop setup between %1 and %2" msgstr "" -#: session.cc:1843 +#: session.cc:1860 msgid "Session: could not create new midi track." msgstr "" -#: session.cc:1849 +#: session.cc:1866 msgid "" "No more JACK ports are available. You will need to stop %1 and restart JACK " "with more ports if you need this many tracks." msgstr "" -#: session.cc:2026 session.cc:2029 +#: session.cc:2043 session.cc:2046 msgid "Audio" msgstr "" -#: session.cc:2053 session.cc:2061 session.cc:2138 session.cc:2146 +#: session.cc:2070 session.cc:2078 session.cc:2155 session.cc:2163 msgid "cannot configure %1 in/%2 out configuration for new audio track" msgstr "" -#: session.cc:2084 +#: session.cc:2101 msgid "Session: could not create new audio track." msgstr "" -#: session.cc:2116 session.cc:2119 +#: session.cc:2133 session.cc:2136 msgid "Bus" msgstr "" -#: session.cc:2169 +#: session.cc:2186 msgid "Session: could not create new audio route." msgstr "" -#: session.cc:2228 session.cc:2238 +#: session.cc:2245 session.cc:2255 msgid "Session: UINT_MAX routes? impossible!" msgstr "" -#: session.cc:2260 +#: session.cc:2277 msgid "Session: cannot create track/bus from template description" msgstr "" -#: session.cc:2286 +#: session.cc:2303 msgid "Session: could not create new route from template" msgstr "" -#: session.cc:2315 +#: session.cc:2332 msgid "Adding new tracks/busses failed" msgstr "" -#: session.cc:3419 +#: session.cc:3436 msgid "FATAL ERROR! Could not find a suitable version of %1 for a rename" msgstr "" -#: session.cc:3539 session.cc:3597 +#: session.cc:3556 session.cc:3614 msgid "There are already %1 recordings for %2, which I consider too many." msgstr "" -#: session.cc:3987 +#: session.cc:4004 msgid "send ID %1 appears to be in use already" msgstr "" -#: session.cc:3999 +#: session.cc:4016 msgid "aux send ID %1 appears to be in use already" msgstr "" -#: session.cc:4011 +#: session.cc:4028 msgid "return ID %1 appears to be in use already" msgstr "" -#: session.cc:4023 +#: session.cc:4040 msgid "insert ID %1 appears to be in use already" msgstr "" -#: session.cc:4150 +#: session.cc:4167 msgid "Cannot write a range where end <= start (e.g. %1 <= %2)" msgstr "" -#: session.cc:4179 +#: session.cc:4196 msgid "too many bounced versions of playlist \"%1\"" msgstr "" -#: session.cc:4189 +#: session.cc:4206 msgid "cannot create new audio file \"%1\" for %2" msgstr "" @@ -1682,7 +1702,7 @@ msgstr "" msgid "Session subdirectory does not exist at path %1" msgstr "" -#: session_events.cc:184 +#: session_events.cc:185 msgid "Session: cannot have two events of type %1 at the same frame (%2)." msgstr "" @@ -1694,13 +1714,13 @@ msgstr "" msgid "Export ended unexpectedly: %1" msgstr "" -#: session_ltc.cc:222 +#: session_ltc.cc:221 msgid "" "LTC encoder: invalid framerate - LTC encoding is disabled for the remainder " "of this session." msgstr "" -#: session_midi.cc:520 +#: session_midi.cc:519 msgid "Session: cannot send quarter-frame MTC message (%1)" msgstr "" @@ -1712,350 +1732,342 @@ msgstr "" msgid "Session: error in no roll for %1" msgstr "" -#: session_process.cc:1157 +#: session_process.cc:1159 msgid "Programming error: illegal event type in process_event (%1)" msgstr "" -#: session_state.cc:140 -msgid "Could not use path %1 (%2)" -msgstr "" - -#: session_state.cc:184 +#: session_state.cc:178 msgid "solo cut control (dB)" msgstr "" -#: session_state.cc:208 +#: session_state.cc:202 msgid "Set block size and sample rate" msgstr "" -#: session_state.cc:213 +#: session_state.cc:207 msgid "Using configuration" msgstr "" -#: session_state.cc:325 +#: session_state.cc:319 msgid "Reset Remote Controls" msgstr "" -#: session_state.cc:417 +#: session_state.cc:411 msgid "Session: cannot create session peakfile folder \"%1\" (%2)" msgstr "" -#: session_state.cc:424 +#: session_state.cc:418 msgid "Session: cannot create session sounds dir \"%1\" (%2)" msgstr "" -#: session_state.cc:431 +#: session_state.cc:425 msgid "Session: cannot create session midi dir \"%1\" (%2)" msgstr "" -#: session_state.cc:438 +#: session_state.cc:432 msgid "Session: cannot create session dead sounds folder \"%1\" (%2)" msgstr "" -#: session_state.cc:445 +#: session_state.cc:439 msgid "Session: cannot create session export folder \"%1\" (%2)" msgstr "" -#: session_state.cc:452 +#: session_state.cc:446 msgid "Session: cannot create session analysis folder \"%1\" (%2)" msgstr "" -#: session_state.cc:459 +#: session_state.cc:453 msgid "Session: cannot create session plugins folder \"%1\" (%2)" msgstr "" -#: session_state.cc:466 +#: session_state.cc:460 msgid "Session: cannot create session externals folder \"%1\" (%2)" msgstr "" -#: session_state.cc:480 +#: session_state.cc:474 msgid "Session: cannot create session folder \"%1\" (%2)" msgstr "" -#: session_state.cc:514 +#: session_state.cc:508 msgid "Could not open %1 for writing session template" msgstr "" -#: session_state.cc:520 +#: session_state.cc:514 msgid "Could not open session template %1 for reading" msgstr "" -#: session_state.cc:539 +#: session_state.cc:533 msgid "master" msgstr "" -#: session_state.cc:600 +#: session_state.cc:594 msgid "Could not remove pending capture state at path \"%1\" (%2)" msgstr "" -#: session_state.cc:624 +#: session_state.cc:618 msgid "could not rename snapshot %1 to %2 (%3)" msgstr "" -#: session_state.cc:652 +#: session_state.cc:646 msgid "Could not remove session file at path \"%1\" (%2)" msgstr "" -#: session_state.cc:669 +#: session_state.cc:663 msgid "" "the %1 audio engine is not connected and state saving would lose all I/O " "connections. Session not saved" msgstr "" -#: session_state.cc:720 +#: session_state.cc:714 msgid "state could not be saved to %1" msgstr "" -#: session_state.cc:722 session_state.cc:733 +#: session_state.cc:716 session_state.cc:727 msgid "Could not remove temporary session file at path \"%1\" (%2)" msgstr "" -#: session_state.cc:730 -msgid "could not rename temporary session file %1 to %2" +#: session_state.cc:724 +msgid "could not rename temporary session file %1 to %2 (%3)" msgstr "" -#: session_state.cc:798 +#: session_state.cc:792 msgid "%1: session file \"%2\" doesn't exist!" msgstr "" -#: session_state.cc:810 +#: session_state.cc:804 msgid "Could not understand session file %1" msgstr "" -#: session_state.cc:819 +#: session_state.cc:813 msgid "Session file %1 is not a session" msgstr "" -#: session_state.cc:1125 +#: session_state.cc:1119 msgid "programming error: Session: incorrect XML node sent to set_state()" msgstr "" -#: session_state.cc:1179 +#: session_state.cc:1173 msgid "Session: XML state has no options section" msgstr "" -#: session_state.cc:1184 +#: session_state.cc:1178 msgid "Session: XML state has no metadata section" msgstr "" -#: session_state.cc:1195 +#: session_state.cc:1189 msgid "Session: XML state has no sources section" msgstr "" -#: session_state.cc:1202 +#: session_state.cc:1196 msgid "Session: XML state has no Tempo Map section" msgstr "" -#: session_state.cc:1209 +#: session_state.cc:1203 msgid "Session: XML state has no locations section" msgstr "" -#: session_state.cc:1235 +#: session_state.cc:1229 msgid "Session: XML state has no Regions section" msgstr "" -#: session_state.cc:1242 +#: session_state.cc:1236 msgid "Session: XML state has no playlists section" msgstr "" -#: session_state.cc:1262 +#: session_state.cc:1256 msgid "Session: XML state has no bundles section" msgstr "" -#: session_state.cc:1274 +#: session_state.cc:1268 msgid "Session: XML state has no diskstreams section" msgstr "" -#: session_state.cc:1282 +#: session_state.cc:1276 msgid "Session: XML state has no routes section" msgstr "" -#: session_state.cc:1294 +#: session_state.cc:1288 msgid "Session: XML state has no route groups section" msgstr "" -#: session_state.cc:1303 +#: session_state.cc:1297 msgid "Session: XML state has no edit groups section" msgstr "" -#: session_state.cc:1310 +#: session_state.cc:1304 msgid "Session: XML state has no mix groups section" msgstr "" -#: session_state.cc:1318 +#: session_state.cc:1312 msgid "Session: XML state has no click section" msgstr "" -#: session_state.cc:1360 +#: session_state.cc:1354 msgid "Session: cannot create Route from XML description." msgstr "" -#: session_state.cc:1364 +#: session_state.cc:1358 msgid "Loaded track/bus %1" msgstr "" -#: session_state.cc:1462 +#: session_state.cc:1456 msgid "Could not find diskstream for route" msgstr "" -#: session_state.cc:1516 +#: session_state.cc:1510 msgid "Session: cannot create Region from XML description." msgstr "" -#: session_state.cc:1520 +#: session_state.cc:1514 msgid "Can not load state for region '%1'" msgstr "" -#: session_state.cc:1556 +#: session_state.cc:1550 msgid "Regions in compound description not found (ID's %1 and %2): ignored" msgstr "" -#: session_state.cc:1584 +#: session_state.cc:1578 msgid "Nested source has no ID info in session file! (ignored)" msgstr "" -#: session_state.cc:1596 +#: session_state.cc:1590 msgid "Cannot reconstruct nested source for region %1" msgstr "" -#: session_state.cc:1658 +#: session_state.cc:1652 msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)" msgstr "" -#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707 +#: session_state.cc:1660 session_state.cc:1681 session_state.cc:1701 msgid "" "Session: XMLNode describing a AudioRegion references an unknown source id =%1" msgstr "" -#: session_state.cc:1672 session_state.cc:1693 session_state.cc:1713 +#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707 msgid "" "Session: XMLNode describing a AudioRegion references a non-audio source id =" "%1" msgstr "" -#: session_state.cc:1736 +#: session_state.cc:1730 msgid "" "Session: XMLNode describing an AudioRegion is missing some master sources; " "ignored" msgstr "" -#: session_state.cc:1770 +#: session_state.cc:1764 msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)" msgstr "" -#: session_state.cc:1778 +#: session_state.cc:1772 msgid "" "Session: XMLNode describing a MidiRegion references an unknown source id =%1" msgstr "" -#: session_state.cc:1784 +#: session_state.cc:1778 msgid "" "Session: XMLNode describing a MidiRegion references a non-midi source id =%1" msgstr "" -#: session_state.cc:1852 +#: session_state.cc:1846 msgid "" "cannot create new file from region name \"%1\" with ident = \"%2\": too many " "existing files with similar names" msgstr "" -#: session_state.cc:1875 +#: session_state.cc:1869 msgid "Session: cannot create Source from XML description." msgstr "" -#: session_state.cc:1909 +#: session_state.cc:1903 msgid "A sound file is missing. It will be replaced by silence." msgstr "" -#: session_state.cc:1932 +#: session_state.cc:1926 msgid "Found a sound file that cannot be used by %1. Talk to the progammers." msgstr "" -#: session_state.cc:1949 +#: session_state.cc:1943 msgid "Could not create templates directory \"%1\" (%2)" msgstr "" -#: session_state.cc:1962 +#: session_state.cc:1956 msgid "Template \"%1\" already exists - new version not created" msgstr "" -#: session_state.cc:1968 +#: session_state.cc:1962 msgid "Could not create directory for Session template\"%1\" (%2)" msgstr "" -#: session_state.cc:1978 +#: session_state.cc:1972 msgid "template not saved" msgstr "" -#: session_state.cc:1988 +#: session_state.cc:1982 msgid "Could not create directory for Session template plugin state\"%1\" (%2)" msgstr "" -#: session_state.cc:2183 +#: session_state.cc:2225 msgid "Unknown node \"%1\" found in Bundles list from session file" msgstr "" -#: session_state.cc:2725 session_state.cc:2731 -msgid "Cannot expand path %1 (%2)" -msgstr "" - -#: session_state.cc:2784 +#: session_state.cc:2820 msgid "Session: cannot create dead file folder \"%1\" (%2)" msgstr "" -#: session_state.cc:2823 +#: session_state.cc:2859 msgid "cannot rename unused file source from %1 to %2 (%3)" msgstr "" -#: session_state.cc:2841 +#: session_state.cc:2877 msgid "cannot remove peakfile %1 for %2 (%3)" msgstr "" -#: session_state.cc:3143 +#: session_state.cc:3179 msgid "could not backup old history file, current history not saved" msgstr "" -#: session_state.cc:3156 +#: session_state.cc:3192 msgid "history could not be saved to %1" msgstr "" -#: session_state.cc:3159 +#: session_state.cc:3195 msgid "Could not remove history file at path \"%1\" (%2)" msgstr "" -#: session_state.cc:3163 +#: session_state.cc:3199 msgid "could not restore history file from backup %1 (%2)" msgstr "" -#: session_state.cc:3188 +#: session_state.cc:3224 msgid "%1: no history file \"%2\" for this session." msgstr "" -#: session_state.cc:3194 +#: session_state.cc:3230 msgid "Could not understand session history file \"%1\"" msgstr "" -#: session_state.cc:3236 +#: session_state.cc:3272 msgid "Failed to downcast MidiSource for NoteDiffCommand" msgstr "" -#: session_state.cc:3247 +#: session_state.cc:3283 msgid "Failed to downcast MidiSource for SysExDiffCommand" msgstr "" -#: session_state.cc:3258 +#: session_state.cc:3294 msgid "Failed to downcast MidiSource for PatchChangeDiffCommand" msgstr "" -#: session_state.cc:3266 +#: session_state.cc:3302 msgid "Couldn't figure out how to make a Command out of a %1 XMLNode." msgstr "" -#: session_state.cc:3502 +#: session_state.cc:3538 msgid "Session: unknown diskstream type in XML" msgstr "" -#: session_state.cc:3507 +#: session_state.cc:3543 msgid "Session: could not load diskstream via XML state" msgstr "" @@ -2079,198 +2091,206 @@ msgid "" "control" msgstr "" -#: smf_source.cc:252 +#: smf_source.cc:262 msgid "Unable to read event prefix, corrupt MIDI ring" msgstr "" -#: smf_source.cc:265 +#: smf_source.cc:275 msgid "Event has time and size but no body, corrupt MIDI ring" msgstr "" -#: smf_source.cc:271 +#: smf_source.cc:281 msgid "Event time is before MIDI source position" msgstr "" -#: smf_source.cc:306 smf_source.cc:345 +#: smf_source.cc:316 smf_source.cc:355 msgid "Skipping event with unordered time %1" msgstr "" -#: smf_source.cc:410 +#: smf_source.cc:420 msgid "cannot open MIDI file %1 for write" msgstr "" -#: sndfile_helpers.cc:32 +#: sndfile_helpers.cc:34 msgid "WAV" msgstr "" -#: sndfile_helpers.cc:33 +#: sndfile_helpers.cc:35 msgid "AIFF" msgstr "" -#: sndfile_helpers.cc:34 +#: sndfile_helpers.cc:36 msgid "CAF" msgstr "" -#: sndfile_helpers.cc:35 +#: sndfile_helpers.cc:37 msgid "W64 (64 bit WAV)" msgstr "" -#: sndfile_helpers.cc:36 +#: sndfile_helpers.cc:38 msgid "FLAC" msgstr "" -#: sndfile_helpers.cc:37 +#: sndfile_helpers.cc:39 msgid "Ogg/Vorbis" msgstr "" -#: sndfile_helpers.cc:38 +#: sndfile_helpers.cc:40 msgid "raw (no header)" msgstr "" -#: sndfile_helpers.cc:43 +#: sndfile_helpers.cc:45 msgid ".wav" msgstr "" -#: sndfile_helpers.cc:44 +#: sndfile_helpers.cc:46 msgid ".aiff" msgstr "" -#: sndfile_helpers.cc:45 +#: sndfile_helpers.cc:47 msgid ".caf" msgstr "" -#: sndfile_helpers.cc:46 +#: sndfile_helpers.cc:48 msgid ".w64" msgstr "" -#: sndfile_helpers.cc:47 +#: sndfile_helpers.cc:49 msgid ".flac" msgstr "" -#: sndfile_helpers.cc:48 +#: sndfile_helpers.cc:50 msgid ".ogg" msgstr "" -#: sndfile_helpers.cc:49 +#: sndfile_helpers.cc:51 msgid ".raw" msgstr "" -#: sndfile_helpers.cc:64 +#: sndfile_helpers.cc:66 msgid "Signed 16 bit PCM" msgstr "" -#: sndfile_helpers.cc:65 +#: sndfile_helpers.cc:67 msgid "Signed 24 bit PCM" msgstr "" -#: sndfile_helpers.cc:66 +#: sndfile_helpers.cc:68 msgid "Signed 32 bit PCM" msgstr "" -#: sndfile_helpers.cc:67 +#: sndfile_helpers.cc:69 msgid "Signed 8 bit PCM" msgstr "" -#: sndfile_helpers.cc:68 +#: sndfile_helpers.cc:70 msgid "32 bit float" msgstr "" -#: sndfile_helpers.cc:81 +#: sndfile_helpers.cc:83 msgid "Little-endian (Intel)" msgstr "" -#: sndfile_helpers.cc:82 +#: sndfile_helpers.cc:84 msgid "Big-endian (PowerPC)" msgstr "" -#: sndfilesource.cc:201 +#: sndfilesource.cc:210 msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)" msgstr "" -#: sndfilesource.cc:209 +#: sndfilesource.cc:218 msgid "" "SndFileSource: file only contains %1 channels; %2 is invalid as a channel " "number" msgstr "" -#: sndfilesource.cc:255 sndfilesource.cc:571 sndfilesource.cc:595 +#: sndfilesource.cc:264 sndfilesource.cc:604 sndfilesource.cc:628 msgid "" "cannot set broadcast info for audio file %1 (%2); dropping broadcast info " "for this file" msgstr "" -#: sndfilesource.cc:302 +#: sndfilesource.cc:311 msgid "could not allocate file %1 for reading." msgstr "" -#: sndfilesource.cc:337 +#: sndfilesource.cc:346 msgid "SndFileSource: could not seek to frame %1 within %2 (%3)" msgstr "" -#: sndfilesource.cc:347 +#: sndfilesource.cc:356 msgid "" "SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)" msgstr "" -#: sndfilesource.cc:391 sndfilesource.cc:420 +#: sndfilesource.cc:400 sndfilesource.cc:429 msgid "attempt to write a non-writable audio file source (%1)" msgstr "" -#: sndfilesource.cc:396 utils.cc:510 utils.cc:534 utils.cc:548 utils.cc:567 +#: sndfilesource.cc:405 utils.cc:547 utils.cc:571 utils.cc:585 utils.cc:604 msgid "programming error: %1 %2" msgstr "" -#: sndfilesource.cc:523 +#: sndfilesource.cc:532 sndfilesource.cc:562 msgid "attempt to flush a non-writable audio file source (%1)" msgstr "" -#: sndfilesource.cc:528 +#: sndfilesource.cc:537 sndfilesource.cc:557 msgid "attempt to flush an un-opened audio file source (%1)" msgstr "" -#: sndfilesource.cc:534 +#: sndfilesource.cc:543 msgid "could not allocate file %1 to write header" msgstr "" -#: sndfilesource.cc:548 +#: sndfilesource.cc:568 +msgid "could not allocate file %1 to flush contents" +msgstr "" + +#: sndfilesource.cc:581 msgid "" "attempt to store broadcast info in a non-writable audio file source (%1)" msgstr "" -#: sndfilesource.cc:553 +#: sndfilesource.cc:586 msgid "attempt to set BWF info for an un-opened audio file source (%1)" msgstr "" -#: sndfilesource.cc:614 +#: sndfilesource.cc:647 msgid "%1: cannot seek to %2 (libsndfile error: %3)" msgstr "" -#: sndfilesource.cc:727 +#: sndfilesource.cc:760 msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)" msgstr "" -#: sndfilesource.cc:740 sndfilesource.cc:790 sndfilesource.cc:797 +#: sndfilesource.cc:773 sndfilesource.cc:823 sndfilesource.cc:830 msgid "SndFileSource: \"%1\" bad write (%2)" msgstr "" -#: sndfilesource.cc:820 +#: sndfilesource.cc:853 msgid "" "Filesource: start time is already set for existing file (%1): Cannot change " "start time." msgstr "" -#: speakers.cc:239 +#: speakers.cc:280 msgid "Speaker information is missing azimuth - speaker ignored" msgstr "" -#: speakers.cc:245 +#: speakers.cc:286 msgid "Speaker information is missing elevation - speaker ignored" msgstr "" -#: speakers.cc:251 +#: speakers.cc:292 msgid "Speaker information is missing distance - speaker ignored" msgstr "" +#: srcfilesource.cc:135 +msgid "SrcFileSource: %1" +msgstr "" + #: tape_file_matcher.cc:46 msgid "Cannot compile tape track regexp for use (%1)" msgstr "" @@ -2418,54 +2438,54 @@ msgstr "" msgid "Node for Port has no \"name\" property" msgstr "" -#: utils.cc:358 utils.cc:382 +#: utils.cc:395 utils.cc:419 msgid "Splice" msgstr "Skarv" -#: utils.cc:360 utils.cc:375 +#: utils.cc:397 utils.cc:412 msgid "Slide" msgstr "Glid" -#: utils.cc:362 utils.cc:378 +#: utils.cc:399 utils.cc:415 msgid "Lock" msgstr "LÃ¥s" -#: utils.cc:365 +#: utils.cc:402 msgid "programming error: unknown edit mode string \"%1\"" msgstr "" -#: utils.cc:389 utils.cc:421 +#: utils.cc:426 utils.cc:458 msgid "MIDI Timecode" msgstr "" -#: utils.cc:389 utils.cc:419 +#: utils.cc:426 utils.cc:456 msgid "MTC" msgstr "" -#: utils.cc:393 utils.cc:428 +#: utils.cc:430 utils.cc:465 msgid "MIDI Clock" msgstr "" -#: utils.cc:397 utils.cc:415 utils.cc:435 +#: utils.cc:434 utils.cc:452 utils.cc:472 msgid "JACK" msgstr "" -#: utils.cc:401 +#: utils.cc:438 msgid "programming error: unknown sync source string \"%1\"" msgstr "" -#: utils.cc:426 +#: utils.cc:463 msgid "M-Clock" msgstr "" -#: utils.cc:432 +#: utils.cc:469 msgid "LTC" msgstr "" -#: utils.cc:602 +#: utils.cc:639 msgid "programming error: unknown native header format: %1" msgstr "" -#: utils.cc:617 +#: utils.cc:654 msgid "cannot open directory %1 (%2)" msgstr "" diff --git a/libs/ardour/po/zh.po b/libs/ardour/po/zh.po index d39877d9f5..bf937f2a0a 100644 --- a/libs/ardour/po/zh.po +++ b/libs/ardour/po/zh.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Ardour 3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-11-05 11:11-0500\n" +"POT-Creation-Date: 2014-02-10 17:53+0100\n" "PO-Revision-Date: 2012-08-26 13:43+0800\n" "Last-Translator: Rui-huai Zhang <zrhzrh>\n" "Language-Team: zrhzrh <zrhzrh@mail.ustc.edu.cn>\n" @@ -21,64 +21,64 @@ msgstr "" msgid "Fader" msgstr "" -#: audio_diskstream.cc:244 +#: audio_diskstream.cc:242 msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist" msgstr "" -#: audio_diskstream.cc:296 +#: audio_diskstream.cc:294 msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!" msgstr "" -#: audio_diskstream.cc:848 audio_diskstream.cc:858 +#: audio_diskstream.cc:846 audio_diskstream.cc:856 msgid "" "AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3" msgstr "" -#: audio_diskstream.cc:1014 +#: audio_diskstream.cc:1012 msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3" msgstr "" -#: audio_diskstream.cc:1383 audio_diskstream.cc:1400 +#: audio_diskstream.cc:1381 audio_diskstream.cc:1398 msgid "AudioDiskstream %1: cannot write to disk" msgstr "音频ç£ç›˜æµ %1: æ— æ³•å¸å…¥åˆ°ç¡¬ç›˜" -#: audio_diskstream.cc:1443 +#: audio_diskstream.cc:1441 msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!" msgstr "" -#: audio_diskstream.cc:1537 +#: audio_diskstream.cc:1535 msgid "%1: could not create region for complete audio file" msgstr "" -#: audio_diskstream.cc:1571 +#: audio_diskstream.cc:1569 msgid "AudioDiskstream: could not create region for captured audio!" msgstr "" -#: audio_diskstream.cc:1679 +#: audio_diskstream.cc:1677 msgid "programmer error: %1" msgstr "程åºé”™è¯¯: %1" -#: audio_diskstream.cc:1905 +#: audio_diskstream.cc:1903 msgid "AudioDiskstream: channel %1 out of range" msgstr "音频ç£ç›˜æµ: å£°é“ %1 超出范围" -#: audio_diskstream.cc:1919 midi_diskstream.cc:1210 +#: audio_diskstream.cc:1917 midi_diskstream.cc:1209 msgid "%1:%2 new capture file not initialized correctly" msgstr "" -#: audio_diskstream.cc:2200 +#: audio_diskstream.cc:2198 msgid "%1: cannot restore pending capture source file %2" msgstr "" -#: audio_diskstream.cc:2222 +#: audio_diskstream.cc:2220 msgid "%1: incorrect number of pending sources listed - ignoring them all" msgstr "" -#: audio_diskstream.cc:2246 +#: audio_diskstream.cc:2244 msgid "%1: cannot create whole-file region from pending capture sources" msgstr "" -#: audio_library.cc:71 +#: audio_library.cc:81 msgid "Could not open %1. Audio Library not saved" msgstr "æ— æ³•æ‰“å¼€ %1. 音频库未ä¿å˜" @@ -118,11 +118,11 @@ msgstr "" msgid "Audio Playlists (unused)" msgstr "音频æ’放列表(未使用)" -#: audio_playlist_source.cc:171 audiosource.cc:913 file_source.cc:529 +#: audio_playlist_source.cc:171 audiosource.cc:891 file_source.cc:520 #: midi_playlist_source.cc:144 midi_playlist_source.cc:152 -#: midi_playlist_source.cc:159 midi_source.cc:371 plugin_insert.cc:643 -#: rb_effect.cc:333 session.cc:2619 session.cc:2652 session.cc:3797 -#: session_handle.cc:87 sndfilesource.cc:121 +#: midi_playlist_source.cc:159 midi_source.cc:370 plugin_insert.cc:634 +#: rb_effect.cc:333 session.cc:2636 session.cc:2669 session.cc:3814 +#: session_handle.cc:87 sndfilesource.cc:122 msgid "programming error: %1" msgstr "程åºé”™è¯¯: %1" @@ -150,23 +150,23 @@ msgstr "" "\n" "声é“:" -#: audio_track.cc:167 +#: audio_track.cc:161 msgid "Unknown bundle \"%1\" listed for input of %2" msgstr "" -#: audio_track.cc:169 +#: audio_track.cc:163 msgid "in 1" msgstr "" -#: audio_track.cc:170 +#: audio_track.cc:164 msgid "No input bundles available as a replacement" msgstr "" -#: audio_track.cc:174 +#: audio_track.cc:168 msgid "Bundle %1 was not available - \"in 1\" used instead" msgstr "" -#: audio_track.cc:183 +#: audio_track.cc:177 msgid "improper input channel list in XML node (%1)" msgstr "" @@ -190,23 +190,23 @@ msgstr "æ— æ³•è½½å…¥VAMPæ’件 \"%1\"" msgid "VAMP Plugin \"%1\" could not be loaded" msgstr "æ— æ³•è½½å…¥VAMPæ’件 \"%1\"" -#: audioengine.cc:488 +#: audioengine.cc:495 msgid "looking for backends in %1\n" msgstr "" -#: audioengine.cc:511 +#: audioengine.cc:518 msgid "AudioEngine: cannot load module \"%1\" (%2)" msgstr "" -#: audioengine.cc:517 +#: audioengine.cc:524 msgid "AudioEngine: backend at \"%1\" has no descriptor function." msgstr "" -#: audioengine.cc:589 +#: audioengine.cc:596 msgid "Could not create backend for %1: %2" msgstr "" -#: audioregion.cc:1643 +#: audioregion.cc:1651 msgid "" "You have requested an operation that requires audio analysis.\n" "\n" @@ -221,11 +221,11 @@ msgid "" "this and future transient-detection operations.\n" msgstr "" -#: audiosource.cc:199 +#: audiosource.cc:210 msgid "cannot rename peakfile for %1 from %2 to %3 (%4)" msgstr "æ— æ³•ä¸º %1 é‡å‘½å峰文件(peakfile), 从 %2 到 %3 (%4)" -#: audiosource.cc:226 +#: audiosource.cc:239 msgid "AudioSource: cannot stat peakfile \"%1\"" msgstr "" @@ -233,47 +233,68 @@ msgstr "" msgid "cannot read sample data for unscaled peak computation" msgstr "æ— æ³•ä¸ºæ— æ ‡åº¦çš„å³°è®¡ç®—è¯»å–é‡‡æ ·æ•°æ®" -#: audiosource.cc:387 +#: audiosource.cc:386 msgid "AudioSource: cannot open peakpath (a) \"%1\" (%2)" msgstr "" -#: audiosource.cc:463 +#: audiosource.cc:395 audiosource.cc:473 +msgid "" +"AudioSource: could not seek to correct location in peak file \"%1\" (%2)" +msgstr "" + +#: audiosource.cc:453 msgid "AudioSource: cannot open peakpath (b) \"%1\" (%2)" msgstr "" -#: audiosource.cc:587 +#: audiosource.cc:567 msgid "" "AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)" msgstr "" -#: audiosource.cc:667 +#: audiosource.cc:634 msgid "%1: could not write read raw data for peak computation (%2)" msgstr "" -#: audiosource.cc:706 +#: audiosource.cc:672 msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)" msgstr "" -#: audiosource.cc:773 audiosource.cc:886 +#: audiosource.cc:739 audiosource.cc:861 +msgid "%1: could not seek in peak file data (%2)" +msgstr "" + +#: audiosource.cc:744 audiosource.cc:870 msgid "%1: could not write peak file data (%2)" msgstr "" -#: audiosource.cc:924 +#: audiosource.cc:903 msgid "could not truncate peakfile %1 to %2 (error: %3)" msgstr "" -#: auditioner.cc:87 -msgid "no outputs available for auditioner - manual connection required" +#: auditioner.cc:95 +msgid "Falling back to Reasonable Synth for Midi Audition" +msgstr "" + +#: auditioner.cc:97 +msgid "No synth for midi-audition found." msgstr "" -#: auditioner.cc:135 -msgid "Auditioning of non-audio regions not yet supported" +#: auditioner.cc:152 +msgid "no outputs available for auditioner - manual connection required" msgstr "" -#: auditioner.cc:160 +#: auditioner.cc:392 auditioner.cc:438 msgid "Cannot setup auditioner processing flow for %1 channels" msgstr "" +#: auditioner.cc:426 +msgid "Failed to load synth for MIDI-Audition." +msgstr "" + +#: auditioner.cc:445 +msgid "Auditioning of regions other than Audio or Midi is not supported." +msgstr "" + #: automatable.cc:81 msgid "Automation node has no path property" msgstr "" @@ -305,23 +326,23 @@ msgid "" "AutomationList: passed XML node called %1, not \"AutomationList\" - ignored" msgstr "" -#: butler.cc:91 +#: butler.cc:80 msgid "Cannot create transport request signal pipe (%1)" msgstr "" -#: butler.cc:97 butler.cc:103 +#: butler.cc:86 butler.cc:92 msgid "UI: cannot set O_NONBLOCK on butler request pipe (%1)" msgstr "" -#: butler.cc:109 +#: butler.cc:124 msgid "Session: could not create butler thread" msgstr "会è¯ï¼šæ— 法创建管家线程" -#: butler.cc:156 +#: butler.cc:165 msgid "poll on butler request pipe failed (%1)" msgstr "" -#: butler.cc:163 +#: butler.cc:172 msgid "Error on butler thread request pipe: fd=%1 err=%2" msgstr "" @@ -329,55 +350,55 @@ msgstr "" msgid "Error reading from butler request pipe" msgstr "" -#: butler.cc:248 +#: butler.cc:301 msgid "Butler read ahead failure on dstream %1" msgstr "" -#: butler.cc:285 +#: butler.cc:338 msgid "Butler write-behind failure on dstream %1" msgstr "" -#: control_protocol_manager.cc:134 +#: control_protocol_manager.cc:164 msgid "control protocol name \"%1\" has no descriptor" msgstr "控制åè®®å称 \"%1\" 没有æ述符" -#: control_protocol_manager.cc:141 +#: control_protocol_manager.cc:171 msgid "control protocol name \"%1\" could not be initialized" msgstr "控制åè®®å称 \"%1\" æ— æ³•åˆå§‹åŒ–" -#: control_protocol_manager.cc:201 +#: control_protocol_manager.cc:237 msgid "Instantiating mandatory control protocol %1" msgstr "实例强制性控制åè®® %1" -#: control_protocol_manager.cc:222 +#: control_protocol_manager.cc:258 msgid "looking for control protocols in %1\n" msgstr "" -#: control_protocol_manager.cc:247 +#: control_protocol_manager.cc:283 msgid "Control protocol %1 not usable" msgstr "" -#: control_protocol_manager.cc:264 +#: control_protocol_manager.cc:300 msgid "Control surface protocol discovered: \"%1\"\n" msgstr "" -#: control_protocol_manager.cc:282 +#: control_protocol_manager.cc:318 msgid "ControlProtocolManager: cannot load module \"%1\" (%2)" msgstr "" -#: control_protocol_manager.cc:290 +#: control_protocol_manager.cc:324 msgid "ControlProtocolManager: module \"%1\" has no descriptor function." msgstr "控制å议管ç†å™¨: æ¨¡å— \"%1\" 没有æ述符函数" -#: cycle_timer.cc:38 +#: cycle_timer.cc:40 msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo" msgstr "" -#: cycle_timer.cc:50 +#: cycle_timer.cc:52 msgid "CycleTimer::get_mhz(): cannot locate cpu MHz in /proc/cpuinfo" msgstr "" -#: cycle_timer.cc:73 +#: cycle_timer.cc:75 msgid "cannot locate cpu MHz in /proc/cpuinfo" msgstr "" @@ -385,7 +406,7 @@ msgstr "" msgid "audio" msgstr "音频" -#: data_type.cc:28 session.cc:1791 session.cc:1794 +#: data_type.cc:28 session.cc:1808 session.cc:1811 msgid "MIDI" msgstr "MIDI" @@ -393,15 +414,15 @@ msgstr "MIDI" msgid "unknown" msgstr "未知" -#: delivery.cc:114 +#: delivery.cc:118 msgid "main outs" msgstr "" -#: delivery.cc:117 send.cc:61 +#: delivery.cc:121 send.cc:62 msgid "listen" msgstr "" -#: diskstream.cc:303 +#: diskstream.cc:302 msgid "Location \"%1\" not valid for track loop (start >= end)" msgstr "" @@ -413,23 +434,23 @@ msgstr "æ— æ³•å¾—åˆ°è¾“å‡ºå£°é“ \"%1\" 的端å£, 丢弃æ¤å£°é“" msgid "Export failed: %1" msgstr "导出失败: %1" -#: export_filename.cc:118 +#: export_filename.cc:119 msgid "Existing export folder for this session (%1) does not exist - ignored" msgstr "" -#: export_filename.cc:229 +#: export_filename.cc:230 msgid "No Time" msgstr "没时间" -#: export_filename.cc:238 +#: export_filename.cc:239 msgid "Invalid time format" msgstr "éžæ³•æ—¶é—´æ ¼å¼" -#: export_filename.cc:247 +#: export_filename.cc:248 msgid "No Date" msgstr "æ— æ—¥æœŸ" -#: export_filename.cc:262 +#: export_filename.cc:263 msgid "Invalid date format" msgstr "éžæ³•æ—¥æœŸæ ¼å¼" @@ -497,7 +518,7 @@ msgstr "三角形" msgid "Rectangular" msgstr "长方形" -#: export_formats.cc:52 session.cc:5014 session.cc:5030 +#: export_formats.cc:52 session.cc:5006 session.cc:5022 msgid "None" msgstr "" @@ -537,15 +558,15 @@ msgstr "Vorbisé‡‡æ ·æ ¼å¼" msgid "No sample format" msgstr "æ— é‡‡æ ·æ ¼å¼" -#: export_handler.cc:335 +#: export_handler.cc:343 msgid "Editor: cannot open \"%1\" as export file for CD marker file" msgstr "" -#: export_handler.cc:417 export_handler.cc:420 +#: export_handler.cc:425 export_handler.cc:428 msgid "an error occured while writing a TOC/CUE file: %1" msgstr "" -#: export_handler.cc:642 export_handler.cc:700 +#: export_handler.cc:650 export_handler.cc:708 msgid "Cannot convert %1 to Latin-1 text" msgstr "" @@ -607,7 +628,7 @@ msgid "" "configuration" msgstr "" -#: file_source.cc:198 session_state.cc:2807 +#: file_source.cc:198 session_state.cc:2843 msgid "" "there are already 1000 files with names like %1; versioning discontinued" msgstr "" @@ -616,35 +637,35 @@ msgstr "" msgid "cannot rename file source from %1 to %2 (%3)" msgstr "" -#: file_source.cc:250 file_source.cc:378 +#: file_source.cc:248 file_source.cc:372 msgid "FileSource: search path not set" msgstr "文件æº: 没设置æœç´¢è·¯å¾„" -#: file_source.cc:313 file_source.cc:448 -msgid "Filesource: cannot find required file (%1): while searching %2" +#: file_source.cc:309 file_source.cc:439 +msgid "Filesource: cannot find required file (%1)" msgstr "" -#: file_source.cc:440 +#: file_source.cc:432 msgid "" -"FileSource: \"%1\" is ambigous when searching %2\n" +"FileSource: \"%1\" is ambigous when searching\n" "\t" msgstr "" -#: file_source.cc:494 +#: file_source.cc:484 msgid "Filesource: cannot find required file (%1): %2" msgstr "文件æº: æ— æ³•æ‰¾åˆ°è¦æ±‚的文件 (%1): %2" -#: file_source.cc:501 +#: file_source.cc:492 msgid "Filesource: cannot check for existing file (%1): %2" msgstr "" -#: file_source.cc:535 +#: file_source.cc:526 msgid "" "Programming error! %1 tried to rename a file over another file! It's safe to " "continue working, but please report this to the developers." msgstr "" -#: file_source.cc:540 +#: file_source.cc:531 msgid "cannot rename file %1 to %2 (%3)" msgstr "æ— æ³•é‡å‘½å文件 %1 到 %2 (%3)" @@ -658,15 +679,15 @@ msgid "" "cannot run" msgstr "" -#: filesystem_paths.cc:91 +#: filesystem_paths.cc:96 msgid "ARDOUR_DLL_PATH not set in environment - exiting\n" msgstr "" -#: filesystem_paths.cc:107 +#: filesystem_paths.cc:125 msgid "ARDOUR_CONFIG_PATH not set in environment - exiting\n" msgstr "" -#: filesystem_paths.cc:127 +#: filesystem_paths.cc:148 msgid "ARDOUR_DATA_PATH not set in environment - exiting\n" msgstr "" @@ -678,87 +699,83 @@ msgstr "" msgid "filter: error creating new file %1 (%2)" msgstr "" -#: find_session.cc:51 -msgid "Could not resolve path: %1 (%2)" -msgstr "æ— æ³•è§£å†³è·¯å¾„: %1 (%2)" - -#: find_session.cc:63 +#: find_session.cc:59 msgid "cannot check session path %1 (%2)" msgstr "æ— æ³•æ£€æŸ¥ä¼šè¯è·¯å¾„ %1 (%2)" -#: find_session.cc:89 +#: find_session.cc:85 msgid "cannot check statefile %1 (%2)" msgstr "" -#: find_session.cc:125 +#: find_session.cc:121 msgid "%1 is not a snapshot file" msgstr "%1 ä¸æ˜¯ä¸€ä¸ªå¿«ç…§æ–‡ä»¶" -#: find_session.cc:142 +#: find_session.cc:138 msgid "cannot determine current working directory (%1)" msgstr "" -#: find_session.cc:159 +#: find_session.cc:155 msgid "unknown file type for session %1" msgstr "" -#: globals.cc:207 +#: globals.cc:216 msgid "Could not set system open files limit to \"unlimited\"" msgstr "" -#: globals.cc:209 +#: globals.cc:218 msgid "Could not set system open files limit to %1" msgstr "" -#: globals.cc:213 +#: globals.cc:222 msgid "Your system is configured to limit %1 to only %2 open files" msgstr "" -#: globals.cc:217 +#: globals.cc:226 msgid "Could not get system open files limit (%1)" msgstr "" -#: globals.cc:268 +#: globals.cc:280 msgid "Loading configuration" msgstr "载入é…ç½®" -#: import.cc:207 +#: import.cc:208 msgid "Could not find a source for %1 even though we are updating this file!" msgstr "" -#: import.cc:236 +#: import.cc:237 msgid "Unable to create file %1 during import" msgstr "åœ¨å¯¼å…¥æœŸé—´æ— æ³•åˆ›å»ºæ–‡ä»¶ %1" -#: import.cc:262 +#: import.cc:263 msgid "Resampling %1 from %2kHz to %3kHz" msgstr "" -#: import.cc:268 +#: import.cc:269 msgid "Copying %1" msgstr "å¤åˆ¶ %1 ä¸" -#: import.cc:446 +#: import.cc:455 msgid "Track %1 of %2 contained no usable MIDI data" msgstr "" -#: import.cc:453 +#: import.cc:462 msgid "MIDI file %1 was not readable (no reason available)" msgstr "" -#: import.cc:499 +#: import.cc:508 msgid "Import: cannot open input sound file \"%1\"" msgstr "" -#: import.cc:510 +#: import.cc:519 msgid "Import: error opening MIDI file" msgstr "导入: 错误打开MIDI文件" -#: import.cc:549 +#: import.cc:558 msgid "Loading MIDI file %1" msgstr "载入MIDI文件 %1" -#: import.cc:614 +#: import.cc:623 msgid "Failed to remove some files after failed/cancelled import operation" msgstr "" @@ -770,153 +787,153 @@ msgstr "" msgid "preset %1 (bank %2)" msgstr "" -#: internal_send.cc:278 internal_send.cc:279 +#: internal_send.cc:300 internal_send.cc:301 msgid "%1 - cannot find any track/bus with the ID %2 to connect to" msgstr "" -#: io.cc:208 +#: io.cc:209 msgid "IO: cannot disconnect port %1 from %2" msgstr "IO: æ— æ³•å¤±åŽ»ä»Ž %2 çš„è¿žæŽ¥ç«¯å£ %1" -#: io.cc:343 io.cc:428 +#: io.cc:344 io.cc:431 msgid "IO: cannot register input port %1" msgstr "IO: æ— æ³•æ³¨å†Œè¾“å…¥ç«¯å£ %1" -#: io.cc:348 io.cc:433 +#: io.cc:349 io.cc:436 msgid "IO: cannot register output port %1" msgstr "æ— æ³•æ³¨å†Œè¾“å‡ºç«¯å£ %1" -#: io.cc:591 io.cc:647 +#: io.cc:598 io.cc:654 msgid "incorrect XML node \"%1\" passed to IO object" msgstr "ä¸æ£ç¡®çš„XMLç¬¦å· \"%1\" 通过IO对象" -#: io.cc:706 +#: io.cc:713 msgid "in" msgstr "" -#: io.cc:706 +#: io.cc:713 msgid "out" msgstr "" -#: io.cc:707 +#: io.cc:714 msgid "input" msgstr "输入" -#: io.cc:707 +#: io.cc:714 msgid "output" msgstr "输出" -#: io.cc:717 +#: io.cc:724 msgid "Unknown bundle \"%1\" listed for %2 of %3" msgstr "" -#: io.cc:783 +#: io.cc:790 msgid "Bundle %1 was not available - \"%2\" used instead" msgstr "" -#: io.cc:786 +#: io.cc:793 msgid "No %1 bundles available as a replacement" msgstr "" -#: io.cc:889 +#: io.cc:896 msgid "%1: cannot create I/O ports" msgstr "%1: æ— æ³•åˆ›å»ºI/O端å£" -#: io.cc:1017 io.cc:1121 +#: io.cc:1024 io.cc:1128 msgid "IO: badly formed string in XML node for inputs \"%1\"" msgstr "" -#: io.cc:1022 io.cc:1126 +#: io.cc:1029 io.cc:1133 msgid "bad input string in XML node \"%1\"" msgstr "" -#: io.cc:1060 +#: io.cc:1067 msgid "IO: badly formed string in XML node for outputs \"%1\"" msgstr "" -#: io.cc:1065 +#: io.cc:1072 msgid "IO: bad output string in XML node \"%1\"" msgstr "" -#: io.cc:1411 +#: io.cc:1417 #, c-format msgid "%s %u" msgstr "" -#: io.cc:1458 +#: io.cc:1464 #, c-format msgid "%s in" msgstr "" -#: io.cc:1460 +#: io.cc:1466 #, c-format msgid "%s out" msgstr "" -#: io.cc:1535 session.cc:686 session.cc:715 +#: io.cc:1541 session.cc:689 session.cc:718 msgid "mono" msgstr "å•å£°é“" -#: io.cc:1537 session.cc:699 session.cc:729 +#: io.cc:1543 session.cc:702 session.cc:732 msgid "L" msgstr "" -#: io.cc:1537 session.cc:701 session.cc:731 +#: io.cc:1543 session.cc:704 session.cc:734 msgid "R" msgstr "" -#: io.cc:1539 io.cc:1545 +#: io.cc:1545 io.cc:1551 #, c-format msgid "%d" msgstr "" -#: ladspa_plugin.cc:86 +#: ladspa_plugin.cc:93 +msgid "LADSPA: Unable to open module: " +msgstr "" + +#: ladspa_plugin.cc:99 msgid "LADSPA: module has no descriptor function." msgstr "LADSPA: 模å—没有æ述符函数." -#: ladspa_plugin.cc:91 +#: ladspa_plugin.cc:106 msgid "LADSPA: plugin has gone away since discovery!" msgstr "LADSPA: 当å‘现æ’件时, æ’件已ç»ä¸è§äº†." -#: ladspa_plugin.cc:98 +#: ladspa_plugin.cc:113 msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing" msgstr "" -#: ladspa_plugin.cc:297 +#: ladspa_plugin.cc:311 msgid "" "illegal parameter number used with plugin \"%1\". This may indicate a change " "in the plugin design, and presets may be invalid" msgstr "" -#: ladspa_plugin.cc:376 ladspa_plugin.cc:426 +#: ladspa_plugin.cc:390 ladspa_plugin.cc:440 msgid "Bad node sent to LadspaPlugin::set_state" msgstr "å的符å·å‘é€è‡³ LadspaPlugin::set_state" -#: ladspa_plugin.cc:391 ladspa_plugin.cc:440 +#: ladspa_plugin.cc:405 ladspa_plugin.cc:454 msgid "LADSPA: no ladspa port number" msgstr "LADSPA: 没有 ladspa 端å£æ•°é‡" -#: ladspa_plugin.cc:397 ladspa_plugin.cc:446 +#: ladspa_plugin.cc:411 ladspa_plugin.cc:460 msgid "LADSPA: no ladspa port data" msgstr "LADSPA: 没有LADSPA端å£æ•°æ®" -#: ladspa_plugin.cc:717 -msgid "LADSPA: cannot load module from \"%1\"" -msgstr "LADSPA: æ— æ³•ä»Ž \"%1\" 载入模å—" - -#: ladspa_plugin.cc:827 +#: ladspa_plugin.cc:840 msgid "Could not locate HOME. Preset not removed." msgstr "æ— æ³•å®šä½HOME. 预设没被移除." -#: ladspa_plugin.cc:864 ladspa_plugin.cc:870 +#: ladspa_plugin.cc:879 ladspa_plugin.cc:885 msgid "Could not create %1. Preset not saved. (%2)" msgstr "ä¸èƒ½åˆ›å»º %1. 预设没ä¿å˜. (%2)" -#: ladspa_plugin.cc:877 +#: ladspa_plugin.cc:892 msgid "Error saving presets file %1." msgstr "" -#: ladspa_plugin.cc:915 +#: ladspa_plugin.cc:934 msgid "Could not locate HOME. Preset not saved." msgstr "æ— æ³•å®šä½HOME. 预设没ä¿å˜." @@ -956,7 +973,7 @@ msgstr "" msgid "incorrect XML mode passed to Locations::set_state" msgstr "" -#: location.cc:842 session.cc:4516 session_state.cc:1031 +#: location.cc:842 session.cc:4533 session_state.cc:1025 msgid "session" msgstr "会è¯" @@ -1011,40 +1028,39 @@ msgid "Session and LTC framerate mismatch: LTC:%1 Session:%2." msgstr "" #: ltc_slave.cc:591 -#, c-format msgid "flywheel" msgstr "" -#: midi_diskstream.cc:167 +#: midi_diskstream.cc:166 msgid "" "%1: I/O configuration change %4 requested to use %2, but channel setup is %3" msgstr "" -#: midi_diskstream.cc:219 +#: midi_diskstream.cc:218 msgid "MidiDiskstream: Playlist \"%1\" isn't a midi playlist" msgstr "" -#: midi_diskstream.cc:270 +#: midi_diskstream.cc:269 msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!" msgstr "" -#: midi_diskstream.cc:699 +#: midi_diskstream.cc:698 msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3" msgstr "" -#: midi_diskstream.cc:834 +#: midi_diskstream.cc:833 msgid "MidiDiskstream %1: cannot write to disk" msgstr "MIDIç£ç›˜æµ %1: æ— æ³•å†™å…¥ç¡¬ç›˜" -#: midi_diskstream.cc:868 +#: midi_diskstream.cc:867 msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!" msgstr "" -#: midi_diskstream.cc:955 +#: midi_diskstream.cc:954 msgid "%1: could not create region for complete midi file" msgstr "" -#: midi_diskstream.cc:992 +#: midi_diskstream.cc:991 msgid "MidiDiskstream: could not create region for captured midi!" msgstr "" @@ -1056,27 +1072,27 @@ msgstr "" msgid "No SysExID found for sys-ex property change - ignored" msgstr "" -#: midi_model.cc:2010 +#: midi_model.cc:2012 msgid "transpose" msgstr "" -#: midi_patch_manager.cc:126 +#: midi_patch_manager.cc:127 msgid "Duplicate MIDI device `%1' in `%2' ignored" msgstr "" -#: midi_source.cc:125 +#: midi_source.cc:124 msgid "Missing parameter property on InterpolationStyle" msgstr "" -#: midi_source.cc:132 +#: midi_source.cc:131 msgid "Missing style property on InterpolationStyle" msgstr "" -#: midi_source.cc:144 +#: midi_source.cc:143 msgid "Missing parameter property on AutomationState" msgstr "" -#: midi_source.cc:151 +#: midi_source.cc:150 msgid "Missing state property on AutomationState" msgstr "" @@ -1120,21 +1136,21 @@ msgstr "" msgid "solo control" msgstr "" -#: mtc_slave.cc:238 +#: mtc_slave.cc:240 msgid "MTC Slave: atomic read of current time failed, sleeping!" msgstr "" -#: mtc_slave.cc:361 +#: mtc_slave.cc:362 msgid "" "Unknown rate/drop value %1 in incoming MTC stream, session values used " "instead" msgstr "" -#: mtc_slave.cc:381 +#: mtc_slave.cc:382 msgid "Session framerate adjusted from %1 TO: MTC's %2." msgstr "" -#: mtc_slave.cc:395 +#: mtc_slave.cc:396 msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3." msgstr "" @@ -1194,31 +1210,35 @@ msgstr "" msgid "Pannable given XML data for %1 - ignored" msgstr "" -#: panner_manager.cc:76 -msgid "looking for panners in %1" +#: panner_manager.cc:80 +msgid "looking for panners in %1\n" msgstr "" -#: panner_manager.cc:100 -msgid "Panner discovered: \"%1\" in %2" +#: panner_manager.cc:108 +msgid "Panner discovered: \"%1\" in %2\n" msgstr "" -#: panner_manager.cc:117 +#: panner_manager.cc:125 msgid "PannerManager: cannot load module \"%1\" (%2)" msgstr "" -#: panner_manager.cc:124 +#: panner_manager.cc:132 msgid "PannerManager: module \"%1\" has no descriptor function." msgstr "" -#: panner_manager.cc:187 +#: panner_manager.cc:219 msgid "no panner discovered for in/out = %1/%2" msgstr "" -#: panner_shell.cc:179 +#: panner_shell.cc:126 +msgid "select panner: %1\n" +msgstr "" + +#: panner_shell.cc:245 msgid "Unknown panner plugin \"%1\" found in pan state - ignored" msgstr "" -#: panner_shell.cc:185 +#: panner_shell.cc:251 msgid "panner plugin node has no type information!" msgstr "" @@ -1238,19 +1258,19 @@ msgstr "" msgid "Could not construct playlist for PlaylistSource from session data!" msgstr "" -#: plugin.cc:324 +#: plugin.cc:328 msgid "" "Plugin presets are not supported in this build of %1. Consider paying for a " "full version" msgstr "" -#: plugin.cc:398 +#: plugin.cc:402 msgid "" "Saving plugin settings is not supported in this build of %1. Consider paying " "for the full version" msgstr "" -#: plugin_insert.cc:598 +#: plugin_insert.cc:589 msgid "programming error: " msgstr "程åºé”™è¯¯:" @@ -1284,43 +1304,43 @@ msgstr "" msgid "PluginInsert: automatable control %1 not found - ignored" msgstr "" -#: plugin_manager.cc:161 +#: plugin_manager.cc:165 msgid "Discovering Plugins" msgstr "å‘现æ’件" -#: plugin_manager.cc:335 +#: plugin_manager.cc:286 msgid "Could not parse rdf file: %1" msgstr "æ— æ³•ä¼ é€’ rdf文件: %1" -#: plugin_manager.cc:374 +#: plugin_manager.cc:330 msgid "LADSPA: cannot load module \"%1\" (%2)" msgstr "LADSPA: æ— æ³•è½½å…¥æ¨¡å— \"%1\" (%2)" -#: plugin_manager.cc:381 +#: plugin_manager.cc:337 msgid "LADSPA: module \"%1\" has no descriptor function." msgstr "" -#: plugin_manager.cc:602 +#: plugin_manager.cc:567 msgid "" "VST plugin %1 does not support processReplacing, and so cannot be used in %2 " "at this time" msgstr "" -#: plugin_manager.cc:709 +#: plugin_manager.cc:680 msgid "" "linuxVST plugin %1 does not support processReplacing, and so cannot be used " "in %2 at this time" msgstr "" -#: plugin_manager.cc:870 +#: plugin_manager.cc:841 msgid "unknown plugin status type \"%1\" - all entries ignored" msgstr "" -#: plugin_manager.cc:887 +#: plugin_manager.cc:858 msgid "unknown plugin type \"%1\" - ignored" msgstr "ä½ç½®æ’件类型 \"%1\" - 忽略之" -#: port.cc:410 +#: port.cc:412 msgid "could not reregister %1" msgstr "æ— æ³•æ³¨å†Œ %1." @@ -1328,11 +1348,11 @@ msgstr "æ— æ³•æ³¨å†Œ %1." msgid "insert %1" msgstr "æ’å…¥ %1" -#: port_insert.cc:198 +#: port_insert.cc:197 msgid "XML node describing port insert is missing the `type' field" msgstr "" -#: port_insert.cc:203 +#: port_insert.cc:202 msgid "non-port insert XML used for port plugin insert" msgstr "" @@ -1364,11 +1384,11 @@ msgstr "音频引擎: æ— æ³•è¿žæŽ¥ %1 (%2) 到 %3 (%4)" msgid "Re-establising port %1 failed" msgstr "" -#: processor.cc:207 +#: processor.cc:208 msgid "No %1 property flag in element %2" msgstr "" -#: processor.cc:216 +#: processor.cc:217 msgid "No child node with active property" msgstr "" @@ -1432,11 +1452,11 @@ msgstr "" msgid "cannot create new name for region \"%1\"" msgstr "" -#: resampled_source.cc:98 +#: resampled_source.cc:102 msgid "Import: %1" msgstr "导入: %1" -#: resampled_source.cc:128 +#: resampled_source.cc:132 srcfilesource.cc:76 msgid "Import: src_new() failed : %1" msgstr "导入: src_new() 失败 : %1" @@ -1444,27 +1464,27 @@ msgstr "导入: src_new() 失败 : %1" msgid "return %1" msgstr "返回 %1" -#: route.cc:1075 route.cc:2528 +#: route.cc:1081 route.cc:2541 msgid "unknown Processor type \"%1\"; ignored" msgstr "" -#: route.cc:1087 +#: route.cc:1093 msgid "processor could not be created. Ignored." msgstr "" -#: route.cc:1962 route.cc:2187 +#: route.cc:1975 route.cc:2200 msgid "Bad node sent to Route::set_state() [%1]" msgstr "æŸå的符å·å‘é€è‡³ Route::set_state() [%1]" -#: route.cc:2022 +#: route.cc:2035 msgid "Pannable state found for route (%1) without a panner!" msgstr "" -#: route.cc:2096 route.cc:2100 route.cc:2301 route.cc:2305 +#: route.cc:2109 route.cc:2113 route.cc:2314 route.cc:2318 msgid "badly formed order key string in state file! [%1] ... ignored." msgstr "" -#: route.cc:2311 +#: route.cc:2324 msgid "Converting deprecated order key for %1 using Editor order %2" msgstr "" @@ -1480,15 +1500,15 @@ msgstr "" msgid "error writing tempo-adjusted data to %1" msgstr "" -#: send.cc:59 +#: send.cc:60 msgid "aux %1" msgstr "" -#: send.cc:63 +#: send.cc:64 msgid "send %1" msgstr "å‘é€ %1" -#: send.cc:65 +#: send.cc:66 msgid "programming error: send created using role %1" msgstr "" @@ -1512,147 +1532,147 @@ msgstr "" msgid "Set up standard connections" msgstr "è®¾ç½®æ ‡å‡†è¿žæŽ¥" -#: session.cc:635 +#: session.cc:638 msgid "could not setup Click I/O" msgstr "" -#: session.cc:683 +#: session.cc:686 #, c-format msgid "out %<PRIu32>" msgstr "" -#: session.cc:697 +#: session.cc:700 #, c-format msgid "out %<PRIu32>+%<PRIu32>" msgstr "" -#: session.cc:712 +#: session.cc:715 #, c-format msgid "in %<PRIu32>" msgstr "" -#: session.cc:726 +#: session.cc:729 #, c-format msgid "in %<PRIu32>+%<PRIu32>" msgstr "" -#: session.cc:790 +#: session.cc:793 msgid "cannot connect master output %1 to %2" msgstr "" -#: session.cc:849 +#: session.cc:862 msgid "monitor" msgstr "" -#: session.cc:894 +#: session.cc:907 msgid "cannot connect control input %1 to %2" msgstr "" -#: session.cc:914 +#: session.cc:927 msgid "The preferred I/O for the monitor bus (%1) cannot be found" msgstr "" -#: session.cc:945 +#: session.cc:958 msgid "cannot connect control output %1 to %2" msgstr "" -#: session.cc:1009 +#: session.cc:1026 msgid "cannot create Auditioner: no auditioning of regions possible" msgstr "" -#: session.cc:1193 +#: session.cc:1210 msgid "Session: you can't use that location for auto punch (start <= end)" msgstr "" -#: session.cc:1233 +#: session.cc:1250 msgid "" "You cannot use this location for auto-loop because it has zero or negative " "length" msgstr "" -#: session.cc:1547 +#: session.cc:1564 msgid "feedback loop setup between %1 and %2" msgstr "" -#: session.cc:1843 +#: session.cc:1860 msgid "Session: could not create new midi track." msgstr "" -#: session.cc:1849 +#: session.cc:1866 msgid "" "No more JACK ports are available. You will need to stop %1 and restart JACK " "with more ports if you need this many tracks." msgstr "" -#: session.cc:2026 session.cc:2029 +#: session.cc:2043 session.cc:2046 msgid "Audio" msgstr "音频" -#: session.cc:2053 session.cc:2061 session.cc:2138 session.cc:2146 +#: session.cc:2070 session.cc:2078 session.cc:2155 session.cc:2163 msgid "cannot configure %1 in/%2 out configuration for new audio track" msgstr "" -#: session.cc:2084 +#: session.cc:2101 msgid "Session: could not create new audio track." msgstr "" -#: session.cc:2116 session.cc:2119 +#: session.cc:2133 session.cc:2136 msgid "Bus" msgstr "总线" -#: session.cc:2169 +#: session.cc:2186 msgid "Session: could not create new audio route." msgstr "" -#: session.cc:2228 session.cc:2238 +#: session.cc:2245 session.cc:2255 msgid "Session: UINT_MAX routes? impossible!" msgstr "" -#: session.cc:2260 +#: session.cc:2277 msgid "Session: cannot create track/bus from template description" msgstr "" -#: session.cc:2286 +#: session.cc:2303 msgid "Session: could not create new route from template" msgstr "" -#: session.cc:2315 +#: session.cc:2332 msgid "Adding new tracks/busses failed" msgstr "" -#: session.cc:3419 +#: session.cc:3436 msgid "FATAL ERROR! Could not find a suitable version of %1 for a rename" msgstr "" -#: session.cc:3539 session.cc:3597 +#: session.cc:3556 session.cc:3614 msgid "There are already %1 recordings for %2, which I consider too many." msgstr "" -#: session.cc:3987 +#: session.cc:4004 msgid "send ID %1 appears to be in use already" msgstr "" -#: session.cc:3999 +#: session.cc:4016 msgid "aux send ID %1 appears to be in use already" msgstr "" -#: session.cc:4011 +#: session.cc:4028 msgid "return ID %1 appears to be in use already" msgstr "" -#: session.cc:4023 +#: session.cc:4040 msgid "insert ID %1 appears to be in use already" msgstr "" -#: session.cc:4150 +#: session.cc:4167 msgid "Cannot write a range where end <= start (e.g. %1 <= %2)" msgstr "" -#: session.cc:4179 +#: session.cc:4196 msgid "too many bounced versions of playlist \"%1\"" msgstr "" -#: session.cc:4189 +#: session.cc:4206 msgid "cannot create new audio file \"%1\" for %2" msgstr "" @@ -1687,7 +1707,7 @@ msgstr "æ— æ³•åˆ›å»ºä¼šè¯ç›®å½•åœ¨è·¯å¾„ %1 错误: %2" msgid "Session subdirectory does not exist at path %1" msgstr "会è¯å目录ä¸å˜åœ¨äºŽè·¯å¾„ %1" -#: session_events.cc:184 +#: session_events.cc:185 msgid "Session: cannot have two events of type %1 at the same frame (%2)." msgstr "" @@ -1699,13 +1719,13 @@ msgstr "" msgid "Export ended unexpectedly: %1" msgstr "" -#: session_ltc.cc:222 +#: session_ltc.cc:221 msgid "" "LTC encoder: invalid framerate - LTC encoding is disabled for the remainder " "of this session." msgstr "" -#: session_midi.cc:520 +#: session_midi.cc:519 msgid "Session: cannot send quarter-frame MTC message (%1)" msgstr "" @@ -1717,350 +1737,342 @@ msgstr "会è¯: æ— æ³•ä»ŽXMLæ述符创建æ’放列表." msgid "Session: error in no roll for %1" msgstr "" -#: session_process.cc:1157 +#: session_process.cc:1159 msgid "Programming error: illegal event type in process_event (%1)" msgstr "" -#: session_state.cc:140 -msgid "Could not use path %1 (%2)" -msgstr "" - -#: session_state.cc:184 +#: session_state.cc:178 msgid "solo cut control (dB)" msgstr "" -#: session_state.cc:208 +#: session_state.cc:202 msgid "Set block size and sample rate" msgstr "" -#: session_state.cc:213 +#: session_state.cc:207 msgid "Using configuration" msgstr "使用é…ç½®" -#: session_state.cc:325 +#: session_state.cc:319 msgid "Reset Remote Controls" msgstr "" -#: session_state.cc:417 +#: session_state.cc:411 msgid "Session: cannot create session peakfile folder \"%1\" (%2)" msgstr "会è¯: æ— æ³•åˆ›å»ºä¼šè¯å³°æ–‡ä»¶çš„文件夹 \"%1\" (%2)" -#: session_state.cc:424 +#: session_state.cc:418 msgid "Session: cannot create session sounds dir \"%1\" (%2)" msgstr "" -#: session_state.cc:431 +#: session_state.cc:425 msgid "Session: cannot create session midi dir \"%1\" (%2)" msgstr "" -#: session_state.cc:438 +#: session_state.cc:432 msgid "Session: cannot create session dead sounds folder \"%1\" (%2)" msgstr "" -#: session_state.cc:445 +#: session_state.cc:439 msgid "Session: cannot create session export folder \"%1\" (%2)" msgstr "会è¯: æ— æ³•åˆ›å»ºä¼šè¯å¯¼å‡ºæ–‡ä»¶å¤¹ \"%1\" (%2)" -#: session_state.cc:452 +#: session_state.cc:446 msgid "Session: cannot create session analysis folder \"%1\" (%2)" msgstr "会è¯: æ— æ³•åˆ›å»ºä¼šè¯åˆ†æžæ–‡ä»¶å¤¹ \"%1\" (%2)" -#: session_state.cc:459 +#: session_state.cc:453 msgid "Session: cannot create session plugins folder \"%1\" (%2)" msgstr "会è¯: æ— æ³•åˆ›å»ºä¼šè¯æ’件文件夹 \"%1\" (%2)" -#: session_state.cc:466 +#: session_state.cc:460 msgid "Session: cannot create session externals folder \"%1\" (%2)" msgstr "" -#: session_state.cc:480 +#: session_state.cc:474 msgid "Session: cannot create session folder \"%1\" (%2)" msgstr "会è¯: æ— æ³•åˆ›å»ºä¼šè¯æ–‡ä»¶å¤¹ \"%1\" (%2)" -#: session_state.cc:514 +#: session_state.cc:508 msgid "Could not open %1 for writing session template" msgstr "" -#: session_state.cc:520 +#: session_state.cc:514 msgid "Could not open session template %1 for reading" msgstr "" -#: session_state.cc:539 +#: session_state.cc:533 msgid "master" msgstr "主控" -#: session_state.cc:600 +#: session_state.cc:594 msgid "Could not remove pending capture state at path \"%1\" (%2)" msgstr "" -#: session_state.cc:624 +#: session_state.cc:618 msgid "could not rename snapshot %1 to %2 (%3)" msgstr "æ— æ³•é‡å‘½åå¿«ç…§ %1 到 %2 (%3)" -#: session_state.cc:652 +#: session_state.cc:646 msgid "Could not remove session file at path \"%1\" (%2)" msgstr "" -#: session_state.cc:669 +#: session_state.cc:663 msgid "" "the %1 audio engine is not connected and state saving would lose all I/O " "connections. Session not saved" msgstr "" -#: session_state.cc:720 +#: session_state.cc:714 msgid "state could not be saved to %1" msgstr "" -#: session_state.cc:722 session_state.cc:733 +#: session_state.cc:716 session_state.cc:727 msgid "Could not remove temporary session file at path \"%1\" (%2)" msgstr "" -#: session_state.cc:730 -msgid "could not rename temporary session file %1 to %2" +#: session_state.cc:724 +msgid "could not rename temporary session file %1 to %2 (%3)" msgstr "" -#: session_state.cc:798 +#: session_state.cc:792 msgid "%1: session file \"%2\" doesn't exist!" msgstr "" -#: session_state.cc:810 +#: session_state.cc:804 msgid "Could not understand session file %1" msgstr "" -#: session_state.cc:819 +#: session_state.cc:813 msgid "Session file %1 is not a session" msgstr "会è¯æ–‡ä»¶ %1 ä¸æ˜¯ä¸€ä¸ªä¼šè¯" -#: session_state.cc:1125 +#: session_state.cc:1119 msgid "programming error: Session: incorrect XML node sent to set_state()" msgstr "" -#: session_state.cc:1179 +#: session_state.cc:1173 msgid "Session: XML state has no options section" msgstr "" -#: session_state.cc:1184 +#: session_state.cc:1178 msgid "Session: XML state has no metadata section" msgstr "" -#: session_state.cc:1195 +#: session_state.cc:1189 msgid "Session: XML state has no sources section" msgstr "" -#: session_state.cc:1202 +#: session_state.cc:1196 msgid "Session: XML state has no Tempo Map section" msgstr "" -#: session_state.cc:1209 +#: session_state.cc:1203 msgid "Session: XML state has no locations section" msgstr "" -#: session_state.cc:1235 +#: session_state.cc:1229 msgid "Session: XML state has no Regions section" msgstr "" -#: session_state.cc:1242 +#: session_state.cc:1236 msgid "Session: XML state has no playlists section" msgstr "" -#: session_state.cc:1262 +#: session_state.cc:1256 msgid "Session: XML state has no bundles section" msgstr "" -#: session_state.cc:1274 +#: session_state.cc:1268 msgid "Session: XML state has no diskstreams section" msgstr "" -#: session_state.cc:1282 +#: session_state.cc:1276 msgid "Session: XML state has no routes section" msgstr "" -#: session_state.cc:1294 +#: session_state.cc:1288 msgid "Session: XML state has no route groups section" msgstr "" -#: session_state.cc:1303 +#: session_state.cc:1297 msgid "Session: XML state has no edit groups section" msgstr "" -#: session_state.cc:1310 +#: session_state.cc:1304 msgid "Session: XML state has no mix groups section" msgstr "" -#: session_state.cc:1318 +#: session_state.cc:1312 msgid "Session: XML state has no click section" msgstr "" -#: session_state.cc:1360 +#: session_state.cc:1354 msgid "Session: cannot create Route from XML description." msgstr "" -#: session_state.cc:1364 +#: session_state.cc:1358 msgid "Loaded track/bus %1" msgstr "载入音轨/总线 %1" -#: session_state.cc:1462 +#: session_state.cc:1456 msgid "Could not find diskstream for route" msgstr "" -#: session_state.cc:1516 +#: session_state.cc:1510 msgid "Session: cannot create Region from XML description." msgstr "" -#: session_state.cc:1520 +#: session_state.cc:1514 msgid "Can not load state for region '%1'" msgstr "" -#: session_state.cc:1556 +#: session_state.cc:1550 msgid "Regions in compound description not found (ID's %1 and %2): ignored" msgstr "" -#: session_state.cc:1584 +#: session_state.cc:1578 msgid "Nested source has no ID info in session file! (ignored)" msgstr "" -#: session_state.cc:1596 +#: session_state.cc:1590 msgid "Cannot reconstruct nested source for region %1" msgstr "" -#: session_state.cc:1658 +#: session_state.cc:1652 msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)" msgstr "" -#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707 +#: session_state.cc:1660 session_state.cc:1681 session_state.cc:1701 msgid "" "Session: XMLNode describing a AudioRegion references an unknown source id =%1" msgstr "" -#: session_state.cc:1672 session_state.cc:1693 session_state.cc:1713 +#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707 msgid "" "Session: XMLNode describing a AudioRegion references a non-audio source id =" "%1" msgstr "" -#: session_state.cc:1736 +#: session_state.cc:1730 msgid "" "Session: XMLNode describing an AudioRegion is missing some master sources; " "ignored" msgstr "" -#: session_state.cc:1770 +#: session_state.cc:1764 msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)" msgstr "" -#: session_state.cc:1778 +#: session_state.cc:1772 msgid "" "Session: XMLNode describing a MidiRegion references an unknown source id =%1" msgstr "" -#: session_state.cc:1784 +#: session_state.cc:1778 msgid "" "Session: XMLNode describing a MidiRegion references a non-midi source id =%1" msgstr "" -#: session_state.cc:1852 +#: session_state.cc:1846 msgid "" "cannot create new file from region name \"%1\" with ident = \"%2\": too many " "existing files with similar names" msgstr "" -#: session_state.cc:1875 +#: session_state.cc:1869 msgid "Session: cannot create Source from XML description." msgstr "" -#: session_state.cc:1909 +#: session_state.cc:1903 msgid "A sound file is missing. It will be replaced by silence." msgstr "" -#: session_state.cc:1932 +#: session_state.cc:1926 msgid "Found a sound file that cannot be used by %1. Talk to the progammers." msgstr "" -#: session_state.cc:1949 +#: session_state.cc:1943 msgid "Could not create templates directory \"%1\" (%2)" msgstr "" -#: session_state.cc:1962 +#: session_state.cc:1956 msgid "Template \"%1\" already exists - new version not created" msgstr "" -#: session_state.cc:1968 +#: session_state.cc:1962 msgid "Could not create directory for Session template\"%1\" (%2)" msgstr "" -#: session_state.cc:1978 +#: session_state.cc:1972 msgid "template not saved" msgstr "模æ¿æ²¡ä¿å˜" -#: session_state.cc:1988 +#: session_state.cc:1982 msgid "Could not create directory for Session template plugin state\"%1\" (%2)" msgstr "" -#: session_state.cc:2183 +#: session_state.cc:2225 msgid "Unknown node \"%1\" found in Bundles list from session file" msgstr "" -#: session_state.cc:2725 session_state.cc:2731 -msgid "Cannot expand path %1 (%2)" -msgstr "æ— æ³•æ‰©å±•è·¯å¾„ %1 (%2)" - -#: session_state.cc:2784 +#: session_state.cc:2820 msgid "Session: cannot create dead file folder \"%1\" (%2)" msgstr "" -#: session_state.cc:2823 +#: session_state.cc:2859 msgid "cannot rename unused file source from %1 to %2 (%3)" msgstr "" -#: session_state.cc:2841 +#: session_state.cc:2877 msgid "cannot remove peakfile %1 for %2 (%3)" msgstr "" -#: session_state.cc:3143 +#: session_state.cc:3179 msgid "could not backup old history file, current history not saved" msgstr "" -#: session_state.cc:3156 +#: session_state.cc:3192 msgid "history could not be saved to %1" msgstr "历å²æ— 法被ä¿å˜åˆ° %1" -#: session_state.cc:3159 +#: session_state.cc:3195 msgid "Could not remove history file at path \"%1\" (%2)" msgstr "" -#: session_state.cc:3163 +#: session_state.cc:3199 msgid "could not restore history file from backup %1 (%2)" msgstr "" -#: session_state.cc:3188 +#: session_state.cc:3224 msgid "%1: no history file \"%2\" for this session." msgstr "" -#: session_state.cc:3194 +#: session_state.cc:3230 msgid "Could not understand session history file \"%1\"" msgstr "æ— æ³•ç†è§£ä¼šè¯åŽ†å²æ–‡ä»¶ \"%1\"" -#: session_state.cc:3236 +#: session_state.cc:3272 msgid "Failed to downcast MidiSource for NoteDiffCommand" msgstr "" -#: session_state.cc:3247 +#: session_state.cc:3283 msgid "Failed to downcast MidiSource for SysExDiffCommand" msgstr "" -#: session_state.cc:3258 +#: session_state.cc:3294 msgid "Failed to downcast MidiSource for PatchChangeDiffCommand" msgstr "" -#: session_state.cc:3266 +#: session_state.cc:3302 msgid "Couldn't figure out how to make a Command out of a %1 XMLNode." msgstr "" -#: session_state.cc:3502 +#: session_state.cc:3538 msgid "Session: unknown diskstream type in XML" msgstr "" -#: session_state.cc:3507 +#: session_state.cc:3543 msgid "Session: could not load diskstream via XML state" msgstr "" @@ -2084,198 +2096,206 @@ msgid "" "control" msgstr "" -#: smf_source.cc:252 +#: smf_source.cc:262 msgid "Unable to read event prefix, corrupt MIDI ring" msgstr "" -#: smf_source.cc:265 +#: smf_source.cc:275 msgid "Event has time and size but no body, corrupt MIDI ring" msgstr "" -#: smf_source.cc:271 +#: smf_source.cc:281 msgid "Event time is before MIDI source position" msgstr "" -#: smf_source.cc:306 smf_source.cc:345 +#: smf_source.cc:316 smf_source.cc:355 msgid "Skipping event with unordered time %1" msgstr "" -#: smf_source.cc:410 +#: smf_source.cc:420 msgid "cannot open MIDI file %1 for write" msgstr "æ— æ³•æ‰“å¼€MIDI文件 %1 用于写入" -#: sndfile_helpers.cc:32 +#: sndfile_helpers.cc:34 msgid "WAV" msgstr "" -#: sndfile_helpers.cc:33 +#: sndfile_helpers.cc:35 msgid "AIFF" msgstr "" -#: sndfile_helpers.cc:34 +#: sndfile_helpers.cc:36 msgid "CAF" msgstr "" -#: sndfile_helpers.cc:35 +#: sndfile_helpers.cc:37 msgid "W64 (64 bit WAV)" msgstr "" -#: sndfile_helpers.cc:36 +#: sndfile_helpers.cc:38 msgid "FLAC" msgstr "" -#: sndfile_helpers.cc:37 +#: sndfile_helpers.cc:39 msgid "Ogg/Vorbis" msgstr "" -#: sndfile_helpers.cc:38 +#: sndfile_helpers.cc:40 msgid "raw (no header)" msgstr "" -#: sndfile_helpers.cc:43 +#: sndfile_helpers.cc:45 msgid ".wav" msgstr "" -#: sndfile_helpers.cc:44 +#: sndfile_helpers.cc:46 msgid ".aiff" msgstr "" -#: sndfile_helpers.cc:45 +#: sndfile_helpers.cc:47 msgid ".caf" msgstr "" -#: sndfile_helpers.cc:46 +#: sndfile_helpers.cc:48 msgid ".w64" msgstr "" -#: sndfile_helpers.cc:47 +#: sndfile_helpers.cc:49 msgid ".flac" msgstr "" -#: sndfile_helpers.cc:48 +#: sndfile_helpers.cc:50 msgid ".ogg" msgstr "" -#: sndfile_helpers.cc:49 +#: sndfile_helpers.cc:51 msgid ".raw" msgstr "" -#: sndfile_helpers.cc:64 +#: sndfile_helpers.cc:66 msgid "Signed 16 bit PCM" msgstr "" -#: sndfile_helpers.cc:65 +#: sndfile_helpers.cc:67 msgid "Signed 24 bit PCM" msgstr "" -#: sndfile_helpers.cc:66 +#: sndfile_helpers.cc:68 msgid "Signed 32 bit PCM" msgstr "" -#: sndfile_helpers.cc:67 +#: sndfile_helpers.cc:69 msgid "Signed 8 bit PCM" msgstr "" -#: sndfile_helpers.cc:68 +#: sndfile_helpers.cc:70 msgid "32 bit float" msgstr "" -#: sndfile_helpers.cc:81 +#: sndfile_helpers.cc:83 msgid "Little-endian (Intel)" msgstr "" -#: sndfile_helpers.cc:82 +#: sndfile_helpers.cc:84 msgid "Big-endian (PowerPC)" msgstr "" -#: sndfilesource.cc:201 +#: sndfilesource.cc:210 msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)" msgstr "" -#: sndfilesource.cc:209 +#: sndfilesource.cc:218 msgid "" "SndFileSource: file only contains %1 channels; %2 is invalid as a channel " "number" msgstr "" -#: sndfilesource.cc:255 sndfilesource.cc:571 sndfilesource.cc:595 +#: sndfilesource.cc:264 sndfilesource.cc:604 sndfilesource.cc:628 msgid "" "cannot set broadcast info for audio file %1 (%2); dropping broadcast info " "for this file" msgstr "" -#: sndfilesource.cc:302 +#: sndfilesource.cc:311 msgid "could not allocate file %1 for reading." msgstr "æ— æ³•åˆ†é…文件 %1 用于读入" -#: sndfilesource.cc:337 +#: sndfilesource.cc:346 msgid "SndFileSource: could not seek to frame %1 within %2 (%3)" msgstr "" -#: sndfilesource.cc:347 +#: sndfilesource.cc:356 msgid "" "SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)" msgstr "" -#: sndfilesource.cc:391 sndfilesource.cc:420 +#: sndfilesource.cc:400 sndfilesource.cc:429 msgid "attempt to write a non-writable audio file source (%1)" msgstr "" -#: sndfilesource.cc:396 utils.cc:510 utils.cc:534 utils.cc:548 utils.cc:567 +#: sndfilesource.cc:405 utils.cc:547 utils.cc:571 utils.cc:585 utils.cc:604 msgid "programming error: %1 %2" msgstr "程åºé”™è¯¯: %1 %2" -#: sndfilesource.cc:523 +#: sndfilesource.cc:532 sndfilesource.cc:562 msgid "attempt to flush a non-writable audio file source (%1)" msgstr "" -#: sndfilesource.cc:528 +#: sndfilesource.cc:537 sndfilesource.cc:557 msgid "attempt to flush an un-opened audio file source (%1)" msgstr "" -#: sndfilesource.cc:534 +#: sndfilesource.cc:543 msgid "could not allocate file %1 to write header" msgstr "" -#: sndfilesource.cc:548 +#: sndfilesource.cc:568 +msgid "could not allocate file %1 to flush contents" +msgstr "" + +#: sndfilesource.cc:581 msgid "" "attempt to store broadcast info in a non-writable audio file source (%1)" msgstr "" -#: sndfilesource.cc:553 +#: sndfilesource.cc:586 msgid "attempt to set BWF info for an un-opened audio file source (%1)" msgstr "" -#: sndfilesource.cc:614 +#: sndfilesource.cc:647 msgid "%1: cannot seek to %2 (libsndfile error: %3)" msgstr "" -#: sndfilesource.cc:727 +#: sndfilesource.cc:760 msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)" msgstr "" -#: sndfilesource.cc:740 sndfilesource.cc:790 sndfilesource.cc:797 +#: sndfilesource.cc:773 sndfilesource.cc:823 sndfilesource.cc:830 msgid "SndFileSource: \"%1\" bad write (%2)" msgstr "" -#: sndfilesource.cc:820 +#: sndfilesource.cc:853 msgid "" "Filesource: start time is already set for existing file (%1): Cannot change " "start time." msgstr "" -#: speakers.cc:239 +#: speakers.cc:280 msgid "Speaker information is missing azimuth - speaker ignored" msgstr "" -#: speakers.cc:245 +#: speakers.cc:286 msgid "Speaker information is missing elevation - speaker ignored" msgstr "" -#: speakers.cc:251 +#: speakers.cc:292 msgid "Speaker information is missing distance - speaker ignored" msgstr "" +#: srcfilesource.cc:135 +msgid "SrcFileSource: %1" +msgstr "" + #: tape_file_matcher.cc:46 msgid "Cannot compile tape track regexp for use (%1)" msgstr "" @@ -2425,54 +2445,63 @@ msgstr "声é“的符å·æ²¡æœ‰ç±»åž‹å±žæ€§" msgid "Node for Port has no \"name\" property" msgstr "端å£çš„符å·æ²¡æœ‰å称属性" -#: utils.cc:358 utils.cc:382 +#: utils.cc:395 utils.cc:419 msgid "Splice" msgstr "" -#: utils.cc:360 utils.cc:375 +#: utils.cc:397 utils.cc:412 msgid "Slide" msgstr "" -#: utils.cc:362 utils.cc:378 +#: utils.cc:399 utils.cc:415 msgid "Lock" msgstr "" -#: utils.cc:365 +#: utils.cc:402 msgid "programming error: unknown edit mode string \"%1\"" msgstr "程åºé”™è¯¯: æ— æ³•è¯†åˆ«ç¼–è¾‘æ¨¡å¼å—符串 \"%1\"" -#: utils.cc:389 utils.cc:421 +#: utils.cc:426 utils.cc:458 msgid "MIDI Timecode" msgstr "MIDI时间ç " -#: utils.cc:389 utils.cc:419 +#: utils.cc:426 utils.cc:456 msgid "MTC" msgstr "MTC" -#: utils.cc:393 utils.cc:428 +#: utils.cc:430 utils.cc:465 msgid "MIDI Clock" msgstr "MIDI时钟" -#: utils.cc:397 utils.cc:415 utils.cc:435 +#: utils.cc:434 utils.cc:452 utils.cc:472 msgid "JACK" msgstr "" -#: utils.cc:401 +#: utils.cc:438 msgid "programming error: unknown sync source string \"%1\"" msgstr "程åºé”™è¯¯: æ— æ³•è¯†åˆ«åŒæ¥æºå—符串 \"%1\"" -#: utils.cc:426 +#: utils.cc:463 msgid "M-Clock" msgstr "" -#: utils.cc:432 +#: utils.cc:469 msgid "LTC" msgstr "" -#: utils.cc:602 +#: utils.cc:639 msgid "programming error: unknown native header format: %1" msgstr "" -#: utils.cc:617 +#: utils.cc:654 msgid "cannot open directory %1 (%2)" msgstr "æ— æ³•æ‰“å¼€ç›®å½• %1 (%2)" + +#~ msgid "Could not resolve path: %1 (%2)" +#~ msgstr "æ— æ³•è§£å†³è·¯å¾„: %1 (%2)" + +#~ msgid "LADSPA: cannot load module from \"%1\"" +#~ msgstr "LADSPA: æ— æ³•ä»Ž \"%1\" 载入模å—" + +#~ msgid "Cannot expand path %1 (%2)" +#~ msgstr "æ— æ³•æ‰©å±•è·¯å¾„ %1 (%2)" diff --git a/libs/ardour/port.cc b/libs/ardour/port.cc index cf961d6828..19bebd103f 100644 --- a/libs/ardour/port.cc +++ b/libs/ardour/port.cc @@ -21,8 +21,6 @@ #include "libardour-config.h" #endif -#include <jack/weakjack.h> // so that we can test for new functions at runtime - #include "pbd/compose.h" #include "pbd/error.h" #include "pbd/failed_constructor.h" @@ -380,7 +378,7 @@ Port::get_connected_latency_range (LatencyRange& range, bool playback) const boost::shared_ptr<Port> remote_port = AudioEngine::instance()->get_port_by_name (*c); if (remote_port) { - lr = remote_port->private_latency_range ((playback ? JackPlaybackLatency : JackCaptureLatency)); + lr = remote_port->private_latency_range ((playback ? true : false)); DEBUG_TRACE (DEBUG::Latency, string_compose ( "\t%1 <-LOCAL-> %2 : latter has latency range %3 .. %4\n", name(), *c, lr.min, lr.max)); diff --git a/libs/ardour/port_insert.cc b/libs/ardour/port_insert.cc index c352e22e55..fa09ea05ac 100644 --- a/libs/ardour/port_insert.cc +++ b/libs/ardour/port_insert.cc @@ -249,7 +249,9 @@ PortInsert::signal_latency() const bool PortInsert::configure_io (ChanCount in, ChanCount out) { +#ifndef PLATFORM_WINDOWS assert (!AudioEngine::instance()->process_lock().trylock()); +#endif /* for an insert, processor input corresponds to IO output, and vice versa */ diff --git a/libs/ardour/port_set.cc b/libs/ardour/port_set.cc index 6096e356f5..3489ae4e44 100644 --- a/libs/ardour/port_set.cc +++ b/libs/ardour/port_set.cc @@ -56,7 +56,7 @@ static bool sort_ports_by_name (boost::shared_ptr<Port> a, boost::shared_ptr<Por // if some of the names don't have a number as posfix, compare as strings - if (last_digit_position_a == aname.size() or last_digit_position_b == bname.size()) { + if (last_digit_position_a == aname.size() || last_digit_position_b == bname.size()) { return aname < bname; } @@ -145,9 +145,11 @@ PortSet::port(DataType type, size_t n) const return port(n); } else { const PortVec& v = _ports[type]; - assert(n < v.size()); - return v[n]; + if (n < v.size()) { + return v[n]; + } } + return boost::shared_ptr<Port>(); } boost::shared_ptr<AudioPort> diff --git a/libs/ardour/rc_configuration.cc b/libs/ardour/rc_configuration.cc index f4612699d4..b0be237563 100644 --- a/libs/ardour/rc_configuration.cc +++ b/libs/ardour/rc_configuration.cc @@ -72,11 +72,11 @@ int RCConfiguration::load_state () { std::string rcfile; - struct stat statbuf; + GStatBuf statbuf; /* load system configuration first */ - if (find_file_in_search_path (ardour_config_search_path(), "ardour_system.rc", rcfile)) { + if (find_file (ardour_config_search_path(), "ardour_system.rc", rcfile)) { /* stupid XML Parser hates empty files */ @@ -104,7 +104,7 @@ RCConfiguration::load_state () /* now load configuration file for user */ - if (find_file_in_search_path (ardour_config_search_path(), "ardour.rc", rcfile)) { + if (find_file (ardour_config_search_path(), "ardour.rc", rcfile)) { /* stupid XML parser hates empty files */ diff --git a/libs/ardour/region.cc b/libs/ardour/region.cc index 3b9dc308ec..1784cdbf3c 100644 --- a/libs/ardour/region.cc +++ b/libs/ardour/region.cc @@ -698,33 +698,32 @@ Region::set_start (framepos_t pos) } void -Region::trim_start (framepos_t new_position) +Region::move_start (frameoffset_t distance) { if (locked() || position_locked() || video_locked()) { return; } framepos_t new_start; - frameoffset_t const start_shift = new_position - _position; - if (start_shift > 0) { + if (distance > 0) { - if (_start > max_framepos - start_shift) { - new_start = max_framepos; + if (_start > max_framepos - distance) { + new_start = max_framepos; // makes no sense } else { - new_start = _start + start_shift; + new_start = _start + distance; } if (!verify_start (new_start)) { return; } - } else if (start_shift < 0) { + } else if (distance < 0) { - if (_start < -start_shift) { + if (_start < -distance) { new_start = 0; } else { - new_start = _start + start_shift; + new_start = _start + distance; } } else { @@ -736,6 +735,7 @@ Region::trim_start (framepos_t new_position) } set_start_internal (new_start); + _whole_file = false; first_edit (); diff --git a/libs/ardour/region_factory.cc b/libs/ardour/region_factory.cc index 3e81524750..44f8c34ddd 100644 --- a/libs/ardour/region_factory.cc +++ b/libs/ardour/region_factory.cc @@ -564,7 +564,7 @@ RegionFactory::new_region_name (string old) uint32_t number; string::size_type len = old.length() + 64; string remainder; - char buf[len]; + std::vector<char> buf(len); if ((last_period = old.find_last_of ('.')) == string::npos) { @@ -603,8 +603,8 @@ RegionFactory::new_region_name (string old) number++; - snprintf (buf, len, "%s%" PRIu32 "%s", old.substr (0, last_period + 1).c_str(), number, remainder.c_str()); - sbuf = buf; + snprintf (&buf[0], len, "%s%" PRIu32 "%s", old.substr (0, last_period + 1).c_str(), number, remainder.c_str()); + sbuf = &buf[0]; if (region_name_map.find (sbuf) == region_name_map.end ()) { break; @@ -612,7 +612,7 @@ RegionFactory::new_region_name (string old) } if (number != (UINT_MAX-1)) { - return buf; + return &buf[0]; } error << string_compose (_("cannot create new name for region \"%1\""), old) << endmsg; diff --git a/libs/ardour/resampled_source.cc b/libs/ardour/resampled_source.cc index 6184e1a3d6..0a81319108 100644 --- a/libs/ardour/resampled_source.cc +++ b/libs/ardour/resampled_source.cc @@ -26,7 +26,11 @@ using namespace ARDOUR; using namespace PBD; +#ifdef PLATFORM_WINDOWS +const uint32_t ResampledImportableSource::blocksize = 524288U; +#else const uint32_t ResampledImportableSource::blocksize = 16384U; +#endif ResampledImportableSource::ResampledImportableSource (boost::shared_ptr<ImportableSource> src, framecnt_t rate, SrcQuality srcq) : source (src) diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index 71af69fdee..5df58ea846 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -47,6 +47,7 @@ #include "ardour/internal_return.h" #include "ardour/internal_send.h" #include "ardour/meter.h" +#include "ardour/delayline.h" #include "ardour/midi_buffer.h" #include "ardour/midi_port.h" #include "ardour/monitor_processor.h" @@ -79,6 +80,7 @@ Route::Route (Session& sess, string name, Flag flg, DataType default_type) , GraphNode (sess._process_graph) , _active (true) , _signal_latency (0) + , _signal_latency_at_amp_position (0) , _initial_delay (0) , _roll_delay (0) , _flags (flg) @@ -100,6 +102,7 @@ Route::Route (Session& sess, string name, Flag flg, DataType default_type) , _order_key (0) , _has_order_key (false) , _remote_control_id (0) + , _track_number (0) , _in_configure_processors (false) , _initial_io_setup (false) , _custom_meter_position_noted (false) @@ -142,6 +145,11 @@ Route::init () _output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2)); _output->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::output_port_count_changing, this, _1)); + if (!is_master() && !is_monitor() && !is_auditioner()) { + _delayline.reset (new DelayLine (_session, _name)); + add_processor (_delayline, PreFader); + } + /* add amp processor */ _amp.reset (new Amp (_session)); @@ -428,7 +436,10 @@ Route::process_output_buffers (BufferSet& bufs, /* figure out if we're going to use gain automation */ if (gain_automation_ok) { _amp->set_gain_automation_buffer (_session.gain_automation_buffer ()); - _amp->setup_gain_automation (start_frame, end_frame, nframes); + _amp->setup_gain_automation ( + start_frame + _signal_latency_at_amp_position, + end_frame + _signal_latency_at_amp_position, + nframes); } else { _amp->apply_gain_automation (false); } @@ -506,6 +517,8 @@ Route::process_output_buffers (BufferSet& bufs, /* set this to be true if the meter will already have been ::run() earlier */ bool const meter_already_run = metering_state() == MeteringInput; + framecnt_t latency = 0; + for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) { if (meter_already_run && boost::dynamic_pointer_cast<PeakMeter> (*i)) { @@ -531,9 +544,118 @@ Route::process_output_buffers (BufferSet& bufs, do we catch route != active somewhere higher? */ - (*i)->run (bufs, start_frame, end_frame, nframes, *i != _processors.back()); + if (boost::dynamic_pointer_cast<Send>(*i) != 0) { + boost::dynamic_pointer_cast<Send>(*i)->set_delay_in(_signal_latency - latency); + } + + (*i)->run (bufs, start_frame - latency, end_frame - latency, nframes, *i != _processors.back()); bufs.set_count ((*i)->output_streams()); + + if ((*i)->active ()) { + latency += (*i)->signal_latency (); + } + } +} + +void +Route::bounce_process (BufferSet& buffers, framepos_t start, framecnt_t nframes, + boost::shared_ptr<Processor> endpoint, + bool include_endpoint, bool for_export, bool for_freeze) +{ + /* If no processing is required, there's no need to go any further. */ + if (!endpoint && !include_endpoint) { + return; + } + + framecnt_t latency = bounce_get_latency(_amp, false, for_export, for_freeze); + _amp->set_gain_automation_buffer (_session.gain_automation_buffer ()); + _amp->setup_gain_automation (start - latency, start - latency + nframes, nframes); + + latency = 0; + for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) { + + if (!include_endpoint && (*i) == endpoint) { + break; + } + + /* if we're not exporting, stop processing if we come across a routing processor. */ + if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) { + break; + } + if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) { + break; + } + + /* don't run any processors that does routing. + * oh, and don't bother with the peak meter either. + */ + if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) { + (*i)->run (buffers, start - latency, start - latency + nframes, nframes, true); + buffers.set_count ((*i)->output_streams()); + latency += (*i)->signal_latency (); + } + + if ((*i) == endpoint) { + break; + } + } +} + +framecnt_t +Route::bounce_get_latency (boost::shared_ptr<Processor> endpoint, + bool include_endpoint, bool for_export, bool for_freeze) const +{ + framecnt_t latency = 0; + if (!endpoint && !include_endpoint) { + return latency; + } + + for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) { + if (!include_endpoint && (*i) == endpoint) { + break; + } + if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) { + break; + } + if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) { + break; + } + if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) { + latency += (*i)->signal_latency (); + } + if ((*i) == endpoint) { + break; + } + } + return latency; +} + +ChanCount +Route::bounce_get_output_streams (ChanCount &cc, boost::shared_ptr<Processor> endpoint, + bool include_endpoint, bool for_export, bool for_freeze) const +{ + if (!endpoint && !include_endpoint) { + return cc; + } + + for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) { + if (!include_endpoint && (*i) == endpoint) { + break; + } + if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) { + break; + } + if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) { + break; + } + if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) { + cc = (*i)->output_streams(); + } + if ((*i) == endpoint) { + break; + } } + return cc; } ChanCount @@ -1073,7 +1195,8 @@ Route::add_processor_from_xml_2X (const XMLNode& node, int version) } else if (node.name() == "Send") { - processor.reset (new Send (_session, _pannable, _mute_master)); + boost::shared_ptr<Pannable> sendpan (new Pannable (_session)); + processor.reset (new Send (_session, sendpan, _mute_master)); } else { @@ -1332,7 +1455,7 @@ Route::clear_processors (Placement p) seen_amp = true; } - if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs) { + if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs || (*i) == _delayline) { /* you can't remove these */ @@ -1399,7 +1522,7 @@ Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStream /* these can never be removed */ - if (processor == _amp || processor == _meter || processor == _main_outs) { + if (processor == _amp || processor == _meter || processor == _main_outs || processor == _delayline) { return 0; } @@ -1516,7 +1639,7 @@ Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* /* these can never be removed */ - if (processor == _amp || processor == _meter || processor == _main_outs) { + if (processor == _amp || processor == _meter || processor == _main_outs || processor == _delayline) { ++i; continue; } @@ -1598,7 +1721,10 @@ Route::reset_instrument_info () int Route::configure_processors (ProcessorStreams* err) { +#ifndef PLATFORM_WINDOWS assert (!AudioEngine::instance()->process_lock().trylock()); +#endif + if (!_in_configure_processors) { Glib::Threads::RWLock::WriterLock lm (_processor_lock); return configure_processors_unlocked (err); @@ -1668,7 +1794,9 @@ Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err) int Route::configure_processors_unlocked (ProcessorStreams* err) { +#ifndef PLATFORM_WINDOWS assert (!AudioEngine::instance()->process_lock().trylock()); +#endif if (_in_configure_processors) { return 0; @@ -2476,6 +2604,9 @@ Route::set_processor_state (const XMLNode& node) } else if (prop->value() == "meter") { _meter->set_state (**niter, Stateful::current_state_version); new_order.push_back (_meter); + } else if (prop->value() == "delay") { + _delayline->set_state (**niter, Stateful::current_state_version); + new_order.push_back (_delayline); } else if (prop->value() == "main-outs") { _main_outs->set_state (**niter, Stateful::current_state_version); } else if (prop->value() == "intreturn") { @@ -2513,7 +2644,7 @@ Route::set_processor_state (const XMLNode& node) if (prop->value() == "intsend") { - processor.reset (new InternalSend (_session, _pannable, _mute_master, boost::shared_ptr<Route>(), Delivery::Aux, true)); + processor.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), boost::shared_ptr<Route>(), Delivery::Aux, true)); } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" || prop->value() == "lv2" || @@ -2682,7 +2813,7 @@ Route::enable_monitor_send () /* make sure we have one */ if (!_monitor_send) { - _monitor_send.reset (new InternalSend (_session, _pannable, _mute_master, _session.monitor_out(), Delivery::Listen)); + _monitor_send.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), _session.monitor_out(), Delivery::Listen)); _monitor_send->set_display_to_user (false); } @@ -2719,7 +2850,8 @@ Route::add_aux_send (boost::shared_ptr<Route> route, boost::shared_ptr<Processor { Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); - listener.reset (new InternalSend (_session, _pannable, _mute_master, route, Delivery::Aux)); + boost::shared_ptr<Pannable> sendpan (new Pannable (_session)); + listener.reset (new InternalSend (_session, sendpan, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), route, Delivery::Aux)); } add_processor (listener, before); @@ -2806,7 +2938,7 @@ Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only) { const FedBy& fed_by (other->fed_by()); - for (FedBy::iterator f = fed_by.begin(); f != fed_by.end(); ++f) { + for (FedBy::const_iterator f = fed_by.begin(); f != fed_by.end(); ++f) { boost::shared_ptr<Route> sr = f->r.lock(); if (sr && (sr.get() == this)) { @@ -3185,15 +3317,24 @@ framecnt_t Route::update_signal_latency () { framecnt_t l = _output->user_latency(); + framecnt_t lamp = 0; + bool before_amp = true; for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) { if ((*i)->active ()) { l += (*i)->signal_latency (); } + if ((*i) == _amp) { + before_amp = false; + } + if (before_amp) { + lamp = l; + } } DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal signal latency = %2\n", _name, l)); + _signal_latency_at_amp_position = lamp; if (_signal_latency != l) { _signal_latency = l; signal_latency_changed (); /* EMIT SIGNAL */ @@ -3422,14 +3563,14 @@ Route::save_as_template (const string& path, const string& name) bool Route::set_name (const string& str) { - bool ret; - string ioproc_name; - string name; + if (str == name()) { + return true; + } - name = Route::ensure_track_or_route_name (str, _session); + string name = Route::ensure_track_or_route_name (str, _session); SessionObject::set_name (name); - ret = (_input->set_name(name) && _output->set_name(name)); + bool ret = (_input->set_name(name) && _output->set_name(name)); if (ret) { /* rename the main outs. Leave other IO processors @@ -3554,6 +3695,10 @@ Route::denormal_protection () const void Route::set_active (bool yn, void* src) { + if (_session.transport_rolling()) { + return; + } + if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_route_active()) { _route_group->foreach_route (boost::bind (&Route::set_active, _1, yn, _route_group)); return; @@ -3904,7 +4049,7 @@ Route::setup_invisible_processors () ++amp; } - assert (amp != _processors.end ()); + assert (amp != new_processors.end ()); /* and the processor after the amp */ @@ -3996,6 +4141,10 @@ Route::setup_invisible_processors () } } + if (!is_master() && !is_monitor() && !is_auditioner()) { + new_processors.push_front (_delayline); + } + /* MONITOR CONTROL */ if (_monitor_control && is_monitor ()) { @@ -4152,6 +4301,10 @@ Route::non_realtime_locate (framepos_t pos) _pannable->transport_located (pos); } + if (_delayline.get()) { + _delayline.get()->flush(); + } + { //Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ()); Glib::Threads::RWLock::ReaderLock lm (_processor_lock); diff --git a/libs/ardour/route_group_member.cc b/libs/ardour/route_group_member.cc index 85d2f981d7..3caa7cd1d0 100644 --- a/libs/ardour/route_group_member.cc +++ b/libs/ardour/route_group_member.cc @@ -16,6 +16,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include "ardour/libardour_visibility.h" #include "ardour/route_group_member.h" using namespace ARDOUR; diff --git a/libs/ardour/lv2_bundled_search_path.cc b/libs/ardour/scene_change.cc index d8cd1c1075..eda260382b 100644 --- a/libs/ardour/lv2_bundled_search_path.cc +++ b/libs/ardour/scene_change.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2013 Paul Davis + Copyright (C) 2014 Paul Davis This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,25 +17,23 @@ */ -#include <iostream> +#include "ardour/midi_scene_change.h" -#include <glibmm/miscutils.h> - -#include "ardour/lv2_bundled_search_path.h" -#include "ardour/directory_names.h" -#include "ardour/filesystem_paths.h" +#include "i18n.h" using namespace PBD; +using namespace ARDOUR; -namespace ARDOUR { +std::string SceneChange::xml_node_name = X_("SceneChange"); -SearchPath -lv2_bundled_search_path () +boost::shared_ptr<SceneChange> +SceneChange::factory (const XMLNode& node, int version) { - SearchPath spath( ardour_dll_directory () ); - spath.add_subdirectory_to_paths ("LV2"); + const XMLProperty* prop = node.property (X_("type")); - return spath; -} + if (prop->value() == X_("MIDI")) { + return boost::shared_ptr<SceneChange> (new MIDISceneChange (node, version)); + } -} // namespace ARDOUR + return boost::shared_ptr<SceneChange>(); +} diff --git a/libs/ardour/search_paths.cc b/libs/ardour/search_paths.cc new file mode 100644 index 0000000000..0efcce6451 --- /dev/null +++ b/libs/ardour/search_paths.cc @@ -0,0 +1,276 @@ +/* + Copyright (C) 2011 Tim Mayberry + Copyright (C) 2013 Paul Davis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include <glib.h> +#include <glibmm.h> +#include <string.h> + +#include "pbd/pathexpand.h" + +#include "ardour/search_paths.h" +#include "ardour/directory_names.h" +#include "ardour/filesystem_paths.h" + +#ifdef PLATFORM_WINDOWS +#include <windows.h> +#include <shlobj.h> // CSIDL_* +#include "pbd/windows_special_dirs.h" +#endif + +namespace { + const char * const backend_env_variable_name = "ARDOUR_BACKEND_PATH"; + const char * const surfaces_env_variable_name = "ARDOUR_SURFACES_PATH"; + const char * const export_env_variable_name = "ARDOUR_EXPORT_FORMATS_PATH"; + const char * const ladspa_env_variable_name = "LADSPA_PATH"; + const char * const midi_patch_env_variable_name = "ARDOUR_MIDI_PATCH_PATH"; + const char * const panner_env_variable_name = "ARDOUR_PANNER_PATH"; +} // anonymous + +using namespace PBD; + +namespace ARDOUR { + +Searchpath +backend_search_path () +{ + Searchpath spath(user_config_directory ()); + spath += ardour_dll_directory (); + spath.add_subdirectory_to_paths(backend_dir_name); + + spath += Searchpath(Glib::getenv(backend_env_variable_name)); + return spath; +} + +Searchpath +control_protocol_search_path () +{ + Searchpath spath(user_config_directory ()); + spath += ardour_dll_directory (); + spath.add_subdirectory_to_paths (surfaces_dir_name); + + spath += Searchpath(Glib::getenv(surfaces_env_variable_name)); + return spath; +} + +Searchpath +export_formats_search_path () +{ + Searchpath spath (ardour_data_search_path()); + spath.add_subdirectory_to_paths (export_formats_dir_name); + + bool export_formats_path_defined = false; + Searchpath spath_env (Glib::getenv(export_env_variable_name, export_formats_path_defined)); + + if (export_formats_path_defined) { + spath += spath_env; + } + + return spath; +} + +Searchpath +ladspa_search_path () +{ + Searchpath spath_env (Glib::getenv(ladspa_env_variable_name)); + + Searchpath spath (user_config_directory ()); + + spath += ardour_dll_directory (); + spath.add_subdirectory_to_paths (ladspa_dir_name); + +#ifndef PLATFORM_WINDOWS + spath.push_back ("/usr/local/lib64/ladspa"); + spath.push_back ("/usr/local/lib/ladspa"); + spath.push_back ("/usr/lib64/ladspa"); + spath.push_back ("/usr/lib/ladspa"); +#endif + +#ifdef __APPLE__ + spath.push_back (path_expand ("~/Library/Audio/Plug-Ins/LADSPA")); + spath.push_back ("/Library/Audio/Plug-Ins/LADSPA"); +#endif + + return spath_env + spath; +} + +Searchpath +lv2_bundled_search_path () +{ + Searchpath spath( ardour_dll_directory () ); + spath.add_subdirectory_to_paths ("LV2"); + + return spath; +} + +Searchpath +midi_patch_search_path () +{ + Searchpath spath (ardour_data_search_path()); + spath.add_subdirectory_to_paths(midi_patch_dir_name); + + bool midi_patch_path_defined = false; + Searchpath spath_env (Glib::getenv(midi_patch_env_variable_name, midi_patch_path_defined)); + + if (midi_patch_path_defined) { + spath += spath_env; + } + + return spath; +} + +Searchpath +panner_search_path () +{ + Searchpath spath(user_config_directory ()); + + spath += ardour_dll_directory (); + spath.add_subdirectory_to_paths(panner_dir_name); + spath += Searchpath(Glib::getenv(panner_env_variable_name)); + + return spath; +} + +Searchpath +template_search_path () +{ + Searchpath spath (ardour_data_search_path()); + spath.add_subdirectory_to_paths(templates_dir_name); + return spath; +} + +Searchpath +route_template_search_path () +{ + Searchpath spath (ardour_data_search_path()); + spath.add_subdirectory_to_paths(route_templates_dir_name); + return spath; +} + +#ifdef PLATFORM_WINDOWS + +const char* +vst_search_path () +{ + DWORD dwType = REG_SZ; + HKEY hKey; + DWORD dwSize = PATH_MAX; + char* p = 0; + char* user_home = 0; + char tmp[PATH_MAX+1]; + + if (ERROR_SUCCESS == RegOpenKeyExA (HKEY_CURRENT_USER, "Software\\VST", 0, KEY_READ, &hKey)) { + // Look for the user's VST Registry entry + if (ERROR_SUCCESS == RegQueryValueExA (hKey, "VSTPluginsPath", 0, &dwType, (LPBYTE)tmp, &dwSize)) + p = g_build_filename (Glib::locale_to_utf8(tmp).c_str(), 0); + + RegCloseKey (hKey); + } + + if (p == 0) { + if (ERROR_SUCCESS == RegOpenKeyExA (HKEY_LOCAL_MACHINE, "Software\\VST", 0, KEY_READ, &hKey)) + { + // Look for a global VST Registry entry + if (ERROR_SUCCESS == RegQueryValueExA (hKey, "VSTPluginsPath", 0, &dwType, (LPBYTE)tmp, &dwSize)) + p = g_build_filename (Glib::locale_to_utf8(tmp).c_str(), 0); + + RegCloseKey (hKey); + } + } + + if (p == 0) { + char *pVSTx86 = 0; + char *pProgFilesX86 = PBD::get_win_special_folder (CSIDL_PROGRAM_FILESX86); + + if (pProgFilesX86) { + // Look for a VST folder under C:\Program Files (x86) + if (pVSTx86 = g_build_filename (pProgFilesX86, "Steinberg", "VSTPlugins", 0)) + { + if (Glib::file_test (pVSTx86, Glib::FILE_TEST_EXISTS)) + if (Glib::file_test (pVSTx86, Glib::FILE_TEST_IS_DIR)) + p = g_build_filename (pVSTx86, 0); + + g_free (pVSTx86); + } + + g_free (pProgFilesX86); + } + + if (p == 0) { + // Look for a VST folder under C:\Program Files + char *pVST = 0; + char *pProgFiles = PBD::get_win_special_folder (CSIDL_PROGRAM_FILES); + + if (pProgFiles) { + if (pVST = g_build_filename (pProgFiles, "Steinberg", "VSTPlugins", 0)) { + if (Glib::file_test (pVST, Glib::FILE_TEST_EXISTS)) + if (Glib::file_test (pVST, Glib::FILE_TEST_IS_DIR)) + p = g_build_filename (pVST, 0); + + g_free (pVST); + } + + g_free (pProgFiles); + } + } + } + + if (p == 0) { + // If all else failed, assume the plugins are under "My Documents" + user_home = (char*) g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS); + if (user_home) { + p = g_build_filename (user_home, "Plugins", "VST", 0); + } else { + user_home = g_build_filename(g_get_home_dir(), "My Documents", 0); + if (user_home) + p = g_build_filename (user_home, "Plugins", "VST", 0); + } + } else { + // Concatenate the registry path with the user's personal path + user_home = (char*) g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS); + + if (user_home) { + p = g_build_path (";", p, g_build_filename(user_home, "Plugins", "VST", 0), 0); + } else { + user_home = g_build_filename(g_get_home_dir(), "My Documents", 0); + + if (user_home) { + p = g_build_path (";", p, g_build_filename (user_home, "Plugins", "VST", 0), 0); + } + } + } + + return p; +} + +#else + +/* Unix-like. Probably require some OS X specific breakdown if we ever add VST + * support on that platform. + */ + +const char * +vst_search_path () +{ + return "/usr/local/lib/vst:/usr/lib/vst"; +} + +#endif // PLATFORM_WINDOWS + +} // namespace ARDOUR diff --git a/libs/ardour/send.cc b/libs/ardour/send.cc index 71cab46879..87aadf4193 100644 --- a/libs/ardour/send.cc +++ b/libs/ardour/send.cc @@ -24,12 +24,13 @@ #include "pbd/boost_debug.h" #include "ardour/amp.h" -#include "ardour/send.h" -#include "ardour/session.h" #include "ardour/buffer_set.h" -#include "ardour/meter.h" +#include "ardour/debug.h" #include "ardour/io.h" +#include "ardour/meter.h" #include "ardour/panner_shell.h" +#include "ardour/send.h" +#include "ardour/session.h" #include "i18n.h" @@ -73,6 +74,8 @@ Send::name_and_id_new_send (Session& s, Role r, uint32_t& bitslot, bool ignore_b Send::Send (Session& s, boost::shared_ptr<Pannable> p, boost::shared_ptr<MuteMaster> mm, Role r, bool ignore_bitslot) : Delivery (s, p, mm, name_and_id_new_send (s, r, _bitslot, ignore_bitslot), r) , _metering (false) + , _delay_in (0) + , _delay_out (0) { if (_role == Listen) { /* we don't need to do this but it keeps things looking clean @@ -86,6 +89,8 @@ Send::Send (Session& s, boost::shared_ptr<Pannable> p, boost::shared_ptr<MuteMas _amp.reset (new Amp (_session)); _meter.reset (new PeakMeter (_session, name())); + _delayline.reset (new DelayLine (_session, name())); + add_control (_amp->gain_control ()); if (panner_shell()) { @@ -118,6 +123,35 @@ Send::deactivate () } void +Send::set_delay_in(framecnt_t delay) +{ + if (!_delayline) return; + if (_delay_in == delay) { + return; + } + _delay_in = delay; + + DEBUG_TRACE (DEBUG::LatencyCompensation, + string_compose ("Send::set_delay_in(%1) + %2 = %3\n", + delay, _delay_out, _delay_out + _delay_in)); + _delayline.get()->set_delay(_delay_out + _delay_in); +} + +void +Send::set_delay_out(framecnt_t delay) +{ + if (!_delayline) return; + if (_delay_out == delay) { + return; + } + _delay_out = delay; + DEBUG_TRACE (DEBUG::LatencyCompensation, + string_compose ("Send::set_delay_out(%1) + %2 = %3\n", + delay, _delay_in, _delay_out + _delay_in)); + _delayline.get()->set_delay(_delay_out + _delay_in); +} + +void Send::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool) { if (_output->n_ports() == ChanCount::ZERO) { @@ -146,6 +180,8 @@ Send::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframe _amp->setup_gain_automation (start_frame, end_frame, nframes); _amp->run (sendbufs, start_frame, end_frame, nframes, true); + _delayline->run (sendbufs, start_frame, end_frame, nframes, true); + /* deliver to outputs */ Delivery::run (sendbufs, start_frame, end_frame, nframes, true); @@ -301,6 +337,11 @@ Send::configure_io (ChanCount in, ChanCount out) return false; } + if (_delayline && !_delayline->configure_io(in, out)) { + cerr << "send delayline config failed\n"; + return false; + } + reset_panner (); return true; diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 0e4a10f76b..ae39d7c468 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -39,14 +39,13 @@ #include "pbd/convert.h" #include "pbd/error.h" #include "pbd/boost_debug.h" -#include "pbd/pathscanner.h" #include "pbd/stl_delete.h" #include "pbd/basename.h" #include "pbd/stacktrace.h" #include "pbd/file_utils.h" #include "pbd/convert.h" -#include "pbd/strsplit.h" #include "pbd/unwind.h" +#include "pbd/search_path.h" #include "ardour/amp.h" #include "ardour/analyser.h" @@ -69,6 +68,7 @@ #include "ardour/filename_extensions.h" #include "ardour/graph.h" #include "ardour/midiport_manager.h" +#include "ardour/scene_changer.h" #include "ardour/midi_track.h" #include "ardour/midi_ui.h" #include "ardour/operations.h" @@ -82,6 +82,7 @@ #include "ardour/region_factory.h" #include "ardour/route_graph.h" #include "ardour/route_group.h" +#include "ardour/route_sorters.h" #include "ardour/send.h" #include "ardour/session.h" #include "ardour/session_directory.h" @@ -125,6 +126,7 @@ PBD::Signal0<void> Session::FeedbackDetected; PBD::Signal0<void> Session::SuccessfulGraphSort; PBD::Signal2<void,std::string,std::string> Session::VersionMismatch; +const framecnt_t Session::bounce_chunk_size = 65536; static void clean_up_session_event (SessionEvent* ev) { delete ev; } const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event); @@ -137,6 +139,7 @@ Session::Session (AudioEngine &eng, : playlists (new SessionPlaylists) , _engine (eng) , process_function (&Session::process_with_events) + , _bounce_processing_active (false) , waiting_for_sync_offset (false) , _base_frame_rate (0) , _current_frame_rate (0) @@ -192,6 +195,8 @@ Session::Session (AudioEngine &eng, , state_tree (0) , state_was_pending (false) , _state_of_the_state (StateOfTheState(CannotSave|InitialConnecting|Loading)) + , _suspend_save (0) + , _save_queued (false) , _last_roll_location (0) , _last_roll_or_reversal_location (0) , _last_record_location (0) @@ -233,6 +238,7 @@ Session::Session (AudioEngine &eng, , routes (new RouteList) , _adding_routes_in_progress (false) , destructive_index (0) + , _track_number_decimals(1) , solo_update_disabled (false) , default_fade_steepness (0) , default_fade_msecs (0) @@ -261,6 +267,7 @@ Session::Session (AudioEngine &eng, , _speakers (new Speakers) , _order_hint (0) , ignore_route_processor_changes (false) + , _scene_changer (0) , _midi_ports (0) , _mmc (0) { @@ -294,6 +301,9 @@ Session::Session (AudioEngine &eng, throw failed_constructor (); } + /* load default session properties - if any */ + config.load_state(); + } else { if (load_state (_current_snapshot_name)) { @@ -491,6 +501,14 @@ Session::destroy () clear_clicks (); + /* need to remove auditioner before monitoring section + * otherwise it is re-connected */ + auditioner.reset (); + + /* drop references to routes held by the monitoring section + * specifically _monitor_out aux/listen references */ + remove_monitor_section(); + /* clear out any pending dead wood from RCU managed objects */ routes.flush (); @@ -510,7 +528,6 @@ Session::destroy () /* reset these three references to special routes before we do the usual route delete thing */ - auditioner.reset (); _master_out.reset (); _monitor_out.reset (); @@ -548,6 +565,8 @@ Session::destroy () /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */ playlists.reset (); + delete _scene_changer; _scene_changer = 0; + delete _mmc; _mmc = 0; delete _midi_ports; _midi_ports = 0; delete _locations; _locations = 0; @@ -1874,6 +1893,7 @@ Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost: failed: if (!new_routes.empty()) { + StateProtector sp (this); add_routes (new_routes, true, true, true); if (instrument) { @@ -2115,6 +2135,7 @@ Session::new_audio_track (int input_channels, int output_channels, TrackMode mod failed: if (!new_routes.empty()) { + StateProtector sp (this); add_routes (new_routes, true, true, true); } @@ -2200,6 +2221,7 @@ Session::new_audio_route (int input_channels, int output_channels, RouteGroup* r failure: if (!ret.empty()) { + StateProtector sp (this); add_routes (ret, false, true, true); // autoconnect outputs only } @@ -2316,6 +2338,7 @@ Session::new_route_from_template (uint32_t how_many, const std::string& template out: if (!ret.empty()) { + StateProtector sp (this); add_routes (ret, true, true, true); IO::enable_connecting (); } @@ -2345,6 +2368,8 @@ Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output save_state (_current_snapshot_name); } + reassign_track_numbers(); + RouteAdded (new_routes); /* EMIT SIGNAL */ } @@ -2586,6 +2611,13 @@ Session::remove_route (boost::shared_ptr<Route> route) } } + /* if the monitoring section had a pointer to this route, remove it */ + if (_monitor_out && !route->is_master() && !route->is_monitor()) { + Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); + PBD::Unwinder<bool> uw (ignore_route_processor_changes, true); + route->remove_aux_or_listen (_monitor_out); + } + boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route); if (mt && mt->step_editing()) { if (_step_editors > 0) { @@ -2622,6 +2654,7 @@ Session::remove_route (boost::shared_ptr<Route> route) if (save_state (_current_snapshot_name)) { save_history (_current_snapshot_name); } + reassign_track_numbers(); } void @@ -3038,6 +3071,42 @@ Session::route_by_remote_id (uint32_t id) return boost::shared_ptr<Route> ((Route*) 0); } + +void +Session::reassign_track_numbers () +{ + int64_t tn = 0; + int64_t bn = 0; + RouteList r (*(routes.reader ())); + SignalOrderRouteSorter sorter; + r.sort (sorter); + + StateProtector sp (this); + + for (RouteList::iterator i = r.begin(); i != r.end(); ++i) { + if (boost::dynamic_pointer_cast<Track> (*i)) { + (*i)->set_track_number(++tn); + } + else if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner()) { + (*i)->set_track_number(--bn); + } + } + const uint32_t decimals = ceilf (log10f (tn + 1)); + const bool decimals_changed = _track_number_decimals != decimals; + _track_number_decimals = decimals; + + if (decimals_changed && config.get_track_name_number ()) { + for (RouteList::iterator i = r.begin(); i != r.end(); ++i) { + boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i); + if (t) { + t->resync_track_name(); + } + } + // trigger GUI re-layout + config.ParameterChanged("track-name-number"); + } +} + void Session::playlist_region_added (boost::weak_ptr<Region> w) { @@ -3681,6 +3750,9 @@ Session::audition_region (boost::shared_ptr<Region> r) void Session::cancel_audition () { + if (!auditioner) { + return; + } if (auditioner->auditioning()) { auditioner->cancel_audition (); AuditionActive (false); /* EMIT SIGNAL */ @@ -3863,7 +3935,7 @@ Session::update_locations_after_tempo_map_change (Locations::LocationList& loc) void Session::ensure_buffers (ChanCount howmany) { - BufferManager::ensure_buffers (howmany); + BufferManager::ensure_buffers (howmany, bounce_processing() ? bounce_chunk_size : 0); } void @@ -4104,7 +4176,7 @@ Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end, bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs, InterThreadInfo& itt, boost::shared_ptr<Processor> endpoint, bool include_endpoint, - bool for_export) + bool for_export, bool for_freeze) { boost::shared_ptr<Region> result; boost::shared_ptr<Playlist> playlist; @@ -4113,10 +4185,13 @@ Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end, framepos_t position; framecnt_t this_chunk; framepos_t to_do; + framepos_t latency_skip; BufferSet buffers; framepos_t len = end - start; bool need_block_size_reset = false; ChanCount const max_proc = track.max_processor_streams (); + string legal_playlist_name; + string possible_path; if (end <= start) { error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"), @@ -4124,22 +4199,40 @@ Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end, return result; } - const framecnt_t chunk_size = (256 * 1024)/4; + diskstream_channels = track.bounce_get_output_streams (diskstream_channels, endpoint, + include_endpoint, for_export, for_freeze); + + if (diskstream_channels.n_audio() < 1) { + error << _("Cannot write a range with no audio.") << endmsg; + return result; + } // block all process callback handling block_processing (); + { + // synchronize with AudioEngine::process_callback() + // make sure processing is not currently running + // and processing_blocked() is honored before + // acquiring thread buffers + Glib::Threads::Mutex::Lock lm (_engine.process_lock()); + } + + _bounce_processing_active = true; + /* call tree *MUST* hold route_lock */ if ((playlist = track.playlist()) == 0) { goto out; } + legal_playlist_name = legalize_for_path (playlist->name()); + for (uint32_t chan_n = 0; chan_n < diskstream_channels.n_audio(); ++chan_n) { string base_name = string_compose ("%1-%2-bounce", playlist->name(), chan_n); - string path = new_audio_source_path (base_name, diskstream_channels.n_audio(), chan_n, false, true); + string path = new_audio_source_path (legal_playlist_name, diskstream_channels.n_audio(), chan_n, false, true); if (path.empty()) { goto out; @@ -4164,13 +4257,17 @@ Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end, */ need_block_size_reset = true; - track.set_block_size (chunk_size); + track.set_block_size (bounce_chunk_size); + _engine.main_thread()->get_buffers (); position = start; to_do = len; + latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze); /* create a set of reasonably-sized buffers */ - buffers.ensure_buffers (DataType::AUDIO, max_proc.n_audio(), chunk_size); + for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) { + buffers.ensure_buffers(*t, max_proc.get(*t), bounce_chunk_size); + } buffers.set_count (max_proc); for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) { @@ -4181,28 +4278,56 @@ Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end, while (to_do && !itt.cancel) { - this_chunk = min (to_do, chunk_size); + this_chunk = min (to_do, bounce_chunk_size); - if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export)) { + if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze)) { goto out; } + start += this_chunk; + to_do -= this_chunk; + itt.progress = (float) (1.0 - ((double) to_do / len)); + + if (latency_skip >= bounce_chunk_size) { + latency_skip -= bounce_chunk_size; + continue; + } + + const framecnt_t current_chunk = this_chunk - latency_skip; + uint32_t n = 0; for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) { boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src); if (afs) { - if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) { + if (afs->write (buffers.get_audio(n).data(latency_skip), current_chunk) != current_chunk) { goto out; } } } + latency_skip = 0; + } - start += this_chunk; - to_do -= this_chunk; + /* post-roll, pick up delayed processor output */ + latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze); - itt.progress = (float) (1.0 - ((double) to_do / len)); + while (latency_skip && !itt.cancel) { + this_chunk = min (latency_skip, bounce_chunk_size); + latency_skip -= this_chunk; + + buffers.silence (this_chunk, 0); + track.bounce_process (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze); + uint32_t n = 0; + for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) { + boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src); + + if (afs) { + if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) { + goto out; + } + } + } } if (!itt.cancel) { @@ -4254,8 +4379,10 @@ Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end, } } + _bounce_processing_active = false; if (need_block_size_reset) { + _engine.main_thread()->drop_buffers (); track.set_block_size (get_block_size()); } @@ -4546,18 +4673,18 @@ Session::end_time_changed (framepos_t old) } } -string +std::vector<std::string> Session::source_search_path (DataType type) const { - vector<string> s; + Searchpath sp; if (session_dirs.size() == 1) { switch (type) { case DataType::AUDIO: - s.push_back (_session_dir->sound_path()); + sp.push_back (_session_dir->sound_path()); break; case DataType::MIDI: - s.push_back (_session_dir->midi_path()); + sp.push_back (_session_dir->midi_path()); break; } } else { @@ -4565,10 +4692,10 @@ Session::source_search_path (DataType type) const SessionDirectory sdir (i->path); switch (type) { case DataType::AUDIO: - s.push_back (sdir.sound_path()); + sp.push_back (sdir.sound_path()); break; case DataType::MIDI: - s.push_back (sdir.midi_path()); + sp.push_back (sdir.midi_path()); break; } } @@ -4577,49 +4704,30 @@ Session::source_search_path (DataType type) const if (type == DataType::AUDIO) { const string sound_path_2X = _session_dir->sound_path_2X(); if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) { - if (find (s.begin(), s.end(), sound_path_2X) == s.end()) { - s.push_back (sound_path_2X); + if (find (sp.begin(), sp.end(), sound_path_2X) == sp.end()) { + sp.push_back (sound_path_2X); } } } - /* now check the explicit (possibly user-specified) search path - */ - - vector<string> dirs; + // now check the explicit (possibly user-specified) search path switch (type) { case DataType::AUDIO: - split (config.get_audio_search_path (), dirs, ':'); + sp += Searchpath(config.get_audio_search_path ()); break; case DataType::MIDI: - split (config.get_midi_search_path (), dirs, ':'); + sp += Searchpath(config.get_midi_search_path ()); break; } - for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) { - if (find (s.begin(), s.end(), *i) == s.end()) { - s.push_back (*i); - } - } - - string search_path; - - for (vector<string>::iterator si = s.begin(); si != s.end(); ++si) { - if (!search_path.empty()) { - search_path += ':'; - } - search_path += *si; - } - - return search_path; + return sp; } void Session::ensure_search_path_includes (const string& path, DataType type) { - string search_path; - vector<string> dirs; + Searchpath sp; if (path == ".") { return; @@ -4627,16 +4735,14 @@ Session::ensure_search_path_includes (const string& path, DataType type) switch (type) { case DataType::AUDIO: - search_path = config.get_audio_search_path (); + sp += Searchpath(config.get_audio_search_path ()); break; case DataType::MIDI: - search_path = config.get_midi_search_path (); + sp += Searchpath (config.get_midi_search_path ()); break; } - split (search_path, dirs, ':'); - - for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) { + for (vector<std::string>::iterator i = sp.begin(); i != sp.end(); ++i) { /* No need to add this new directory if it has the same inode as an existing one; checking inode rather than name prevents duplicated directories when we are using symlinks. @@ -4648,18 +4754,14 @@ Session::ensure_search_path_includes (const string& path, DataType type) } } - if (!search_path.empty()) { - search_path += ':'; - } - - search_path += path; + sp += path; switch (type) { case DataType::AUDIO: - config.set_audio_search_path (search_path); + config.set_audio_search_path (sp.to_string()); break; case DataType::MIDI: - config.set_midi_search_path (search_path); + config.set_midi_search_path (sp.to_string()); break; } } @@ -4944,6 +5046,8 @@ Session::sync_order_keys () DEBUG_TRACE (DEBUG::OrderKeys, "Sync Order Keys.\n"); + reassign_track_numbers(); + Route::SyncOrderKeys (); /* EMIT SIGNAL */ DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n"); 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 <algorithm> -#include <string> -#include <cmath> -#include <cerrno> -#include <unistd.h> -#include <fcntl.h> -#include <poll.h> - -#include <glibmm/threads.h> - #include "pbd/error.h" #include "pbd/pthread_utils.h" #include "pbd/stacktrace.h" diff --git a/libs/ardour/session_configuration.cc b/libs/ardour/session_configuration.cc index 0cfdb52872..f9f43ba4b2 100644 --- a/libs/ardour/session_configuration.cc +++ b/libs/ardour/session_configuration.cc @@ -17,9 +17,15 @@ */ +#include <glib.h> +#include <glib/gstdio.h> /* for g_stat() */ +#include <glibmm/miscutils.h> /* for build_filename() */ + +#include "pbd/file_utils.h" #include "pbd/pathexpand.h" #include "ardour/types.h" +#include "ardour/filesystem_paths.h" #include "ardour/session_configuration.h" #include "i18n.h" @@ -122,3 +128,67 @@ SessionConfiguration::map_parameters (boost::function<void (std::string)>& funct #undef CONFIG_VARIABLE #undef CONFIG_VARIABLE_SPECIAL } + + +bool +SessionConfiguration::load_state () +{ + std::string rcfile; + GStatBuf statbuf; + if (find_file (ardour_config_search_path(), "session.rc", rcfile)) { + if (g_stat (rcfile.c_str(), &statbuf)) { + return false; + } + if (statbuf.st_size == 0) { + return false; + } + XMLTree tree; + if (!tree.read (rcfile.c_str())) { + error << string_compose(_("%1: cannot part default session options \"%2\""), PROGRAM_NAME, rcfile) << endmsg; + return false; + } + + XMLNode& root (*tree.root()); + if (root.name() != X_("SessionDefaults")) { + warning << _("Invalid session default XML Root.") << endmsg; + return false; + } + + XMLNode* node; + if (((node = find_named_node (root, X_("Config"))) != 0)) { + LocaleGuard lg (X_("POSIX")); + set_variables(*node); + info << _("Loaded custom session defaults.") << endmsg; + } else { + warning << _("Found no session defaults in XML file.") << endmsg; + return false; + } + + /* CUSTOM OVERRIDES */ + set_audio_search_path(""); + set_midi_search_path(""); + set_raid_path(""); + } + return true; +} + +bool +SessionConfiguration::save_state () +{ + const std::string rcfile = Glib::build_filename (user_config_directory(), "session.rc"); + if (rcfile.empty()) { + return false; + } + + XMLTree tree; + XMLNode* root = new XMLNode(X_("SessionDefaults")); + root->add_child_nocopy (get_variables ()); + tree.set_root (root); + + if (!tree.write (rcfile.c_str())) { + error << _("Could not save session options") << endmsg; + return false; + } + + return true; +} diff --git a/libs/ardour/session_events.cc b/libs/ardour/session_events.cc index 6c828ac6f0..28d1b556f5 100644 --- a/libs/ardour/session_events.cc +++ b/libs/ardour/session_events.cc @@ -23,6 +23,7 @@ #include "pbd/error.h" #include "pbd/enumwriter.h" #include "pbd/stacktrace.h" +#include "pbd/pthread_utils.h" #include "ardour/debug.h" #include "ardour/session_event.h" @@ -56,7 +57,7 @@ SessionEvent::operator new (size_t) { CrossThreadPool* p = pool->per_thread_pool (); SessionEvent* ev = static_cast<SessionEvent*> (p->alloc ()); - DEBUG_TRACE (DEBUG::SessionEvents, string_compose ("%1 Allocating SessionEvent from %2 ev @ %3\n", pthread_self(), p->name(), ev)); + DEBUG_TRACE (DEBUG::SessionEvents, string_compose ("%1 Allocating SessionEvent from %2 ev @ %3\n", pthread_name(), p->name(), ev)); #ifndef NDEBUG if (DEBUG::SessionEvents & PBD::debug_bits) { stacktrace (cerr, 40); @@ -74,7 +75,7 @@ SessionEvent::operator delete (void *ptr, size_t /*size*/) DEBUG_TRACE (DEBUG::SessionEvents, string_compose ( "%1 Deleting SessionEvent @ %2 ev thread pool = %3 ev pool = %4\n", - pthread_self(), ev, p->name(), ev->own_pool->name() + pthread_name(), ev, p->name(), ev->own_pool->name() )); #ifndef NDEBUG @@ -243,7 +244,7 @@ SessionEventManager::_remove_event (SessionEvent* ev) if (i == next_event) { ++next_event; } - events.erase (i); + i = events.erase (i); break; } } diff --git a/libs/ardour/session_ltc.cc b/libs/ardour/session_ltc.cc index b2fbaf602c..2ce25b5a48 100644 --- a/libs/ardour/session_ltc.cc +++ b/libs/ardour/session_ltc.cc @@ -31,7 +31,6 @@ using namespace std; using namespace ARDOUR; -using namespace MIDI; using namespace PBD; using namespace Timecode; diff --git a/libs/ardour/session_midi.cc b/libs/ardour/session_midi.cc index 6d3083df77..639ea399d3 100644 --- a/libs/ardour/session_midi.cc +++ b/libs/ardour/session_midi.cc @@ -22,8 +22,6 @@ #include <cerrno> #include <cassert> #include <unistd.h> -#include <fcntl.h> -#include <poll.h> #include <boost/shared_ptr.hpp> @@ -34,6 +32,7 @@ #include "pbd/error.h" #include "pbd/pthread_utils.h" +#include "pbd/timersub.h" #include "timecode/time.h" @@ -349,7 +348,7 @@ Session::mmc_record_enable (MIDI::MachineControl &mmc, size_t trk, bool enabled) * @param t time to send. */ int -Session::send_full_time_code (framepos_t const t, pframes_t nframes) +Session::send_full_time_code (framepos_t const t, MIDI::pframes_t nframes) { /* This function could easily send at a given frame offset, but would * that be useful? Does ardour do sub-block accurate locating? [DR] */ @@ -418,7 +417,7 @@ Session::send_full_time_code (framepos_t const t, pframes_t nframes) msg[4] = 0x1; msg[9] = 0xf7; - msg[5] = mtc_timecode_bits | timecode.hours; + msg[5] = mtc_timecode_bits | (timecode.hours % 24); msg[6] = timecode.minutes; msg[7] = timecode.seconds; msg[8] = timecode.frames; @@ -440,7 +439,7 @@ Session::send_full_time_code (framepos_t const t, pframes_t nframes) * earlier already this cycle by send_full_time_code) */ int -Session::send_midi_time_code_for_cycle (framepos_t start_frame, framepos_t end_frame, pframes_t nframes) +Session::send_midi_time_code_for_cycle (framepos_t start_frame, framepos_t end_frame, ARDOUR::pframes_t nframes) { if (_engine.freewheeling() || !_send_qf_mtc || transmitting_timecode_time.negative || (next_quarter_frame_to_send < 0)) { // cerr << "(MTC) Not sending MTC\n"; @@ -512,7 +511,7 @@ Session::send_midi_time_code_for_cycle (framepos_t start_frame, framepos_t end_f assert (msg_time < end_frame); /* convert from session frames back to JACK frames using the transport speed */ - pframes_t const out_stamp = (msg_time - start_frame) / _transport_speed; + ARDOUR::pframes_t const out_stamp = (msg_time - start_frame) / _transport_speed; assert (out_stamp < nframes); MidiBuffer& mb (_midi_ports->mtc_output_port()->get_midi_buffer(nframes)); @@ -645,3 +644,27 @@ Session::mmc_input_port () const { return _midi_ports->mmc_input_port (); } + +MIDI::Port* +Session::scene_output_port () const +{ + return _midi_ports->scene_output_port (); +} + +MIDI::Port* +Session::scene_input_port () const +{ + return _midi_ports->scene_input_port (); +} + +boost::shared_ptr<MidiPort> +Session::scene_in () const +{ + return _midi_ports->scene_in (); +} + +boost::shared_ptr<MidiPort> +Session::scene_out () const +{ + return _midi_ports->scene_out (); +} diff --git a/libs/ardour/session_playlists.cc b/libs/ardour/session_playlists.cc index b2c4640880..b586ab196e 100644 --- a/libs/ardour/session_playlists.cc +++ b/libs/ardour/session_playlists.cc @@ -221,11 +221,11 @@ SessionPlaylists::get (vector<boost::shared_ptr<Playlist> >& s) const { Glib::Threads::Mutex::Lock lm (lock); - for (List::iterator i = playlists.begin(); i != playlists.end(); ++i) { + for (List::const_iterator i = playlists.begin(); i != playlists.end(); ++i) { s.push_back (*i); } - for (List::iterator i = unused_playlists.begin(); i != unused_playlists.end(); ++i) { + for (List::const_iterator i = unused_playlists.begin(); i != unused_playlists.end(); ++i) { s.push_back (*i); } } @@ -448,11 +448,11 @@ SessionPlaylists::region_use_count (boost::shared_ptr<Region> region) const Glib::Threads::Mutex::Lock lm (lock); uint32_t cnt = 0; - for (List::iterator i = playlists.begin(); i != playlists.end(); ++i) { + for (List::const_iterator i = playlists.begin(); i != playlists.end(); ++i) { cnt += (*i)->region_use_count (region); } - for (List::iterator i = unused_playlists.begin(); i != unused_playlists.end(); ++i) { + for (List::const_iterator i = unused_playlists.begin(); i != unused_playlists.end(); ++i) { cnt += (*i)->region_use_count (region); } diff --git a/libs/ardour/session_process.cc b/libs/ardour/session_process.cc index 6bfb250aec..680f2861de 100644 --- a/libs/ardour/session_process.cc +++ b/libs/ardour/session_process.cc @@ -35,6 +35,7 @@ #include "ardour/graph.h" #include "ardour/port.h" #include "ardour/process_thread.h" +#include "ardour/scene_changer.h" #include "ardour/session.h" #include "ardour/slave.h" #include "ardour/ticker.h" @@ -86,6 +87,9 @@ Session::process (pframes_t nframes) if (!_silent && !_engine.freewheeling() && Config->get_send_midi_clock() && (transport_speed() == 1.0f || transport_speed() == 0.0f) && midi_clock->has_midi_port()) { midi_clock->tick (transport_at_start, nframes); } + + _scene_changer->run (transport_at_start, transport_at_start + nframes); + } catch (...) { /* don't bother with a message */ } @@ -1010,7 +1014,7 @@ Session::process_event (SessionEvent* ev) switch (ev->type) { case SessionEvent::SetLoop: - set_play_loop (ev->yes_or_no); + set_play_loop (ev->yes_or_no, ev->speed); break; case SessionEvent::AutoLoop: diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index c985f8810a..eaf9f08b25 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -33,15 +33,14 @@ #include <unistd.h> #include <sys/stat.h> #include <climits> -#include <fcntl.h> -#include <poll.h> #include <signal.h> -#include <sys/mman.h> #include <sys/time.h> #ifdef HAVE_SYS_VFS_H #include <sys/vfs.h> -#else +#endif + +#ifdef __APPLE__ #include <sys/param.h> #include <sys/mount.h> #endif @@ -69,13 +68,14 @@ #include "pbd/enumwriter.h" #include "pbd/error.h" #include "pbd/file_utils.h" -#include "pbd/pathscanner.h" +#include "pbd/pathexpand.h" #include "pbd/pthread_utils.h" #include "pbd/stacktrace.h" #include "pbd/convert.h" -#include "pbd/clear_dir.h" +#include "pbd/localtime_r.h" #include "ardour/amp.h" +#include "ardour/async_midi_port.h" #include "ardour/audio_diskstream.h" #include "ardour/audio_track.h" #include "ardour/audioengine.h" @@ -91,6 +91,7 @@ #include "ardour/midi_model.h" #include "ardour/midi_patch_manager.h" #include "ardour/midi_region.h" +#include "ardour/midi_scene_changer.h" #include "ardour/midi_source.h" #include "ardour/midi_track.h" #include "ardour/pannable.h" @@ -135,23 +136,8 @@ Session::pre_engine_init (string fullpath) /* discover canonical fullpath */ - char buf[PATH_MAX+1]; + _path = canonical_path(fullpath); - if (!realpath (fullpath.c_str(), buf)) { - if (errno == ENOENT) { - /* fullpath does not exist yet, so realpath() returned - * ENOENT. Just use it as-is - */ - _path = fullpath; - } else { - error << string_compose(_("Could not use path %1 (%2)"), buf, strerror(errno)) << endmsg; - destroy (); - throw failed_constructor(); - } - } else { - _path = string(buf); - } - /* we require _path to end with a dir separator */ if (_path[_path.length()-1] != G_DIR_SEPARATOR) { @@ -221,6 +207,16 @@ Session::post_engine_init () BootMessage (_("Using configuration")); _midi_ports = new MidiPortManager; + + MIDISceneChanger* msc; + + _scene_changer = msc = new MIDISceneChanger (*this); + msc->set_input_port (scene_input_port()); + msc->set_output_port (scene_out()); + + boost::function<framecnt_t(void)> timer_func (boost::bind (&Session::audible_frame, this)); + boost::dynamic_pointer_cast<AsyncMIDIPort>(scene_in())->set_timer (timer_func); + setup_midi_machine_control (); if (_butler->start_thread()) { @@ -363,7 +359,7 @@ Session::post_engine_init () string Session::raid_path () const { - SearchPath raid_search_path; + Searchpath raid_search_path; for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) { raid_search_path += (*i).path; @@ -384,11 +380,11 @@ Session::setup_raid_path (string path) session_dirs.clear (); - SearchPath search_path(path); - SearchPath sound_search_path; - SearchPath midi_search_path; + Searchpath search_path(path); + Searchpath sound_search_path; + Searchpath midi_search_path; - for (SearchPath::const_iterator i = search_path.begin(); i != search_path.end(); ++i) { + for (Searchpath::const_iterator i = search_path.begin(); i != search_path.end(); ++i) { sp.path = *i; sp.blocks = 0; // not needed session_dirs.push_back (sp); @@ -673,6 +669,12 @@ Session::save_state (string snapshot_name, bool pending, bool switch_to_snapshot return 1; } + if (g_atomic_int_get(&_suspend_save)) { + _save_queued = true; + return 1; + } + _save_queued = false; + if (!_engine.connected ()) { error << string_compose (_("the %1 audio engine is not connected and state saving would lose all I/O connections. Session not saved"), PROGRAM_NAME) @@ -734,9 +736,9 @@ Session::save_state (string snapshot_name, bool pending, bool switch_to_snapshot } else { - if (::rename (tmp_path.c_str(), xml_path.c_str()) != 0) { - error << string_compose (_("could not rename temporary session file %1 to %2"), - tmp_path, xml_path) << endmsg; + if (::g_rename (tmp_path.c_str(), xml_path.c_str()) != 0) { + error << string_compose (_("could not rename temporary session file %1 to %2 (%3)"), + tmp_path, xml_path, g_strerror(errno)) << endmsg; if (g_remove (tmp_path.c_str()) != 0) { error << string_compose(_("Could not remove temporary session file at path \"%1\" (%2)"), tmp_path, g_strerror (errno)) << endmsg; @@ -812,7 +814,7 @@ Session::load_state (string snapshot_name) set_dirty(); - _writable = exists_and_writable (xmlpath); + _writable = exists_and_writable (xmlpath) && exists_and_writable(Glib::path_get_dirname(xmlpath)); if (!state_tree->read (xmlpath)) { error << string_compose(_("Could not understand session file %1"), xmlpath) << endmsg; @@ -877,6 +879,12 @@ Session::load_options (const XMLNode& node) return 0; } +bool +Session::save_default_options () +{ + return config.save_state(); +} + XMLNode& Session::get_state() { @@ -930,7 +938,7 @@ Session::state (bool full_state) p += (*i).path; if (next != session_dirs.end()) { - p += ':'; + p += G_SEARCHPATH_SEPARATOR; } else { break; } @@ -1423,7 +1431,13 @@ Session::XMLRouteFactory (const XMLNode& node, int version) ret = track; } else { - boost::shared_ptr<Route> r (new Route (*this, X_("toBeResetFroXML"))); + enum Route::Flag flags = Route::Flag(0); + const XMLProperty* prop = node.property("flags"); + if (prop) { + flags = Route::Flag (string_2_enum (prop->value(), flags)); + } + + boost::shared_ptr<Route> r (new Route (*this, X_("toBeResetFroXML"), flags)); if (r->init () == 0 && r->set_state (node, version) == 0) { #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS @@ -1495,7 +1509,13 @@ Session::XMLRouteFactory_2X (const XMLNode& node, int version) ret = track; } else { - boost::shared_ptr<Route> r (new Route (*this, X_("toBeResetFroXML"))); + enum Route::Flag flags = Route::Flag(0); + const XMLProperty* prop = node.property("flags"); + if (prop) { + flags = Route::Flag (string_2_enum (prop->value(), flags)); + } + + boost::shared_ptr<Route> r (new Route (*this, X_("toBeResetFroXML"), flags)); if (r->init () == 0 && r->set_state (node, version) == 0) { #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS @@ -2014,6 +2034,54 @@ Session::refresh_disk_space () _total_free_4k_blocks_uncertain = true; } } +#elif defined (COMPILER_MSVC) + vector<string> scanned_volumes; + vector<string>::iterator j; + vector<space_and_path>::iterator i; + DWORD nSectorsPerCluster, nBytesPerSector, + nFreeClusters, nTotalClusters; + char disk_drive[4]; + bool volume_found; + + _total_free_4k_blocks = 0; + + for (i = session_dirs.begin(); i != session_dirs.end(); i++) { + strncpy (disk_drive, (*i).path.c_str(), 3); + disk_drive[3] = 0; + strupr(disk_drive); + + volume_found = false; + if (0 != (GetDiskFreeSpace(disk_drive, &nSectorsPerCluster, &nBytesPerSector, &nFreeClusters, &nTotalClusters))) + { + int64_t nBytesPerCluster = nBytesPerSector * nSectorsPerCluster; + int64_t nFreeBytes = nBytesPerCluster * (int64_t)nFreeClusters; + i->blocks = (uint32_t)(nFreeBytes / 4096); + + for (j = scanned_volumes.begin(); j != scanned_volumes.end(); j++) { + if (0 == j->compare(disk_drive)) { + volume_found = true; + break; + } + } + + if (!volume_found) { + scanned_volumes.push_back(disk_drive); + _total_free_4k_blocks += i->blocks; + } + } + } + + if (0 == _total_free_4k_blocks) { + strncpy (disk_drive, path().c_str(), 3); + disk_drive[3] = 0; + + if (0 != (GetDiskFreeSpace(disk_drive, &nSectorsPerCluster, &nBytesPerSector, &nFreeClusters, &nTotalClusters))) + { + int64_t nBytesPerCluster = nBytesPerSector * nSectorsPerCluster; + int64_t nFreeBytes = nBytesPerCluster * (int64_t)nFreeClusters; + _total_free_4k_blocks = (uint32_t)(nFreeBytes / 4096); + } + } #endif } @@ -2200,22 +2268,16 @@ Session::auto_save() } static bool -state_file_filter (const string &str, void */*arg*/) +state_file_filter (const string &str, void* /*arg*/) { return (str.length() > strlen(statefile_suffix) && str.find (statefile_suffix) == (str.length() - strlen (statefile_suffix))); } -struct string_cmp { - bool operator()(const string* a, const string* b) { - return *a < *b; - } -}; - -static string* -remove_end(string* state) +static string +remove_end(string state) { - string statename(*state); + string statename(state); string::size_type start,end; if ((start = statename.find_last_of (G_DIR_SEPARATOR)) != string::npos) { @@ -2226,24 +2288,23 @@ remove_end(string* state) end = statename.length(); } - return new string(statename.substr (0, end)); + return string(statename.substr (0, end)); } -vector<string *> * +vector<string> Session::possible_states (string path) { - PathScanner scanner; - vector<string*>* states = scanner (path, state_file_filter, 0, false, false); + vector<string> states; + find_files_matching_filter (states, path, state_file_filter, 0, false, false); - transform(states->begin(), states->end(), states->begin(), remove_end); + transform(states.begin(), states.end(), states.begin(), remove_end); - string_cmp cmp; - sort (states->begin(), states->end(), cmp); + sort (states.begin(), states.end()); return states; } -vector<string *> * +vector<string> Session::possible_states () const { return possible_states(_path); @@ -2377,7 +2438,7 @@ Session::commit_reversible_command (Command *cmd) } static bool -accept_all_audio_files (const string& path, void */*arg*/) +accept_all_audio_files (const string& path, void* /*arg*/) { if (!Glib::file_test (path, Glib::FILE_TEST_IS_REGULAR)) { return false; @@ -2391,7 +2452,7 @@ accept_all_audio_files (const string& path, void */*arg*/) } static bool -accept_all_midi_files (const string& path, void */*arg*/) +accept_all_midi_files (const string& path, void* /*arg*/) { if (!Glib::file_test (path, Glib::FILE_TEST_IS_REGULAR)) { return false; @@ -2403,7 +2464,7 @@ accept_all_midi_files (const string& path, void */*arg*/) } static bool -accept_all_state_files (const string& path, void */*arg*/) +accept_all_state_files (const string& path, void* /*arg*/) { if (!Glib::file_test (path, Glib::FILE_TEST_IS_REGULAR)) { return false; @@ -2467,8 +2528,7 @@ Session::find_all_sources (string path, set<string>& result) int Session::find_all_sources_across_snapshots (set<string>& result, bool exclude_this_snapshot) { - PathScanner scanner; - vector<string*>* state_files; + vector<string> state_files; string ripped; string this_snapshot_path; @@ -2480,9 +2540,9 @@ Session::find_all_sources_across_snapshots (set<string>& result, bool exclude_th ripped = ripped.substr (0, ripped.length() - 1); } - state_files = scanner (ripped, accept_all_state_files, (void *) 0, true, true); + find_files_matching_filter (state_files, ripped, accept_all_state_files, (void *) 0, true, true); - if (state_files == 0) { + if (state_files.empty()) { /* impossible! */ return 0; } @@ -2491,13 +2551,13 @@ Session::find_all_sources_across_snapshots (set<string>& result, bool exclude_th this_snapshot_path += legalize_for_path (_current_snapshot_name); this_snapshot_path += statefile_suffix; - for (vector<string*>::iterator i = state_files->begin(); i != state_files->end(); ++i) { + for (vector<string>::iterator i = state_files.begin(); i != state_files.end(); ++i) { - if (exclude_this_snapshot && **i == this_snapshot_path) { + if (exclude_this_snapshot && *i == this_snapshot_path) { continue; } - if (find_all_sources (**i, result) < 0) { + if (find_all_sources (*i, result) < 0) { return -1; } } @@ -2547,18 +2607,18 @@ Session::cleanup_sources (CleanupReport& rep) // FIXME: needs adaptation to midi vector<boost::shared_ptr<Source> > dead_sources; - PathScanner scanner; string audio_path; string midi_path; - vector<space_and_path>::iterator i; - vector<space_and_path>::iterator nexti; - vector<string*>* candidates; - vector<string*>* candidates2; + vector<string> candidates; vector<string> unused; set<string> all_sources; bool used; string spath; int ret = -1; + string tmppath1; + string tmppath2; + Searchpath asp; + Searchpath msp; _state_of_the_state = (StateOfTheState) (_state_of_the_state | InCleanup); @@ -2600,54 +2660,23 @@ Session::cleanup_sources (CleanupReport& rep) /* build a list of all the possible audio directories for the session */ - for (i = session_dirs.begin(); i != session_dirs.end(); ) { - - nexti = i; - ++nexti; - + for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) { SessionDirectory sdir ((*i).path); - audio_path += sdir.sound_path(); - - if (nexti != session_dirs.end()) { - audio_path += ':'; - } - - i = nexti; + asp += sdir.sound_path(); } + audio_path += asp.to_string(); /* build a list of all the possible midi directories for the session */ - for (i = session_dirs.begin(); i != session_dirs.end(); ) { - - nexti = i; - ++nexti; - + for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) { SessionDirectory sdir ((*i).path); - midi_path += sdir.midi_path(); - - if (nexti != session_dirs.end()) { - midi_path += ':'; - } - - i = nexti; + msp += sdir.midi_path(); } + midi_path += msp.to_string(); - candidates = scanner (audio_path, accept_all_audio_files, (void *) 0, true, true); - candidates2 = scanner (midi_path, accept_all_midi_files, (void *) 0, true, true); - - /* merge them */ - - if (candidates) { - if (candidates2) { - for (vector<string*>::iterator i = candidates2->begin(); i != candidates2->end(); ++i) { - candidates->push_back (*i); - } - delete candidates2; - } - } else { - candidates = candidates2; // might still be null - } + find_files_matching_filter (candidates, audio_path, accept_all_audio_files, (void *) 0, true, true); + find_files_matching_filter (candidates, midi_path, accept_all_midi_files, (void *) 0, true, true); /* find all sources, but don't use this snapshot because the state file on disk still references sources we may have already @@ -2687,44 +2716,26 @@ Session::cleanup_sources (CleanupReport& rep) i = tmp; } - char tmppath1[PATH_MAX+1]; - char tmppath2[PATH_MAX+1]; - - if (candidates) { - for (vector<string*>::iterator x = candidates->begin(); x != candidates->end(); ++x) { - - used = false; - spath = **x; - - for (set<string>::iterator i = all_sources.begin(); i != all_sources.end(); ++i) { + for (vector<string>::iterator x = candidates.begin(); x != candidates.end(); ++x) { - if (realpath(spath.c_str(), tmppath1) == 0) { - error << string_compose (_("Cannot expand path %1 (%2)"), - spath, strerror (errno)) << endmsg; - continue; - } + used = false; + spath = *x; - if (realpath((*i).c_str(), tmppath2) == 0) { - error << string_compose (_("Cannot expand path %1 (%2)"), - (*i), strerror (errno)) << endmsg; - continue; - } + for (set<string>::iterator i = all_sources.begin(); i != all_sources.end(); ++i) { - if (strcmp(tmppath1, tmppath2) == 0) { - used = true; - break; - } - } - - if (!used) { - unused.push_back (spath); - } + tmppath1 = canonical_path (spath); + tmppath2 = canonical_path ((*i)); - delete *x; - } + if (tmppath1 == tmppath2) { + used = true; + break; + } + } - delete candidates; - } + if (!used) { + unused.push_back (spath); + } + } /* now try to move all unused files into the "dead" directory(ies) */ @@ -2814,7 +2825,7 @@ Session::cleanup_sources (CleanupReport& rep) string peakpath = peak_path (base); if (Glib::file_test (peakpath.c_str(), Glib::FILE_TEST_EXISTS)) { - if (::unlink (peakpath.c_str()) != 0) { + if (::g_unlink (peakpath.c_str()) != 0) { error << string_compose (_("cannot remove peakfile %1 for %2 (%3)"), peakpath, _path, strerror (errno)) << endmsg; @@ -3543,8 +3554,6 @@ Session::rename (const std::string& new_name) string const old_sources_root = _session_dir->sources_root(); -#define RENAME ::rename - /* Rename: * session directory @@ -3606,7 +3615,8 @@ Session::rename (const std::string& new_name) cerr << "Rename " << oldstr << " => " << newstr << endl; - if (RENAME (oldstr.c_str(), newstr.c_str()) != 0) { + if (::g_rename (oldstr.c_str(), newstr.c_str()) != 0) { + error << string_compose (_("renaming %s as %2 failed (%3)"), oldstr, newstr, g_strerror (errno)) << endmsg; return 1; } @@ -3633,7 +3643,8 @@ Session::rename (const std::string& new_name) cerr << "Rename " << oldstr << " => " << newstr << endl; - if (RENAME (oldstr.c_str(), newstr.c_str()) != 0) { + if (::g_rename (oldstr.c_str(), newstr.c_str()) != 0) { + error << string_compose (_("renaming %s as %2 failed (%3)"), oldstr, newstr, g_strerror (errno)) << endmsg; return 1; } } @@ -3645,7 +3656,8 @@ Session::rename (const std::string& new_name) cerr << "Rename " << oldstr << " => " << newstr << endl; - if (RENAME (oldstr.c_str(), newstr.c_str()) != 0) { + if (::g_rename (oldstr.c_str(), newstr.c_str()) != 0) { + error << string_compose (_("renaming %s as %2 failed (%3)"), oldstr, newstr, g_strerror (errno)) << endmsg; return 1; } @@ -3659,7 +3671,8 @@ Session::rename (const std::string& new_name) cerr << "Rename " << oldstr << " => " << newstr << endl; - if (RENAME (oldstr.c_str(), newstr.c_str()) != 0) { + if (::g_rename (oldstr.c_str(), newstr.c_str()) != 0) { + error << string_compose (_("renaming %s as %2 failed (%3)"), oldstr, newstr, g_strerror (errno)) << endmsg; return 1; } } @@ -3683,6 +3696,11 @@ Session::rename (const std::string& new_name) _current_snapshot_name = new_name; _name = new_name; + /* re-add directory separator - reverse hack to oldstr above */ + if (_path[_path.length()-1] != G_DIR_SEPARATOR) { + _path += G_DIR_SEPARATOR; + } + set_dirty (); /* save state again to get everything just right */ @@ -3695,8 +3713,6 @@ Session::rename (const std::string& new_name) store_recent_sessions (new_name, _path); return 0; - -#undef RENAME } int diff --git a/libs/ardour/session_state_utils.cc b/libs/ardour/session_state_utils.cc index 13d65e5b3c..5d5c9cc8df 100644 --- a/libs/ardour/session_state_utils.cc +++ b/libs/ardour/session_state_utils.cc @@ -47,10 +47,8 @@ void get_state_files_in_directory (const std::string & directory_path, vector<std::string> & result) { - Glib::PatternSpec state_file_pattern('*' + string(statefile_suffix)); - - find_matching_files_in_directory (directory_path, state_file_pattern, - result); + find_files_matching_pattern (result, directory_path, + '*' + string(statefile_suffix)); } vector<string> diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc index 38ad521235..85b36e5a66 100644 --- a/libs/ardour/session_transport.cc +++ b/libs/ardour/session_transport.cc @@ -30,6 +30,7 @@ #include "pbd/enumwriter.h" #include "pbd/pthread_utils.h" #include "pbd/memento_command.h" +#include "pbd/stacktrace.h" #include "midi++/mmc.h" #include "midi++/port.h" @@ -40,6 +41,8 @@ #include "ardour/click.h" #include "ardour/debug.h" #include "ardour/location.h" +#include "ardour/profile.h" +#include "ardour/scene_changer.h" #include "ardour/session.h" #include "ardour/slave.h" #include "ardour/operations.h" @@ -158,10 +161,11 @@ Session::force_locate (framepos_t target_frame, bool with_roll) } void -Session::request_play_loop (bool yn, bool leave_rolling) +Session::request_play_loop (bool yn, bool change_transport_roll) { SessionEvent* ev; Location *location = _locations->auto_loop_location(); + double target_speed; if (location == 0 && yn) { error << _("Cannot loop - no loop range defined") @@ -169,14 +173,44 @@ Session::request_play_loop (bool yn, bool leave_rolling) return; } - ev = new SessionEvent (SessionEvent::SetLoop, SessionEvent::Add, SessionEvent::Immediate, 0, (leave_rolling ? 1.0 : 0.0), yn); - DEBUG_TRACE (DEBUG::Transport, string_compose ("Request set loop = %1, leave rolling ? %2\n", yn, leave_rolling)); + if (change_transport_roll) { + if (transport_rolling()) { + /* start looping at current speed */ + target_speed = transport_speed (); + } else { + /* currently stopped */ + if (yn) { + /* start looping at normal speed */ + target_speed = 1.0; + } else { + target_speed = 0.0; + } + } + } else { + /* leave the speed alone */ + target_speed = transport_speed (); + } + + ev = new SessionEvent (SessionEvent::SetLoop, SessionEvent::Add, SessionEvent::Immediate, 0, target_speed, yn); + DEBUG_TRACE (DEBUG::Transport, string_compose ("Request set loop = %1, change roll state ? %2\n", yn, change_transport_roll)); queue_event (ev); - if (!leave_rolling && !yn && Config->get_seamless_loop() && transport_rolling()) { - // request an immediate locate to refresh the tracks - // after disabling looping - request_locate (_transport_frame-1, false); + if (yn) { + if (!change_transport_roll) { + if (!transport_rolling()) { + /* we're not changing transport state, but we do want + to set up position for the new loop. Don't + do this if we're rolling already. + */ + request_locate (location->start(), false); + } + } + } else { + if (!change_transport_roll && Config->get_seamless_loop() && transport_rolling()) { + // request an immediate locate to refresh the tracks + // after disabling looping + request_locate (_transport_frame-1, false); + } } } @@ -423,6 +457,8 @@ Session::non_realtime_locate () (*i)->non_realtime_locate (_transport_frame); } + _scene_changer->locate (_transport_frame); + /* XXX: it would be nice to generate the new clicks here (in the non-RT thread) rather than clearing them so that the RT thread has to spend time constructing them (in Session::click). @@ -498,6 +534,11 @@ Session::non_realtime_stop (bool abort, int on_entry, bool& finished) if (did_record) { commit_reversible_command (); + /* increase take name */ + if (config.get_track_name_take () && !config.get_take_name ().empty()) { + string newname = config.get_take_name(); + config.set_take_name(bump_name_number (newname)); + } } if (_engine.running()) { @@ -531,8 +572,6 @@ Session::non_realtime_stop (bool abort, int on_entry, bool& finished) /* explicit return request pre-queued in event list. overrides everything else */ - cerr << "explicit auto-return to " << _requested_return_frame << endl; - _transport_frame = _requested_return_frame; do_locate = true; @@ -589,8 +628,10 @@ Session::non_realtime_stop (bool abort, int on_entry, bool& finished) */ if (ptw & PostTransportClearSubstate) { - _play_range = false; - unset_play_loop (); + unset_play_range (); + if (!Config->get_loop_is_mode()) { + unset_play_loop (); + } } /* this for() block can be put inside the previous if() and has the effect of ... ??? what */ @@ -657,8 +698,10 @@ Session::non_realtime_stop (bool abort, int on_entry, bool& finished) } if (ptw & PostTransportStop) { - _play_range = false; - play_loop = false; + unset_play_range (); + if (!Config->get_loop_is_mode()) { + unset_play_loop (); + } } PositionChanged (_transport_frame); /* EMIT SIGNAL */ @@ -723,7 +766,7 @@ Session::unset_play_loop () } void -Session::set_play_loop (bool yn) +Session::set_play_loop (bool yn, double speed) { /* Called from event-handling context */ @@ -782,12 +825,24 @@ Session::set_play_loop (bool yn) merge_event (new SessionEvent (SessionEvent::AutoLoopDeclick, SessionEvent::Replace, dcp, dcl, 0.0f)); merge_event (new SessionEvent (SessionEvent::AutoLoop, SessionEvent::Replace, loc->end(), loc->start(), 0.0f)); - /* locate to start of loop and roll. + /* if requested to roll, locate to start of loop and + * roll but ONLY if we're not already rolling. args: positition, roll=true, flush=true, with_loop=false, force buffer refill if seamless looping */ - start_locate (loc->start(), true, true, false, Config->get_seamless_loop()); + if (Config->get_loop_is_mode()) { + /* loop IS a transport mode: if already + rolling, do not locate to loop start. + */ + if (!transport_rolling() && (speed != 0.0)) { + start_locate (loc->start(), true, true, false, Config->get_seamless_loop()); + } + } else { + if (speed != 0.0) { + start_locate (loc->start(), true, true, false, Config->get_seamless_loop()); + } + } } } else { @@ -983,7 +1038,9 @@ Session::locate (framepos_t target_frame, bool with_roll, bool with_flush, bool // located outside the loop: cancel looping directly, this is called from event handling context - set_play_loop (false); + if (!Config->get_loop_is_mode()) { + set_play_loop (false, _transport_speed); + } } else if (_transport_frame == al->start()) { @@ -1080,12 +1137,27 @@ Session::set_transport_speed (double speed, bool abort, bool clear_state, bool a stop_transport (abort); } - unset_play_loop (); + if (!Config->get_loop_is_mode()) { + unset_play_loop (); + } } else if (transport_stopped() && speed == 1.0) { /* we are stopped and we want to start rolling at speed 1 */ + if (Config->get_loop_is_mode() && play_loop) { + + Location *location = _locations->auto_loop_location(); + + if (location != 0) { + if (_transport_frame != location->start()) { + /* jump to start and then roll from there */ + request_locate (location->start(), true); + return; + } + } + } + if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) { set_track_monitor_input_status (false); } diff --git a/libs/ardour/session_vst.cc b/libs/ardour/session_vst.cc index c746a9d388..508f11df13 100644 --- a/libs/ardour/session_vst.cc +++ b/libs/ardour/session_vst.cc @@ -28,6 +28,9 @@ #include "ardour/windows_vst_plugin.h" #include "ardour/vestige/aeffectx.h" #include "ardour/vst_types.h" +#ifdef WINDOWS_VST_SUPPORT +#include <fst.h> +#endif #include "i18n.h" @@ -42,6 +45,20 @@ static int debug_callbacks = -1; using namespace ARDOUR; +int Session::vst_current_loading_id = 0; +const char* Session::vst_can_do_strings[] = { + X_("supplyIdle"), + X_("sendVstTimeInfo"), + X_("sendVstEvents"), + X_("sendVstMidiEvent"), + X_("receiveVstEvents"), + X_("receiveVstMidiEvent"), + X_("supportShell"), + X_("shellCategory"), + X_("shellCategorycurID") +}; +const int Session::vst_can_do_string_count = sizeof (vst_can_do_strings) / sizeof (char*); + intptr_t Session::vst_callback ( AEffect* effect, int32_t opcode, @@ -60,7 +77,7 @@ intptr_t Session::vst_callback ( } if (effect && effect->user) { - plug = (VSTPlugin *) (effect->user); + plug = (VSTPlugin *) (effect->user); session = &plug->session(); #ifdef COMPILER_MSVC SHOW_CALLBACK ("am callback 0x%x, opcode = %d, plugin = \"%s\" ", (int) pthread_self().p, opcode, plug->name()); @@ -90,18 +107,18 @@ intptr_t Session::vst_callback ( case audioMasterVersion: SHOW_CALLBACK ("amc: audioMasterVersion\n"); // vst version, currently 2 (0 for older) - return 2; + return 2400; case audioMasterCurrentId: SHOW_CALLBACK ("amc: audioMasterCurrentId\n"); - // returns the unique id of a plug that's currently - // loading - return 0; + // returns the unique id of a plug that's currently loading + return vst_current_loading_id; case audioMasterIdle: SHOW_CALLBACK ("amc: audioMasterIdle\n"); - // call application idle routine (this will - // call effEditIdle for all open editors too) +#ifdef WINDOWS_VST_SUPPORT + fst_audio_master_idle(); +#endif if (effect) { effect->dispatcher(effect, effEditIdle, 0, 0, NULL, 0.0f); } @@ -137,7 +154,7 @@ intptr_t Session::vst_callback ( _timeInfo.samplePos = now; _timeInfo.sampleRate = session->frame_rate(); - + const TempoMetric& tm (session->tempo_map().metric_at (now)); if (value & (kVstTempoValid)) { @@ -156,22 +173,21 @@ intptr_t Session::vst_callback ( try { session->tempo_map().bbt_time_rt (now, bbt); - + /* PPQ = pulse per quarter - VST's "pulse" is our "division". - - 8 divisions per bar, 1 division = quarter, so 8 quarters per bar, ppq = 1 - 8 divisions per bar, 1 division = eighth, so 4 quarters per bar, ppq = 2 - 4 divisions per bar, 1 division = quarter, so 4 quarters per bar, ppq = 1 - 4 divisions per bar, 1 division = half, so 8 quarters per bar, ppq = 0.5 - 4 divisions per bar, 1 division = fifth, so (4 * 5/4) quarters per bar, ppq = 5/4 - - general: divs_per_bar / (note_type / 4.0) - */ + * VST's "pulse" is our "division". + * + * 8 divisions per bar, 1 division = quarter, so 8 quarters per bar, ppq = 1 + * 8 divisions per bar, 1 division = eighth, so 4 quarters per bar, ppq = 2 + * 4 divisions per bar, 1 division = quarter, so 4 quarters per bar, ppq = 1 + * 4 divisions per bar, 1 division = half, so 8 quarters per bar, ppq = 0.5 + * 4 divisions per bar, 1 division = fifth, so (4 * 5/4) quarters per bar, ppq = 5/4 + * + * general: divs_per_bar / (note_type / 4.0) + */ double ppq_scaling = tm.meter().note_divisor() / 4.0; - /* Note that this assumes constant meter/tempo throughout the session. Stupid VST - */ + /* Note that this assumes constant meter/tempo throughout the session. Stupid VST */ double ppqBar = double(bbt.bars - 1) * tm.meter().divisions_per_bar(); double ppqBeat = double(bbt.beats - 1); double ppqTick = double(bbt.ticks) / Timecode::BBT_Time::ticks_per_beat; @@ -179,17 +195,17 @@ intptr_t Session::vst_callback ( ppqBar *= ppq_scaling; ppqBeat *= ppq_scaling; ppqTick *= ppq_scaling; - + if (value & (kVstPpqPosValid)) { _timeInfo.ppqPos = ppqBar + ppqBeat + ppqTick; _timeInfo.flags |= (kVstPpqPosValid); } - + if (value & (kVstBarsValid)) { _timeInfo.barStartPos = ppqBar; _timeInfo.flags |= (kVstBarsValid); } - + } catch (...) { /* relax */ } @@ -197,13 +213,13 @@ intptr_t Session::vst_callback ( if (value & (kVstSmpteValid)) { Timecode::Time t; - + session->timecode_time (now, t); - - _timeInfo.smpteOffset = (t.hours * t.rate * 60.0 * 60.0) + - (t.minutes * t.rate * 60.0) + - (t.seconds * t.rate) + - (t.frames) + + + _timeInfo.smpteOffset = (t.hours * t.rate * 60.0 * 60.0) + + (t.minutes * t.rate * 60.0) + + (t.seconds * t.rate) + + (t.frames) + (t.subframes); _timeInfo.smpteOffset *= 80.0; /* VST spec is 1/80th frames */ @@ -239,12 +255,21 @@ intptr_t Session::vst_callback ( _timeInfo.samplePos = 0; _timeInfo.sampleRate = AudioEngine::instance()->sample_rate(); } - + return (intptr_t) &_timeInfo; case audioMasterProcessEvents: SHOW_CALLBACK ("amc: audioMasterProcessEvents\n"); // VstEvents* in <ptr> + if (plug && plug->midi_buffer()) { + VstEvents* v = (VstEvents*)ptr; + for (int n = 0 ; n < v->numEvents; ++n) { + VstMidiEvent *vme = (VstMidiEvent*) (v->events[n]->dump); + if (vme->type == kVstMidiType) { + plug->midi_buffer()->push_back(vme->deltaFrames, 3, (uint8_t*)vme->midiData); + } + } + } return 0; case audioMasterSetTime: @@ -268,14 +293,14 @@ intptr_t Session::vst_callback ( case audioMasterGetParameterQuantization: SHOW_CALLBACK ("amc: audioMasterGetParameterQuantization\n"); - // returns the integer value for +1.0 representation, - // or 1 if full single float precision is maintained - // in automation. parameter index in <value> (-1: all, any) + // returns the integer value for +1.0 representation, + // or 1 if full single float precision is maintained + // in automation. parameter index in <value> (-1: all, any) return 0; case audioMasterIOChanged: SHOW_CALLBACK ("amc: audioMasterIOChanged\n"); - // numInputs and/or numOutputs has changed + // numInputs and/or numOutputs has changed return 0; case audioMasterNeedIdle: @@ -315,16 +340,16 @@ intptr_t Session::vst_callback ( case audioMasterGetPreviousPlug: SHOW_CALLBACK ("amc: audioMasterGetPreviousPlug\n"); - // input pin in <value> (-1: first to come), returns cEffect* + // input pin in <value> (-1: first to come), returns cEffect* return 0; case audioMasterGetNextPlug: SHOW_CALLBACK ("amc: audioMasterGetNextPlug\n"); - // output pin in <value> (-1: first to come), returns cEffect* + // output pin in <value> (-1: first to come), returns cEffect* case audioMasterWillReplaceOrAccumulate: SHOW_CALLBACK ("amc: audioMasterWillReplaceOrAccumulate\n"); - // returns: 0: not supported, 1: replace, 2: accumulate + // returns: 0: not supported, 1: replace, 2: accumulate return 0; case audioMasterGetCurrentProcessLevel: @@ -346,10 +371,10 @@ intptr_t Session::vst_callback ( case audioMasterOfflineStart: SHOW_CALLBACK ("amc: audioMasterOfflineStart\n"); return 0; - + case audioMasterOfflineRead: SHOW_CALLBACK ("amc: audioMasterOfflineRead\n"); - // ptr points to offline structure, see below. return 0: error, 1 ok + // ptr points to offline structure, see below. return 0: error, 1 ok return 0; case audioMasterOfflineWrite: @@ -360,7 +385,7 @@ intptr_t Session::vst_callback ( case audioMasterOfflineGetCurrentPass: SHOW_CALLBACK ("amc: audioMasterOfflineGetCurrentPass\n"); return 0; - + case audioMasterOfflineGetCurrentMetaPass: SHOW_CALLBACK ("amc: audioMasterOfflineGetCurrentMetaPass\n"); return 0; @@ -404,7 +429,12 @@ intptr_t Session::vst_callback ( case audioMasterCanDo: SHOW_CALLBACK ("amc: audioMasterCanDo\n"); - // string in ptr, see below + // string in ptr, (const char*)ptr + for (int i = 0; i < vst_can_do_string_count; i++) { + if (! strcmp(vst_can_do_strings[i], (const char*)ptr)) { + return 1; + } + } return 0; case audioMasterGetLanguage: diff --git a/libs/ardour/smf_source.cc b/libs/ardour/smf_source.cc index 1cd456ee58..e39ef3f548 100644 --- a/libs/ardour/smf_source.cc +++ b/libs/ardour/smf_source.cc @@ -26,15 +26,15 @@ #include <errno.h> #include <regex.h> -#include "pbd/pathscanner.h" #include "pbd/stl_delete.h" #include "pbd/strsplit.h" +#include <glib/gstdio.h> #include <glibmm/miscutils.h> #include <glibmm/fileutils.h> #include "evoral/Control.hpp" -#include "evoral/evoral/SMF.hpp" +#include "evoral/SMF.hpp" #include "ardour/event_type_map.h" #include "ardour/midi_model.h" @@ -148,7 +148,7 @@ SMFSource::SMFSource (Session& s, const XMLNode& node, bool must_exist) SMFSource::~SMFSource () { if (removable()) { - unlink (_path.c_str()); + ::g_unlink (_path.c_str()); } } diff --git a/libs/ardour/sndfile_helpers.cc b/libs/ardour/sndfile_helpers.cc index 459890e829..2e618e043b 100644 --- a/libs/ardour/sndfile_helpers.cc +++ b/libs/ardour/sndfile_helpers.cc @@ -17,7 +17,9 @@ */ +#ifndef COMPILER_MSVC #include <strings.h> +#endif #include <map> #include <sndfile.h> diff --git a/libs/ardour/sndfileimportable.cc b/libs/ardour/sndfileimportable.cc index c9f6c4014f..ceb88eddc9 100644 --- a/libs/ardour/sndfileimportable.cc +++ b/libs/ardour/sndfileimportable.cc @@ -51,7 +51,7 @@ SndFileImportableSource::read (Sample* buffer, framecnt_t nframes) return per_channel * sf_info.channels; } -uint +uint32_t SndFileImportableSource::channels () const { return sf_info.channels; diff --git a/libs/ardour/sndfilesource.cc b/libs/ardour/sndfilesource.cc index 5465c5e4a4..af25b3e76f 100644 --- a/libs/ardour/sndfilesource.cc +++ b/libs/ardour/sndfilesource.cc @@ -26,8 +26,6 @@ #include <climits> #include <cstdarg> -#include <pwd.h> -#include <sys/utsname.h> #include <sys/stat.h> #ifdef PLATFORM_WINDOWS @@ -77,7 +75,9 @@ SndFileSource::SndFileSource (Session& s, const XMLNode& node) } } -/** Files created this way are never writable or removable */ +/** Constructor for existing external-to-session files. + Files created this way are never writable or removable +*/ SndFileSource::SndFileSource (Session& s, const string& path, int chn, Flag flags) : Source(s, DataType::AUDIO, path, flags) /* note that the origin of an external file is itself */ @@ -101,7 +101,9 @@ SndFileSource::SndFileSource (Session& s, const string& path, int chn, Flag flag } } -/** This constructor is used to construct new files, not open existing ones. */ +/** This constructor is used to construct new internal-to-session files, + not open existing ones. +*/ SndFileSource::SndFileSource (Session& s, const string& path, const string& origin, SampleFormat sfmt, HeaderFormat hf, framecnt_t rate, Flag flags) : Source(s, DataType::AUDIO, path, flags) @@ -231,22 +233,30 @@ SndFileSource::init_sndfile () int SndFileSource::open () { - _descriptor = new SndFileDescriptor (_path, writable(), &_info); + string path_to_open; + +#ifdef PLATFORM_WINDOWS + path_to_open = Glib::locale_from_utf8(_path); +#else + path_to_open = _path; +#endif + + _descriptor = new SndFileDescriptor (path_to_open.c_str(), writable(), &_info); _descriptor->Closed.connect_same_thread (file_manager_connection, boost::bind (&SndFileSource::file_closed, this)); SNDFILE* sf = _descriptor->allocate (); if (sf == 0) { - char errbuf[256]; + char errbuf[1024]; sf_error_str (0, errbuf, sizeof (errbuf) - 1); #ifndef HAVE_COREAUDIO /* if we have CoreAudio, we will be falling back to that if libsndfile fails, so we don't want to see this message. */ - cerr << "failed to open " << _path << " with name " << _name << endl; + cerr << "failed to open " << path_to_open << " with name " << _name << endl; error << string_compose(_("SndFileSource: cannot open file \"%1\" for %2 (%3)"), - _path, (writable() ? "read+write" : "reading"), errbuf) << endmsg; + path_to_open, (writable() ? "read+write" : "reading"), errbuf) << endmsg; #endif return -1; } @@ -308,7 +318,7 @@ SndFileSource::open () if (!_broadcast_info->write_to_file (sf)) { error << string_compose (_("cannot set broadcast info for audio file %1 (%2); dropping broadcast info for this file"), - _path, _broadcast_info->get_error()) + path_to_open, _broadcast_info->get_error()) << endmsg; _flags = Flag (_flags & ~Broadcast); delete _broadcast_info; @@ -596,6 +606,30 @@ SndFileSource::flush_header () return r; } +void +SndFileSource::flush () +{ + if (!_open) { + warning << string_compose (_("attempt to flush an un-opened audio file source (%1)"), _path) << endmsg; + return; + } + + if (!writable()) { + warning << string_compose (_("attempt to flush a non-writable audio file source (%1)"), _path) << endmsg; + return; + } + + SNDFILE* sf = _descriptor->allocate (); + if (sf == 0) { + error << string_compose (_("could not allocate file %1 to flush contents"), _path) << endmsg; + return; + } + + // Hopefully everything OK + sf_write_sync (sf); + _descriptor->release (); +} + int SndFileSource::setup_broadcast_info (framepos_t /*when*/, struct tm& now, time_t /*tnow*/) { @@ -823,12 +857,12 @@ SndFileSource::crossfade (Sample* data, framecnt_t cnt, int fade_in) } else if (xfade < xfade_frames) { - gain_t in[xfade]; - gain_t out[xfade]; + std::vector<gain_t> in(xfade); + std::vector<gain_t> out(xfade); /* short xfade, compute custom curve */ - compute_equal_power_fades (xfade, in, out); + compute_equal_power_fades (xfade, &in[0], &out[0]); for (framecnt_t n = 0; n < xfade; ++n) { xfade_buf[n] = (xfade_buf[n] * out[n]) + (fade_data[n] * in[n]); diff --git a/libs/ardour/soundcloud_upload.cc b/libs/ardour/soundcloud_upload.cc new file mode 100644 index 0000000000..da887d49f5 --- /dev/null +++ b/libs/ardour/soundcloud_upload.cc @@ -0,0 +1,355 @@ +/* soundcloud_export.cpp ********************************************************************** + + Adapted for Ardour by Ben Loftis, March 2012 + + Licence GPL: + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +*************************************************************************************/ +#include "ardour/debug.h" +#include "ardour/soundcloud_upload.h" + +#include "pbd/xml++.h" +#include <pbd/error.h> + +#include <sys/stat.h> +#include <sys/types.h> +#include <iostream> +#include <glib/gstdio.h> + +#include "i18n.h" + +using namespace PBD; + +size_t +WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data) +{ + register int realsize = (int)(size * nmemb); + struct MemoryStruct *mem = (struct MemoryStruct *)data; + + mem->memory = (char *)realloc(mem->memory, mem->size + realsize + 1); + + if (mem->memory) { + memcpy(&(mem->memory[mem->size]), ptr, realsize); + mem->size += realsize; + mem->memory[mem->size] = 0; + } + return realsize; +} + +SoundcloudUploader::SoundcloudUploader() +{ + curl_handle = curl_easy_init(); + multi_handle = curl_multi_init(); +} + +std::string +SoundcloudUploader::Get_Auth_Token( std::string username, std::string password ) +{ + struct MemoryStruct xml_page; + xml_page.memory = NULL; + xml_page.size = 0; + + setcUrlOptions(); + + curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); + curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *) &xml_page); + + struct curl_httppost *formpost=NULL; + struct curl_httppost *lastptr=NULL; + + /* Fill in the filename field */ + curl_formadd(&formpost, + &lastptr, + CURLFORM_COPYNAME, "client_id", + CURLFORM_COPYCONTENTS, "6dd9cf0ad281aa57e07745082cec580b", + CURLFORM_END); + + curl_formadd(&formpost, + &lastptr, + CURLFORM_COPYNAME, "client_secret", + CURLFORM_COPYCONTENTS, "53f5b0113fb338800f8a7a9904fc3569", + CURLFORM_END); + + curl_formadd(&formpost, + &lastptr, + CURLFORM_COPYNAME, "grant_type", + CURLFORM_COPYCONTENTS, "password", + CURLFORM_END); + + curl_formadd(&formpost, + &lastptr, + CURLFORM_COPYNAME, "username", + CURLFORM_COPYCONTENTS, username.c_str(), + CURLFORM_END); + + curl_formadd(&formpost, + &lastptr, + CURLFORM_COPYNAME, "password", + CURLFORM_COPYCONTENTS, password.c_str(), + CURLFORM_END); + + struct curl_slist *headerlist=NULL; + headerlist = curl_slist_append(headerlist, "Expect:"); + headerlist = curl_slist_append(headerlist, "Accept: application/xml"); + curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, headerlist); + + /* what URL that receives this POST */ + std::string url = "https://api.soundcloud.com/oauth2/token"; + curl_easy_setopt(curl_handle, CURLOPT_URL, url.c_str()); + curl_easy_setopt(curl_handle, CURLOPT_HTTPPOST, formpost); + + // curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1L); + + // perform online request + CURLcode res = curl_easy_perform(curl_handle); + if (res != 0) { + DEBUG_TRACE (DEBUG::Soundcloud, string_compose ("curl error %1 (%2)", res, curl_easy_strerror(res) ) ); + return ""; + } + + if (xml_page.memory){ + // cheesy way to parse the json return value. find access_token, then advance 3 quotes + + if ( strstr ( xml_page.memory , "access_token" ) == NULL) { + error << _("Upload to Soundcloud failed. Perhaps your email or password are incorrect?\n") << endmsg; + return ""; + } + + std::string token = strtok( xml_page.memory, "access_token" ); + token = strtok( NULL, "\"" ); + token = strtok( NULL, "\"" ); + token = strtok( NULL, "\"" ); + + free( xml_page.memory ); + return token; + } + + return ""; +} + +int +SoundcloudUploader::progress_callback(void *caller, double dltotal, double dlnow, double ultotal, double ulnow) +{ + SoundcloudUploader *scu = (SoundcloudUploader *) caller; + DEBUG_TRACE (DEBUG::Soundcloud, string_compose ("%1: uploaded %2 of %3", scu->title, ulnow, ultotal) ); + scu->caller->SoundcloudProgress(ultotal, ulnow, scu->title); /* EMIT SIGNAL */ + return 0; +} + + +std::string +SoundcloudUploader::Upload(std::string file_path, std::string title, std::string token, bool ispublic, bool downloadable, ARDOUR::ExportHandler *caller) +{ + int still_running; + + struct MemoryStruct xml_page; + xml_page.memory = NULL; + xml_page.size = 0; + + setcUrlOptions(); + + curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); + curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *) &xml_page); + + struct curl_httppost *formpost=NULL; + struct curl_httppost *lastptr=NULL; + + /* Fill in the file upload field. This makes libcurl load data from + the given file name when curl_easy_perform() is called. */ + curl_formadd(&formpost, + &lastptr, + CURLFORM_COPYNAME, "track[asset_data]", + CURLFORM_FILE, file_path.c_str(), + CURLFORM_END); + + /* Fill in the filename field */ + curl_formadd(&formpost, + &lastptr, + CURLFORM_COPYNAME, "oauth_token", + CURLFORM_COPYCONTENTS, token.c_str(), + CURLFORM_END); + + curl_formadd(&formpost, + &lastptr, + CURLFORM_COPYNAME, "track[title]", + CURLFORM_COPYCONTENTS, title.c_str(), + CURLFORM_END); + + curl_formadd(&formpost, + &lastptr, + CURLFORM_COPYNAME, "track[sharing]", + CURLFORM_COPYCONTENTS, ispublic ? "public" : "private", + CURLFORM_END); + + curl_formadd(&formpost, + &lastptr, + CURLFORM_COPYNAME, "track[downloadable]", + CURLFORM_COPYCONTENTS, downloadable ? "true" : "false", + CURLFORM_END); + + + + /* initalize custom header list (stating that Expect: 100-continue is not + wanted */ + struct curl_slist *headerlist=NULL; + static const char buf[] = "Expect:"; + headerlist = curl_slist_append(headerlist, buf); + + + if (curl_handle && multi_handle) { + + /* what URL that receives this POST */ + std::string url = "https://api.soundcloud.com/tracks"; + curl_easy_setopt(curl_handle, CURLOPT_URL, url.c_str()); + // curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1L); + + curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, headerlist); + curl_easy_setopt(curl_handle, CURLOPT_HTTPPOST, formpost); + + this->title = title; // save title to show in progress bar + this->caller = caller; + + curl_easy_setopt (curl_handle, CURLOPT_NOPROGRESS, 0); // turn on the progress bar + curl_easy_setopt (curl_handle, CURLOPT_PROGRESSFUNCTION, &SoundcloudUploader::progress_callback); + curl_easy_setopt (curl_handle, CURLOPT_PROGRESSDATA, this); + + curl_multi_add_handle(multi_handle, curl_handle); + + curl_multi_perform(multi_handle, &still_running); + + + while(still_running) { + struct timeval timeout; + int rc; /* select() return code */ + + fd_set fdread; + fd_set fdwrite; + fd_set fdexcep; + int maxfd = -1; + + long curl_timeo = -1; + + FD_ZERO(&fdread); + FD_ZERO(&fdwrite); + FD_ZERO(&fdexcep); + + /* set a suitable timeout to play around with */ + timeout.tv_sec = 1; + timeout.tv_usec = 0; + + curl_multi_timeout(multi_handle, &curl_timeo); + if(curl_timeo >= 0) { + timeout.tv_sec = curl_timeo / 1000; + if(timeout.tv_sec > 1) + timeout.tv_sec = 1; + else + timeout.tv_usec = (curl_timeo % 1000) * 1000; + } + + /* get file descriptors from the transfers */ + curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); + + /* In a real-world program you OF COURSE check the return code of the + function calls. On success, the value of maxfd is guaranteed to be + greater or equal than -1. We call select(maxfd + 1, ...), specially in + case of (maxfd == -1), we call select(0, ...), which is basically equal + to sleep. */ + + rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); + + switch(rc) { + case -1: + /* select error */ + break; + case 0: + default: + /* timeout or readable/writable sockets */ + curl_multi_perform(multi_handle, &still_running); + break; + } + } + + /* then cleanup the formpost chain */ + curl_formfree(formpost); + + /* free slist */ + curl_slist_free_all (headerlist); + } + + curl_easy_setopt (curl_handle, CURLOPT_NOPROGRESS, 1); // turn off the progress bar + + if(xml_page.memory){ + + DEBUG_TRACE (DEBUG::Soundcloud, xml_page.memory); + + XMLTree doc; + doc.read_buffer( xml_page.memory ); + XMLNode *root = doc.root(); + + if (!root) { + DEBUG_TRACE (DEBUG::Soundcloud, "no root XML node!"); + return ""; + } + + XMLNode *url_node = root->child("permalink-url"); + if (!url_node) { + DEBUG_TRACE (DEBUG::Soundcloud, "no child node \"permalink-url\" found!"); + return ""; + } + + XMLNode *text_node = url_node->child("text"); + if (!text_node) { + DEBUG_TRACE (DEBUG::Soundcloud, "no text node found!"); + return ""; + } + + free( xml_page.memory ); + return text_node->content(); + } + + return ""; +}; + + +SoundcloudUploader:: ~SoundcloudUploader() +{ + curl_easy_cleanup(curl_handle); + curl_multi_cleanup(multi_handle); +} + + +void +SoundcloudUploader::setcUrlOptions() +{ + // basic init for curl + curl_global_init(CURL_GLOBAL_ALL); + // some servers don't like requests that are made without a user-agent field, so we provide one + curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0"); + // setup curl error buffer + curl_easy_setopt(curl_handle, CURLOPT_ERRORBUFFER, errorBuffer); + // Allow redirection + curl_easy_setopt(curl_handle, CURLOPT_FOLLOWLOCATION, 1); + + // Allow connections to time out (without using signals) + curl_easy_setopt(curl_handle, CURLOPT_NOSIGNAL, 1); + curl_easy_setopt(curl_handle, CURLOPT_CONNECTTIMEOUT, 30); + + curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYHOST, 0); + curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYPEER, 0); +} + 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 <sys/stat.h> #include <unistd.h> -#include <fcntl.h> -#include <poll.h> #include <float.h> #include <cerrno> #include <ctime> diff --git a/libs/ardour/sse_functions_xmm.cc b/libs/ardour/sse_functions_xmm.cc index 48212ea8e1..f8a53cc6f8 100644 --- a/libs/ardour/sse_functions_xmm.cc +++ b/libs/ardour/sse_functions_xmm.cc @@ -45,8 +45,11 @@ x86_sse_find_peaks(const ARDOUR::Sample* buf, ARDOUR::pframes_t nframes, float * // use 64 byte prefetch for quadruple quads while (nframes >= 16) { +#ifdef COMPILER_MSVC + _mm_prefetch(((char*)buf+64), 0); // A total guess! Assumed to be eqivalent to +#else // the line below but waiting to be tested !! __builtin_prefetch(buf+64,0,0); - +#endif work = _mm_load_ps(buf); current_min = _mm_min_ps(current_min, work); current_max = _mm_max_ps(current_max, work); diff --git a/libs/ardour/system_exec.cc b/libs/ardour/system_exec.cc new file mode 100644 index 0000000000..456f8351f2 --- /dev/null +++ b/libs/ardour/system_exec.cc @@ -0,0 +1,77 @@ +/* + Copyright (C) 2010 Paul Davis + Copyright (C) 2010-2014 Robin Gareus <robin@gareus.org> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include <glibmm/miscutils.h> +#include "pbd/file_utils.h" +#include "pbd/error.h" + +#include "ardour/filesystem_paths.h" +#include "ardour/system_exec.h" + +using namespace ARDOUR; + +char * SystemExec::_vfork_exec_wrapper = NULL; + +static char *vfork_exec_wrapper_path() { +#ifdef PLATFORM_WINDOWS + return NULL; +#else + std::string vfork_exec_wrapper; + if (!PBD::find_file ( + PBD::Searchpath(Glib::build_filename(ARDOUR::ardour_dll_directory(), "vfork")), + "ardour-exec-wrapper", vfork_exec_wrapper)) { + PBD::warning << "vfork exec wrapper not found..'" << endmsg; + return NULL; + } + return strdup(vfork_exec_wrapper.c_str()); +#endif +} + +SystemExec::SystemExec (std::string c, char ** a) + : PBD::SystemExec(c, a) +{ +#ifndef PLATFORM_WINDOWS + if (!_vfork_exec_wrapper) { + _vfork_exec_wrapper = vfork_exec_wrapper_path(); + } +#endif +} + +SystemExec::SystemExec (std::string c, std::string a) + : PBD::SystemExec(c, a) +{ +#ifndef PLATFORM_WINDOWS + if (!_vfork_exec_wrapper) { + _vfork_exec_wrapper = vfork_exec_wrapper_path(); + } +#endif +} + +SystemExec::SystemExec (std::string c, const std::map<char, std::string> subs) + : PBD::SystemExec(c, subs) +{ +#ifndef PLATFORM_WINDOWS + if (!_vfork_exec_wrapper) { + _vfork_exec_wrapper = vfork_exec_wrapper_path(); + } +#endif +} + +SystemExec::~SystemExec() { } diff --git a/libs/ardour/template_utils.cc b/libs/ardour/template_utils.cc index 05007b0ade..f5a4dc78a6 100644 --- a/libs/ardour/template_utils.cc +++ b/libs/ardour/template_utils.cc @@ -23,13 +23,15 @@ #include <glibmm.h> #include "pbd/basename.h" -#include "pbd/pathscanner.h" +#include "pbd/file_utils.h" +#include "pbd/stl_delete.h" #include "pbd/xml++.h" #include "ardour/template_utils.h" #include "ardour/directory_names.h" #include "ardour/filesystem_paths.h" #include "ardour/filename_extensions.h" +#include "ardour/search_paths.h" #include "ardour/io.h" using namespace std; @@ -37,22 +39,6 @@ using namespace PBD; namespace ARDOUR { -SearchPath -template_search_path () -{ - SearchPath spath (ardour_data_search_path()); - spath.add_subdirectory_to_paths(templates_dir_name); - return spath; -} - -SearchPath -route_template_search_path () -{ - SearchPath spath (ardour_data_search_path()); - spath.add_subdirectory_to_paths(route_templates_dir_name); - return spath; -} - std::string user_template_directory () { @@ -66,7 +52,7 @@ user_route_template_directory () } static bool -template_filter (const string &str, void */*arg*/) +template_filter (const string &str, void* /*arg*/) { if (!Glib::file_test (str, Glib::FILE_TEST_IS_DIR)) { return false; @@ -76,7 +62,7 @@ template_filter (const string &str, void */*arg*/) } static bool -route_template_filter (const string &str, void */*arg*/) +route_template_filter (const string &str, void* /*arg*/) { if (str.find (template_suffix) == str.length() - strlen (template_suffix)) { return true; @@ -95,21 +81,19 @@ session_template_dir_to_file (string const & dir) void find_session_templates (vector<TemplateInfo>& template_names) { - vector<string *> *templates; - PathScanner scanner; - SearchPath spath (template_search_path()); + vector<string> templates; - templates = scanner (spath.to_string(), template_filter, 0, true, true); + find_files_matching_filter (templates, template_search_path(), template_filter, 0, true, true); - if (!templates) { - cerr << "Found nothing along " << spath.to_string() << endl; + if (templates.empty()) { + cerr << "Found nothing along " << template_search_path().to_string() << endl; return; } - cerr << "Found " << templates->size() << " along " << spath.to_string() << endl; + cerr << "Found " << templates.size() << " along " << template_search_path().to_string() << endl; - for (vector<string*>::iterator i = templates->begin(); i != templates->end(); ++i) { - string file = session_template_dir_to_file (**i); + for (vector<string>::iterator i = templates.begin(); i != templates.end(); ++i) { + string file = session_template_dir_to_file (*i); XMLTree tree; @@ -119,30 +103,26 @@ find_session_templates (vector<TemplateInfo>& template_names) TemplateInfo rti; - rti.name = basename_nosuffix (**i); - rti.path = **i; + rti.name = basename_nosuffix (*i); + rti.path = *i; template_names.push_back (rti); } - - delete templates; } void find_route_templates (vector<TemplateInfo>& template_names) { - vector<string *> *templates; - PathScanner scanner; - SearchPath spath (route_template_search_path()); + vector<string> templates; - templates = scanner (spath.to_string(), route_template_filter, 0, false, true); + find_files_matching_filter (templates, route_template_search_path(), route_template_filter, 0, false, true); - if (!templates) { + if (templates.empty()) { return; } - for (vector<string*>::iterator i = templates->begin(); i != templates->end(); ++i) { - string fullpath = *(*i); + for (vector<string>::iterator i = templates.begin(); i != templates.end(); ++i) { + string fullpath = *i; XMLTree tree; @@ -159,8 +139,6 @@ find_route_templates (vector<TemplateInfo>& template_names) template_names.push_back (rti); } - - delete templates; } } diff --git a/libs/ardour/test/audio_engine_test.cc b/libs/ardour/test/audio_engine_test.cc new file mode 100644 index 0000000000..0bed81f8a6 --- /dev/null +++ b/libs/ardour/test/audio_engine_test.cc @@ -0,0 +1,53 @@ +#include <iostream> + +#include "ardour/audioengine.h" +#include "ardour/audio_backend.h" +#include "ardour/search_paths.h" + +#include "audio_engine_test.h" +#include "test_common.h" + +CPPUNIT_TEST_SUITE_REGISTRATION (AudioEngineTest); + +using namespace std; +using namespace ARDOUR; +using namespace PBD; + +void +print_audio_backend_info (AudioBackendInfo const* abi) +{ + cerr << "Audio Backend, name:" << abi->name << endl; +} + +void +AudioEngineTest::test_backends () +{ + AudioEngine* engine = AudioEngine::create (); + + CPPUNIT_ASSERT (engine); + + std::vector<AudioBackendInfo const *> backends = engine->available_backends (); + + CPPUNIT_ASSERT (backends.size () != 0); + + for (std::vector<AudioBackendInfo const *>::const_iterator i = backends.begin(); + i != backends.end(); ++i) { + print_audio_backend_info(*i); + } +} + +void +AudioEngineTest::test_start () +{ + AudioEngine* engine = AudioEngine::create (); + + CPPUNIT_ASSERT_NO_THROW (engine->set_default_backend ()); + + init_post_engine (); + + CPPUNIT_ASSERT (engine->start () == 0); + + // sleep + // stop + // destroy +} diff --git a/libs/ardour/test/audio_engine_test.h b/libs/ardour/test/audio_engine_test.h new file mode 100644 index 0000000000..9a6d9cc241 --- /dev/null +++ b/libs/ardour/test/audio_engine_test.h @@ -0,0 +1,14 @@ +#include <cppunit/TestFixture.h> +#include <cppunit/extensions/HelperMacros.h> + +class AudioEngineTest : public CppUnit::TestFixture +{ + CPPUNIT_TEST_SUITE (AudioEngineTest); + CPPUNIT_TEST (test_backends); + CPPUNIT_TEST (test_start); + CPPUNIT_TEST_SUITE_END (); + +public: + void test_backends (); + void test_start (); +}; diff --git a/libs/ardour/test/jack_utils_test.cc b/libs/ardour/test/jack_utils_test.cc new file mode 100644 index 0000000000..7645df6ff3 --- /dev/null +++ b/libs/ardour/test/jack_utils_test.cc @@ -0,0 +1,290 @@ + +#include <stdexcept> + +#ifdef PLATFORM_WINDOWS +#include <windows.h> // only for Sleep +#endif + +#include <glibmm/miscutils.h> + +#include "ardour/jack_utils.h" + +#include "jack_utils_test.h" + +CPPUNIT_TEST_SUITE_REGISTRATION (JackUtilsTest); + +using namespace std; +using namespace ARDOUR; + +void +JackUtilsTest::test_driver_names () +{ + vector<string> driver_names; + + get_jack_audio_driver_names (driver_names); + + CPPUNIT_ASSERT(!driver_names.empty()); + + cout << endl; + cout << "Number of possible JACK Audio drivers found on this system: " << driver_names.size () << endl; + + for (vector<string>::const_iterator i = driver_names.begin(); i != driver_names.end(); ++i) { + cout << "JACK Audio driver found: " << *i << endl; + } + + string default_audio_driver; + get_jack_default_audio_driver_name (default_audio_driver); + + cout << "The default audio driver on this system is: " << default_audio_driver << endl; + + driver_names.clear(); + + get_jack_midi_system_names (default_audio_driver, driver_names); + + CPPUNIT_ASSERT(!driver_names.empty()); + + cout << "Number of possible JACK MIDI drivers found on this system for default audio driver: " << driver_names.size () << endl; + + for (vector<string>::const_iterator i = driver_names.begin(); i != driver_names.end(); ++i) { + cout << "JACK MIDI driver found: " << *i << endl; + } + + string default_midi_driver; + get_jack_default_midi_system_name (default_audio_driver, default_midi_driver); + + cout << "The default midi driver on this system is: " << default_midi_driver << endl; +} + +string +devices_string (const vector<string>& devices) +{ + std::string str; + for (vector<string>::const_iterator i = devices.begin(); i != devices.end();) { + str += *i; + if (++i != devices.end()) str += ", "; + } + return str; +} + +void +JackUtilsTest::test_device_names () +{ + vector<string> driver_names; + + get_jack_audio_driver_names (driver_names); + + CPPUNIT_ASSERT(!driver_names.empty()); + + cout << endl; + + for (vector<string>::const_iterator i = driver_names.begin(); i != driver_names.end(); ++i) { + string devices = devices_string (get_jack_device_names_for_audio_driver (*i)); + cout << "JACK Audio driver found: " << *i << " with devices: " << devices << endl; + } +} + +void +JackUtilsTest::test_samplerates () +{ + vector<string> samplerates; + + get_jack_sample_rate_strings (samplerates); + cout << endl; + cout << "Number of possible Samplerates supported by JACK: " << samplerates.size () << endl; + + for (vector<string>::const_iterator i = samplerates.begin(); i != samplerates.end(); ++i) { + cout << "Samplerate: " << *i << endl; + } +} + +void +JackUtilsTest::test_period_sizes () +{ + vector<string> period_sizes; + + get_jack_period_size_strings (period_sizes); + cout << endl; + cout << "Number of possible Period sizes supported by JACK: " << period_sizes.size () << endl; + + for (vector<string>::const_iterator i = period_sizes.begin(); i != period_sizes.end(); ++i) { + cout << "Period size: " << *i << endl; + } +} + +void +JackUtilsTest::test_dither_modes () +{ + vector<string> driver_names; + + get_jack_audio_driver_names (driver_names); + + CPPUNIT_ASSERT(!driver_names.empty()); + + cout << endl; + + for (vector<string>::const_iterator i = driver_names.begin(); i != driver_names.end(); ++i) { + vector<string> dither_modes; + + get_jack_dither_mode_strings (*i, dither_modes); + cout << "Number of possible Dither Modes supported by JACK driver " << *i << + ": " << dither_modes.size () << endl; + for (vector<string>::const_iterator j = dither_modes.begin(); j != dither_modes.end(); ++j) { + cout << "Dither Mode: " << *j << endl; + } + cout << endl; + } + +} + +void +JackUtilsTest::test_connect_server () +{ + cout << endl; + if (jack_server_running ()) { + cout << "Jack server running " << endl; + } else { + cout << "Jack server not running " << endl; + } +} + +void +JackUtilsTest::test_set_jack_path_env () +{ + cout << endl; + + bool path_env_set = false; + + string path_env = Glib::getenv ("PATH", path_env_set); + + if (path_env_set) { + cout << "PATH env set to: " << path_env << endl; + } else { + cout << "PATH env not set" << endl; + } + vector<string> server_dirs; + get_jack_server_dir_paths (server_dirs); + set_path_env_for_jack_autostart (server_dirs); + + path_env_set = false; + + path_env = Glib::getenv ("PATH", path_env_set); + + CPPUNIT_ASSERT (path_env_set); + + cout << "After set_jack_path_env PATH env set to: " << path_env << endl; +} + +void +JackUtilsTest::test_server_paths () +{ + cout << endl; + + vector<std::string> server_dirs; + + CPPUNIT_ASSERT (get_jack_server_dir_paths (server_dirs)); + + cout << "Number of Directories that may contain JACK servers: " << server_dirs.size () << endl; + + for (vector<std::string>::const_iterator i = server_dirs.begin(); i != server_dirs.end(); ++i) { + cout << "JACK server directory path: " << *i << endl; + } + + vector<string> server_names; + + CPPUNIT_ASSERT (get_jack_server_application_names (server_names)); + + cout << "Number of possible JACK server names on this system: " << server_names.size () << endl; + + for (vector<string>::const_iterator i = server_names.begin(); i != server_names.end(); ++i) { + cout << "JACK server name: " << *i << endl; + } + + vector<std::string> server_paths; + + CPPUNIT_ASSERT (get_jack_server_paths (server_dirs, server_names, server_paths)); + + cout << "Number of JACK servers on this system: " << server_paths.size () << endl; + + for (vector<std::string>::const_iterator i = server_paths.begin(); i != server_paths.end(); ++i) { + cout << "JACK server path: " << *i << endl; + } + + vector<std::string> server_paths2; + + CPPUNIT_ASSERT (get_jack_server_paths (server_paths2)); + + CPPUNIT_ASSERT (server_paths.size () == server_paths2.size ()); + + std::string default_server_path; + + CPPUNIT_ASSERT (get_jack_default_server_path (default_server_path)); + + cout << "The default JACK server on this system: " << default_server_path << endl; +} + +bool +get_default_jack_command_line (std::string& command_line) +{ + cout << endl; + + JackCommandLineOptions options; + + CPPUNIT_ASSERT (get_jack_default_server_path (options.server_path)); + + get_jack_default_audio_driver_name (options.driver); + + + // should fail, haven't set any device yet + CPPUNIT_ASSERT (!get_jack_command_line_string (options, command_line)); + + vector<string> devices = get_jack_device_names_for_audio_driver (options.driver); + + if (!devices.empty()) { + options.input_device = devices.front (); + options.output_device = devices.front (); + } else { + cout << "No audio devices available using default JACK driver using Dummy driver" << endl; + options.driver = dummy_driver_name; + devices = get_jack_device_names_for_audio_driver (options.driver); + CPPUNIT_ASSERT (!devices.empty ()); + options.input_device = devices.front (); + options.output_device = devices.front (); + } + + options.input_device = devices.front (); + options.output_device = devices.front (); + + string midi_driver; + + get_jack_default_midi_system_name (options.driver, options.midi_driver); + // + // this at least should create a valid jack command line + return get_jack_command_line_string (options, command_line); + +} + +void +JackUtilsTest::test_config () +{ + std::string config_path(get_jack_server_user_config_file_path()); + + cout << "Jack server config file path: " << config_path << endl; + + std::string command_line; + + CPPUNIT_ASSERT (get_default_jack_command_line (command_line)); + + CPPUNIT_ASSERT (write_jack_config_file (config_path, command_line)); +} + + +void +JackUtilsTest::test_command_line () +{ + string command_line; + + // this at least should create a valid jack command line + CPPUNIT_ASSERT (get_default_jack_command_line (command_line)); + + cout << "Default JACK command line: " << command_line << endl; +} diff --git a/libs/ardour/test/jack_utils_test.h b/libs/ardour/test/jack_utils_test.h new file mode 100644 index 0000000000..08fad2fc36 --- /dev/null +++ b/libs/ardour/test/jack_utils_test.h @@ -0,0 +1,31 @@ + +#include <cppunit/TestFixture.h> +#include <cppunit/extensions/HelperMacros.h> + +class JackUtilsTest : public CppUnit::TestFixture +{ + CPPUNIT_TEST_SUITE (JackUtilsTest); + CPPUNIT_TEST (test_driver_names); + CPPUNIT_TEST (test_device_names); + CPPUNIT_TEST (test_samplerates); + CPPUNIT_TEST (test_period_sizes); + CPPUNIT_TEST (test_dither_modes); + CPPUNIT_TEST (test_connect_server); + CPPUNIT_TEST (test_set_jack_path_env); + CPPUNIT_TEST (test_server_paths); + CPPUNIT_TEST (test_config); + CPPUNIT_TEST (test_command_line); + CPPUNIT_TEST_SUITE_END (); + +public: + void test_driver_names (); + void test_device_names (); + void test_samplerates (); + void test_period_sizes (); + void test_dither_modes (); + void test_connect_server (); + void test_set_jack_path_env (); + void test_server_paths (); + void test_config (); + void test_command_line (); +}; diff --git a/libs/ardour/test/midi_clock_slave_test.cc b/libs/ardour/test/midi_clock_slave_test.cc index dcb159cb2c..4349df22eb 100644 --- a/libs/ardour/test/midi_clock_slave_test.cc +++ b/libs/ardour/test/midi_clock_slave_test.cc @@ -27,7 +27,7 @@ MIDIClock_SlaveTest::testStepResponse () for (framecnt_t i = 1; i<= 100 * period_size; i++) { // simulate jitter - framecnt_t input_delta = framecnt_t (one_ppqn_in_frames + 0.1 * (double(random()) / double (RAND_MAX)) * one_ppqn_in_frames); + framecnt_t input_delta = framecnt_t (one_ppqn_in_frames + 0.1 * (double(g_random_int()) / double (RAND_MAX)) * one_ppqn_in_frames); if (i % input_delta == 0) { update_midi_clock (*parser, start_time + i); diff --git a/libs/ardour/test/plugins_test.cc b/libs/ardour/test/plugins_test.cc new file mode 100644 index 0000000000..c769bdaac0 --- /dev/null +++ b/libs/ardour/test/plugins_test.cc @@ -0,0 +1,54 @@ +#include <iostream> + +#include "ardour/plugin_manager.h" +#include "ardour/search_paths.h" + +#include "plugins_test.h" +#include "test_common.h" + +CPPUNIT_TEST_SUITE_REGISTRATION (PluginsTest); + +using namespace std; +using namespace ARDOUR; +using namespace PBD; + +void +print_plugin_info (PluginInfoPtr pp) +{ + cout << "LADSPA Plugin, name " << pp->name + << ", category " << pp->category + << ", creator " << pp->creator + << ", path " << pp->path + << ", n_inputs " << pp->n_inputs.n_audio () + << ", n_outputs " << pp->n_outputs.n_audio () + << endl; + +} + +void +PluginsTest::test () +{ + PluginManager& pm = PluginManager::instance (); + + pm.refresh (); + + Searchpath ladspa_paths(ladspa_search_path ()); + + cout << "Number of Ladspa paths found: " << ladspa_paths.size () << endl; + + for (vector<std::string>::iterator i = ladspa_paths.begin (); i != ladspa_paths.end(); ++i) + { + cout << "LADSPA search path includes: " << *i << endl; + } + + PluginInfoList& ladspa_list = pm.ladspa_plugin_info (); + + cout << "Number of Ladspa plugins found: " << ladspa_list.size () << endl; + + for (PluginInfoList::iterator i = ladspa_list.begin (); i != ladspa_list.end(); ++i) + { + print_plugin_info (*i); + } + + +} diff --git a/libs/ardour/test/plugins_test.h b/libs/ardour/test/plugins_test.h new file mode 100644 index 0000000000..1503b2bde2 --- /dev/null +++ b/libs/ardour/test/plugins_test.h @@ -0,0 +1,12 @@ +#include <cppunit/TestFixture.h> +#include <cppunit/extensions/HelperMacros.h> + +class PluginsTest : public CppUnit::TestFixture +{ + CPPUNIT_TEST_SUITE (PluginsTest); + CPPUNIT_TEST (test); + CPPUNIT_TEST_SUITE_END (); + +public: + void test (); +}; diff --git a/libs/ardour/test/resampled_source_test.cc b/libs/ardour/test/resampled_source_test.cc index 5aaf71b7aa..9aa8989992 100644 --- a/libs/ardour/test/resampled_source_test.cc +++ b/libs/ardour/test/resampled_source_test.cc @@ -1,4 +1,4 @@ -// this is included first to avoid SearchPath definition on windows +// this is included first to avoid Searchpath definition on windows #include "test_common.h" #include "pbd/file_utils.h" @@ -19,7 +19,7 @@ ResampledSourceTest::seekTest () 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)); + CPPUNIT_ASSERT (find_file (test_search_path (), test_filename, test_file_path)); boost::shared_ptr<SndFileImportableSource> s (new SndFileImportableSource (test_file_path)); ResampledImportableSource r (s, 48000, SrcBest); diff --git a/libs/ardour/test/test_common.cc b/libs/ardour/test/test_common.cc index 61f92972d1..71eba65bbb 100644 --- a/libs/ardour/test/test_common.cc +++ b/libs/ardour/test/test_common.cc @@ -25,10 +25,10 @@ using namespace std; -PBD::SearchPath +PBD::Searchpath test_search_path () { -#ifdef WIN32 +#ifdef PLATFORM_WINDOWS std::string wsp(g_win32_get_package_installation_directory_of_module(NULL)); return Glib::build_filename (wsp, "ardour_testdata"); #else diff --git a/libs/ardour/test/test_common.h b/libs/ardour/test/test_common.h index 91fd066ac2..bfda543508 100644 --- a/libs/ardour/test/test_common.h +++ b/libs/ardour/test/test_common.h @@ -21,7 +21,7 @@ #include "pbd/search_path.h" -PBD::SearchPath test_search_path (); +PBD::Searchpath test_search_path (); std::string new_test_output_dir (std::string prefix = ""); diff --git a/libs/ardour/thread_buffers.cc b/libs/ardour/thread_buffers.cc index e469187ce9..b51576bfc9 100644 --- a/libs/ardour/thread_buffers.cc +++ b/libs/ardour/thread_buffers.cc @@ -40,7 +40,7 @@ ThreadBuffers::ThreadBuffers () } void -ThreadBuffers::ensure_buffers (ChanCount howmany) +ThreadBuffers::ensure_buffers (ChanCount howmany, size_t custom) { // std::cerr << "ThreadBuffers " << this << " resize buffers with count = " << howmany << std::endl; @@ -60,7 +60,14 @@ ThreadBuffers::ensure_buffers (ChanCount howmany) for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) { size_t count = std::max (scratch_buffers->available().get(*t), howmany.get(*t)); - size_t size = _engine->raw_buffer_size (*t) / sizeof (Sample); + size_t size; + if (custom > 0) { + size = custom; + } else { + size = (*t == DataType::MIDI) + ? _engine->raw_buffer_size (*t) + : _engine->raw_buffer_size (*t) / sizeof (Sample); + } scratch_buffers->ensure_buffers (*t, count, size); mix_buffers->ensure_buffers (*t, count, size); @@ -68,7 +75,7 @@ ThreadBuffers::ensure_buffers (ChanCount howmany) route_buffers->ensure_buffers (*t, count, size); } - size_t audio_buffer_size = _engine->raw_buffer_size (DataType::AUDIO) / sizeof (Sample); + size_t audio_buffer_size = custom > 0 ? custom : _engine->raw_buffer_size (DataType::AUDIO) / sizeof (Sample); delete [] gain_automation_buffer; gain_automation_buffer = new gain_t[audio_buffer_size]; diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc index 5c95de0c41..d463be598f 100644 --- a/libs/ardour/track.cc +++ b/libs/ardour/track.cc @@ -68,8 +68,10 @@ Track::init () /* don't add rec_enable_control to controls because we don't want it to * appear as an automatable parameter */ + track_number_changed.connect_same_thread (*this, boost::bind (&Track::resync_track_name, this)); + _session.config.ParameterChanged.connect_same_thread (*this, boost::bind (&Track::parameter_changed, this, _1)); - return 0; + return 0; } void @@ -284,6 +286,28 @@ Track::set_record_enabled (bool yn, void *src) _rec_enable_control->Changed (); } +void +Track::parameter_changed (string const & p) +{ + if (p == "track-name-number") { + resync_track_name (); + } + else if (p == "track-name-take") { + resync_track_name (); + } + else if (p == "take-name") { + if (_session.config.get_track_name_take()) { + resync_track_name (); + } + } +} + +void +Track::resync_track_name () +{ + set_name(name()); +} + bool Track::set_name (const string& str) { @@ -294,6 +318,29 @@ Track::set_name (const string& str) return false; } + string diskstream_name = ""; + if (_session.config.get_track_name_take () && !_session.config.get_take_name ().empty()) { + // Note: any text is fine, legalize_for_path() fixes this later + diskstream_name += _session.config.get_take_name (); + diskstream_name += "_"; + } + const int64_t tracknumber = track_number(); + if (tracknumber > 0 && _session.config.get_track_name_number()) { + char num[64], fmt[10]; + snprintf(fmt, sizeof(fmt), "%%0%d" PRId64, _session.track_number_decimals()); + snprintf(num, sizeof(num), fmt, tracknumber); + diskstream_name += num; + diskstream_name += "_"; + } + diskstream_name += str; + + if (diskstream_name == _diskstream_name) { + return true; + } + _diskstream_name = diskstream_name; + + _diskstream->set_write_source_name (diskstream_name); + boost::shared_ptr<Track> me = boost::dynamic_pointer_cast<Track> (shared_from_this ()); if (_diskstream->playlist()->all_regions_empty () && _session.playlists->playlists_for_track (me).size() == 1) { /* Only rename the diskstream (and therefore the playlist) if diff --git a/libs/ardour/utils.cc b/libs/ardour/utils.cc index aa06912913..54943562cb 100644 --- a/libs/ardour/utils.cc +++ b/libs/ardour/utils.cc @@ -36,7 +36,9 @@ #include <sys/stat.h> #include <sys/time.h> #include <fcntl.h> +#ifndef COMPILER_MSVC #include <dirent.h> +#endif #include <errno.h> #include <regex.h> @@ -91,7 +93,7 @@ replace_chars (const string& str, const string& illegal_chars) * the goal there is to be legal across filesystems. */ string -legalize_for_path (const string& str) +ARDOUR::legalize_for_path (const string& str) { return replace_chars (str, "/\\"); } @@ -106,7 +108,7 @@ legalize_for_path (const string& str) * ANY filesystem. */ string -legalize_for_universal_path (const string& str) +ARDOUR::legalize_for_universal_path (const string& str) { return replace_chars (str, "<>:\"/\\|?*"); } @@ -117,7 +119,7 @@ legalize_for_universal_path (const string& str) * correct. */ string -legalize_for_uri (const string& str) +ARDOUR::legalize_for_uri (const string& str) { return replace_chars (str, "<>:\"/\\|?* #"); } @@ -131,7 +133,7 @@ legalize_for_uri (const string& str) */ string -legalize_for_path_2X (const string& str) +ARDOUR::legalize_for_path_2X (const string& str) { string::size_type pos; string legal_chars = "abcdefghijklmnopqrtsuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_+=: "; @@ -153,7 +155,7 @@ legalize_for_path_2X (const string& str) } string -bump_name_once (const std::string& name, char delimiter) +ARDOUR::bump_name_once (const std::string& name, char delimiter) { string::size_type delim; string newname; @@ -194,8 +196,34 @@ bump_name_once (const std::string& name, char delimiter) } +string +ARDOUR::bump_name_number (const std::string& name) +{ + size_t pos = name.length(); + size_t num = 0; + bool have_number = false; + while (pos > 0 && isdigit(name.at(--pos))) { + have_number = true; + num = pos; + } + + string newname; + if (have_number) { + int32_t seq = strtol (name.c_str() + num, (char **)NULL, 10); + char buf[32]; + snprintf (buf, sizeof(buf), "%d", seq + 1); + newname = name.substr (0, num); + newname += buf; + } else { + newname = name; + newname += "1"; + } + + return newname; +} + XMLNode * -find_named_node (const XMLNode& node, string name) +ARDOUR::find_named_node (const XMLNode& node, string name) { XMLNodeList nlist; XMLNodeConstIterator niter; @@ -216,7 +244,7 @@ find_named_node (const XMLNode& node, string name) } int -cmp_nocase (const string& s, const string& s2) +ARDOUR::cmp_nocase (const string& s, const string& s2) { string::const_iterator p = s.begin(); string::const_iterator p2 = s2.begin(); @@ -232,7 +260,8 @@ cmp_nocase (const string& s, const string& s2) return (s2.size() == s.size()) ? 0 : (s.size() < s2.size()) ? -1 : 1; } -int cmp_nocase_utf8 (const string& s1, const string& s2) +int +ARDOUR::cmp_nocase_utf8 (const string& s1, const string& s2) { const char *cstr1 = s1.c_str(); const char *cstr2 = s2.c_str(); @@ -268,7 +297,7 @@ int cmp_nocase_utf8 (const string& s1, const string& s2) } int -touch_file (string path) +ARDOUR::touch_file (string path) { int fd = open (path.c_str(), O_RDWR|O_CREAT, 0660); if (fd >= 0) { @@ -279,7 +308,7 @@ touch_file (string path) } string -region_name_from_path (string path, bool strip_channels, bool add_channel_suffix, uint32_t total, uint32_t this_one) +ARDOUR::region_name_from_path (string path, bool strip_channels, bool add_channel_suffix, uint32_t total, uint32_t this_one) { path = PBD::basename_nosuffix (path); @@ -311,7 +340,7 @@ region_name_from_path (string path, bool strip_channels, bool add_channel_suffix } bool -path_is_paired (string path, string& pair_base) +ARDOUR::path_is_paired (string path, string& pair_base) { string::size_type pos; @@ -344,7 +373,7 @@ path_is_paired (string path, string& pair_base) #if __APPLE__ string -CFStringRefToStdString(CFStringRef stringRef) +ARDOUR::CFStringRefToStdString(CFStringRef stringRef) { CFIndex size = CFStringGetMaximumSizeForEncoding(CFStringGetLength(stringRef) , @@ -362,7 +391,7 @@ CFStringRefToStdString(CFStringRef stringRef) #endif // __APPLE__ void -compute_equal_power_fades (framecnt_t nframes, float* in, float* out) +ARDOUR::compute_equal_power_fades (framecnt_t nframes, float* in, float* out) { double step; @@ -388,7 +417,7 @@ compute_equal_power_fades (framecnt_t nframes, float* in, float* out) } EditMode -string_to_edit_mode (string str) +ARDOUR::string_to_edit_mode (string str) { if (str == _("Splice")) { return Splice; @@ -403,7 +432,7 @@ string_to_edit_mode (string str) } const char* -edit_mode_to_string (EditMode mode) +ARDOUR::edit_mode_to_string (EditMode mode) { switch (mode) { case Slide: @@ -419,7 +448,7 @@ edit_mode_to_string (EditMode mode) } SyncSource -string_to_sync_source (string str) +ARDOUR::string_to_sync_source (string str) { if (str == _("MIDI Timecode") || str == _("MTC")) { return MTC; @@ -440,7 +469,7 @@ string_to_sync_source (string str) /** @param sh Return a short version of the string */ const char* -sync_source_to_string (SyncSource src, bool sh) +ARDOUR::sync_source_to_string (SyncSource src, bool sh) { switch (src) { case Engine: @@ -471,7 +500,7 @@ sync_source_to_string (SyncSource src, bool sh) } float -meter_falloff_to_float (MeterFalloff falloff) +ARDOUR::meter_falloff_to_float (MeterFalloff falloff) { switch (falloff) { case MeterFalloffOff: @@ -498,7 +527,7 @@ meter_falloff_to_float (MeterFalloff falloff) } MeterFalloff -meter_falloff_from_float (float val) +ARDOUR::meter_falloff_from_float (float val) { if (val == METER_FALLOFF_OFF) { return MeterFalloffOff; @@ -611,7 +640,7 @@ bool_as_string (bool yn) } const char* -native_header_format_extension (HeaderFormat hf, const DataType& type) +ARDOUR::native_header_format_extension (HeaderFormat hf, const DataType& type) { if (type == DataType::MIDI) { return ".mid"; @@ -640,7 +669,7 @@ native_header_format_extension (HeaderFormat hf, const DataType& type) } bool -matching_unsuffixed_filename_exists_in (const string& dir, const string& path) +ARDOUR::matching_unsuffixed_filename_exists_in (const string& dir, const string& path) { string bws = basename_nosuffix (path); struct dirent* dentry; @@ -685,7 +714,7 @@ matching_unsuffixed_filename_exists_in (const string& dir, const string& path) } uint32_t -how_many_dsp_threads () +ARDOUR::how_many_dsp_threads () { /* CALLER MUST HOLD PROCESS LOCK */ @@ -718,12 +747,14 @@ how_many_dsp_threads () return num_threads; } -double gain_to_slider_position_with_max (double g, double max_gain) +double +ARDOUR::gain_to_slider_position_with_max (double g, double max_gain) { return gain_to_slider_position (g * 2.0/max_gain); } -double slider_position_to_gain_with_max (double g, double max_gain) +double +ARDOUR::slider_position_to_gain_with_max (double g, double max_gain) { return slider_position_to_gain (g * max_gain/2.0); } diff --git a/libs/ardour/vst_info_file.cc b/libs/ardour/vst_info_file.cc new file mode 100644 index 0000000000..da49d1b8eb --- /dev/null +++ b/libs/ardour/vst_info_file.cc @@ -0,0 +1,1058 @@ +/* + Copyright (C) 2012-2014 Paul Davis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +/** @file libs/ardour/vst_info_file.cc + * @brief Code to manage info files containing cached information about a plugin. + * e.g. its name, creator etc. + */ + +#include <iostream> +#include <cassert> + +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#include <errno.h> + +#include <stdlib.h> +#include <stddef.h> +#include <stdio.h> +#include <string.h> + +#include <glib.h> +#include <glib/gstdio.h> +#include <glibmm.h> + +#include "pbd/error.h" + +#ifndef VST_SCANNER_APP +#include "ardour/plugin_manager.h" // scanner_bin_path +#include "ardour/rc_configuration.h" +#include "ardour/system_exec.h" +#endif + +#include "ardour/filesystem_paths.h" +#include "ardour/linux_vst_support.h" +#include "ardour/plugin_types.h" +#include "ardour/vst_info_file.h" + +#define MAX_STRING_LEN 256 +#define PLUGIN_SCAN_TIMEOUT (Config->get_vst_scan_timeout()) // in deciseconds + + +/* CACHE FILE PATHS */ +#define EXT_BLACKLIST ".fsb" +#define EXT_ERRORFILE ".err" +#define EXT_INFOFILE ".fsi" + +#ifdef PLATFORM_WINDOWS +#define PFX_DOTFILE "" +#else +#define PFX_DOTFILE "." +#endif + + +using namespace std; +#ifndef VST_SCANNER_APP +namespace ARDOUR { +#endif + +/* prototypes */ +#ifdef WINDOWS_VST_SUPPORT +#include <fst.h> +static bool +vstfx_instantiate_and_get_info_fst (const char* dllpath, vector<VSTInfo*> *infos, int uniqueID); +#endif + +#ifdef LXVST_SUPPORT +static bool vstfx_instantiate_and_get_info_lx (const char* dllpath, vector<VSTInfo*> *infos, int uniqueID); +#endif + +/* ID for shell plugins */ +static int vstfx_current_loading_id = 0; + + + +/* *** CACHE FILE PATHS *** */ + +static string +vstfx_cache_file (const char* dllpath, int personal, const char *ext) +{ + string dir; + if (personal) { + dir = get_personal_vst_blacklist_dir(); + } else { + dir = Glib::path_get_dirname (std::string(dllpath)); + } + + stringstream s; + s << PFX_DOTFILE << Glib::path_get_basename (dllpath) << ext; + return Glib::build_filename (dir, s.str ()); +} + +static string +vstfx_blacklist_path (const char* dllpath, int personal) +{ + return vstfx_cache_file(dllpath, personal, EXT_BLACKLIST); +} + +static string +vstfx_infofile_path (const char* dllpath, int personal) +{ + return vstfx_cache_file(dllpath, personal, EXT_INFOFILE); +} + +#ifndef VST_SCANNER_APP +static string +vstfx_errorfile_path (const char* dllpath, int personal) +{ + return vstfx_cache_file(dllpath, personal, EXT_ERRORFILE); +} +#endif + + +/* *** MEMORY MANAGEMENT *** */ + +/** cleanup single allocated VSTInfo */ +static void +vstfx_free_info (VSTInfo *info) +{ + for (int i = 0; i < info->numParams; i++) { + free (info->ParamNames[i]); + free (info->ParamLabels[i]); + } + + free (info->name); + free (info->creator); + free (info->Category); + free (info->ParamNames); + free (info->ParamLabels); + free (info); +} + +/** reset vector */ +static void +vstfx_clear_info_list (vector<VSTInfo *> *infos) +{ + for (vector<VSTInfo *>::iterator i = infos->begin(); i != infos->end(); ++i) { + vstfx_free_info(*i); + } + infos->clear(); +} + + + +/* *** CACHE FILE I/O *** */ + +/** Helper function to read a line from the cache file + * @return newly allocated string of NULL + */ +static char * +read_string (FILE *fp) +{ + char buf[MAX_STRING_LEN]; + + if (!fgets (buf, MAX_STRING_LEN, fp)) { + return 0; + } + + if (strlen(buf) < MAX_STRING_LEN) { + if (strlen (buf)) { + buf[strlen(buf)-1] = 0; + } + return strdup (buf); + } else { + return 0; + } +} + +/** Read an integer value from a line in fp into n, + * @return true on failure, false on success. + */ +static bool +read_int (FILE* fp, int* n) +{ + char buf[MAX_STRING_LEN]; + + char* p = fgets (buf, MAX_STRING_LEN, fp); + if (p == 0) { + return true; + } + + return (sscanf (p, "%d", n) != 1); +} + +/** parse a plugin-block from the cache info file */ +static bool +vstfx_load_info_block(FILE* fp, VSTInfo *info) +{ + if ((info->name = read_string(fp)) == 0) return false; + if ((info->creator = read_string(fp)) == 0) return false; + if (read_int (fp, &info->UniqueID)) return false; + if ((info->Category = read_string(fp)) == 0) return false; + if (read_int (fp, &info->numInputs)) return false; + if (read_int (fp, &info->numOutputs)) return false; + if (read_int (fp, &info->numParams)) return false; + if (read_int (fp, &info->wantMidi)) return false; + if (read_int (fp, &info->hasEditor)) return false; + if (read_int (fp, &info->canProcessReplacing)) return false; + + /* backwards compatibility with old .fsi files */ + if (info->wantMidi == -1) { + info->wantMidi = 1; + } + + if ((info->ParamNames = (char **) malloc(sizeof(char*)*info->numParams)) == 0) { + return false; + } + + for (int i = 0; i < info->numParams; ++i) { + if ((info->ParamNames[i] = read_string(fp)) == 0) return false; + } + + if ((info->ParamLabels = (char **) malloc(sizeof(char*)*info->numParams)) == 0) { + return false; + } + + for (int i = 0; i < info->numParams; ++i) { + if ((info->ParamLabels[i] = read_string(fp)) == 0) { + return false; + } + } + return true; +} + +/** parse all blocks in a cache info file */ +static bool +vstfx_load_info_file (FILE* fp, vector<VSTInfo*> *infos) +{ + VSTInfo *info; + if ((info = (VSTInfo*) calloc (1, sizeof (VSTInfo))) == 0) { + return false; + } + if (vstfx_load_info_block(fp, info)) { + if (strncmp (info->Category, "Shell", 5)) { + infos->push_back(info); + } else { + int plugin_cnt = 0; + vstfx_free_info(info); + if (!read_int (fp, &plugin_cnt)) { + for (int i = 0; i < plugin_cnt; i++) { + if ((info = (VSTInfo*) calloc (1, sizeof (VSTInfo))) == 0) { + vstfx_clear_info_list(infos); + return false; + } + if (vstfx_load_info_block(fp, info)) { + infos->push_back(info); + } else { + vstfx_free_info(info); + vstfx_clear_info_list(infos); + return false; + } + } + } else { + return false; /* Bad file */ + } + } + return true; + } + vstfx_free_info(info); + vstfx_clear_info_list(infos); + return false; +} + +static void +vstfx_write_info_block (FILE* fp, VSTInfo *info) +{ + assert (info); + assert (fp); + + fprintf (fp, "%s\n", info->name); + fprintf (fp, "%s\n", info->creator); + fprintf (fp, "%d\n", info->UniqueID); + fprintf (fp, "%s\n", info->Category); + fprintf (fp, "%d\n", info->numInputs); + fprintf (fp, "%d\n", info->numOutputs); + fprintf (fp, "%d\n", info->numParams); + fprintf (fp, "%d\n", info->wantMidi); + fprintf (fp, "%d\n", info->hasEditor); + fprintf (fp, "%d\n", info->canProcessReplacing); + + for (int i = 0; i < info->numParams; i++) { + fprintf (fp, "%s\n", info->ParamNames[i]); + } + + for (int i = 0; i < info->numParams; i++) { + fprintf (fp, "%s\n", info->ParamLabels[i]); + } +} + +static void +vstfx_write_info_file (FILE* fp, vector<VSTInfo *> *infos) +{ + assert(infos); + assert(fp); + + if (infos->size() > 1) { + vector<VSTInfo *>::iterator x = infos->begin(); + /* write out the shell info first along with count of the number of + * plugins contained in this shell + */ + vstfx_write_info_block(fp, *x); + fprintf( fp, "%d\n", (int)infos->size() - 1 ); + ++x; + /* Now write out the info for each plugin */ + for (; x != infos->end(); ++x) { + vstfx_write_info_block(fp, *x); + } + } else if (infos->size() == 1) { + vstfx_write_info_block(fp, infos->front()); + } else { + PBD::error << "Zero plugins in VST." << endmsg; // XXX here? rather make this impossible before if it ain't already. + } +} + + +/* *** CACHE AND BLACKLIST MANAGEMENT *** */ + +/* return true if plugin is blacklisted or has an invalid file extension */ +static bool +vstfx_blacklist_stat (const char *dllpath, int personal) +{ + if (strstr (dllpath, ".so" ) == 0 && strstr(dllpath, ".dll") == 0) { + return true; + } + string const path = vstfx_blacklist_path (dllpath, personal); + + if (Glib::file_test (path, Glib::FileTest (Glib::FILE_TEST_EXISTS | Glib::FILE_TEST_IS_REGULAR))) { + struct stat dllstat; + struct stat fsbstat; + + if (stat (dllpath, &dllstat) == 0 && stat (path.c_str(), &fsbstat) == 0) { + if (dllstat.st_mtime > fsbstat.st_mtime) { + /* plugin is newer than blacklist file */ + return true; + } + } + /* stat failed or plugin is older than blacklist file */ + return true; + } + /* blacklist file does not exist */ + return false; +} + +/* return true if plugin is blacklisted, checks both personal + * and global folder */ +static bool +vstfx_check_blacklist (const char *dllpath) +{ + if (vstfx_blacklist_stat(dllpath, 0)) return true; + if (vstfx_blacklist_stat(dllpath, 1)) return true; + return false; +} + +/* create blacklist file, preferably in same folder as the + * plugin, fall back to personal folder in $HOME + */ +static FILE * +vstfx_blacklist_file (const char *dllpath) +{ + FILE *f; + if ((f = fopen (vstfx_blacklist_path (dllpath, 0).c_str(), "w"))) { + return f; + } + return fopen (vstfx_blacklist_path (dllpath, 1).c_str(), "w"); +} + +/** mark plugin as blacklisted */ +static bool +vstfx_blacklist (const char *dllpath) +{ + FILE *f = vstfx_blacklist_file(dllpath); + if (f) { + fclose(f); + return true; + } + return false; +} + +/** mark plugin as not blacklisted */ +static void +vstfx_un_blacklist (const char *dllpath) +{ + ::g_unlink(vstfx_blacklist_path (dllpath, 0).c_str()); + ::g_unlink(vstfx_blacklist_path (dllpath, 1).c_str()); +} + +/** remove info file from cache */ +static void +vstfx_remove_infofile (const char *dllpath) +{ + ::g_unlink(vstfx_infofile_path (dllpath, 0).c_str()); + ::g_unlink(vstfx_infofile_path (dllpath, 1).c_str()); +} + +/** helper function, check if cache is newer than plugin + * @return path to cache file */ +static char * +vstfx_infofile_stat (const char *dllpath, struct stat* statbuf, int personal) +{ + if (strstr (dllpath, ".so" ) == 0 && strstr(dllpath, ".dll") == 0) { + return 0; + } + + string const path = vstfx_infofile_path (dllpath, personal); + + if (Glib::file_test (path, Glib::FileTest (Glib::FILE_TEST_EXISTS | Glib::FILE_TEST_IS_REGULAR))) { + + struct stat dllstat; + + if (stat (dllpath, &dllstat) == 0) { + if (stat (path.c_str(), statbuf) == 0) { + if (dllstat.st_mtime <= statbuf->st_mtime) { + /* plugin is older than info file */ + return strdup (path.c_str ()); + } + } + } + } + + return 0; +} + +/** cache file for given plugin + * @return FILE of the .fsi cache if found and up-to-date*/ +static FILE * +vstfx_infofile_for_read (const char* dllpath) +{ + struct stat own_statbuf; + struct stat sys_statbuf; + FILE *rv = NULL; + + char* own_info = vstfx_infofile_stat (dllpath, &own_statbuf, 1); + char* sys_info = vstfx_infofile_stat (dllpath, &sys_statbuf, 0); + + if (own_info) { + if (sys_info) { + if (own_statbuf.st_mtime <= sys_statbuf.st_mtime) { + /* system info file is newer, use it */ + rv = g_fopen (sys_info, "rb"); + } + } else { + rv = g_fopen (own_info, "rb"); + } + } else if (sys_info) { + rv = g_fopen (sys_info, "rb"); + } + free(own_info); + free(sys_info); + + return rv; +} + +/** helper function for \ref vstfx_infofile_for_write + * abstract global and personal cache folders + */ +static FILE * +vstfx_infofile_create (const char* dllpath, int personal) +{ + if (strstr (dllpath, ".so" ) == 0 && strstr(dllpath, ".dll") == 0) { + return 0; + } + + string const path = vstfx_infofile_path (dllpath, personal); + return fopen (path.c_str(), "w"); +} + +/** newly created cache file for given plugin + * @return FILE for the .fsi cache, NULL if neither personal, + * nor global cache folder is writable */ +static FILE * +vstfx_infofile_for_write (const char* dllpath) +{ + FILE* f; + + if ((f = vstfx_infofile_create (dllpath, 0)) == 0) { + f = vstfx_infofile_create (dllpath, 1); + } + + return f; +} + +/** check if cache-file exists, is up-to-date and parse cache file + * @param infos [return] loaded plugin info + * @return true if .fsi cache was read successfully, false otherwise + */ +static bool +vstfx_get_info_from_file(const char* dllpath, vector<VSTInfo*> *infos) +{ + FILE* infofile; + bool rv = false; + if ((infofile = vstfx_infofile_for_read (dllpath)) != 0) { + rv = vstfx_load_info_file(infofile, infos); + fclose (infofile); + if (!rv) { + PBD::warning << "Cannot get VST information form " << dllpath << ": info file load failed." << endmsg; + } + } + return rv; +} + + + +/* *** VST system-under-test methods *** */ + +static +bool vstfx_midi_input (VSTState* vstfx) +{ + AEffect* plugin = vstfx->plugin; + + int const vst_version = plugin->dispatcher (plugin, effGetVstVersion, 0, 0, 0, 0.0f); + + if (vst_version >= 2) { + /* should we send it VST events (i.e. MIDI) */ + + if ((plugin->flags & effFlagsIsSynth) || (plugin->dispatcher (plugin, effCanDo, 0, 0,(void*) "receiveVstEvents", 0.0f) > 0)) { + return true; + } + } + + return false; +} + +static +bool vstfx_midi_output (VSTState* vstfx) +{ + AEffect* plugin = vstfx->plugin; + + int const vst_version = plugin->dispatcher (plugin, effGetVstVersion, 0, 0, 0, 0.0f); + + if (vst_version >= 2) { + /* should we send it VST events (i.e. MIDI) */ + + if ( (plugin->dispatcher (plugin, effCanDo, 0, 0,(void*) "sendVstEvents", 0.0f) > 0) + || (plugin->dispatcher (plugin, effCanDo, 0, 0,(void*) "sendVstMidiEvent", 0.0f) > 0) + ) { + return true; + } + } + + return false; +} + +/** simple 'dummy' audiomaster callback to instantiate the plugin + * and query information + */ +static intptr_t +simple_master_callback (AEffect *, int32_t opcode, int32_t, intptr_t, void *ptr, float) +{ + const char* vstfx_can_do_strings[] = { + "supplyIdle", + "sendVstTimeInfo", + "sendVstEvents", + "sendVstMidiEvent", + "receiveVstEvents", + "receiveVstMidiEvent", + "supportShell", + "shellCategory", + "shellCategorycurID" + }; + const int vstfx_can_do_string_count = 9; + + if (opcode == audioMasterVersion) { + return 2400; + } + else if (opcode == audioMasterCanDo) { + for (int i = 0; i < vstfx_can_do_string_count; i++) { + if (! strcmp(vstfx_can_do_strings[i], (const char*)ptr)) { + return 1; + } + } + return 0; + } + else if (opcode == audioMasterCurrentId) { + return vstfx_current_loading_id; + } + else { + return 0; + } +} + + +/** main plugin query and test function */ +static VSTInfo* +vstfx_parse_vst_state (VSTState* vstfx) +{ + assert (vstfx); + + VSTInfo* info = (VSTInfo*) malloc (sizeof (VSTInfo)); + if (!info) { + return 0; + } + + /*We need to init the creator because some plugins + fail to implement getVendorString, and so won't stuff the + string with any name*/ + + char creator[65] = "Unknown"; + char name[65] = ""; + + AEffect* plugin = vstfx->plugin; + + + plugin->dispatcher (plugin, effGetEffectName, 0, 0, name, 0); + + if (strlen(name) == 0) { + plugin->dispatcher (plugin, effGetProductString, 0, 0, name, 0); + } + + if (strlen(name) == 0) { + info->name = strdup (vstfx->handle->name); + } else { + info->name = strdup (name); + } + + /*If the plugin doesn't bother to implement GetVendorString we will + have pre-stuffed the string with 'Unknown' */ + + plugin->dispatcher (plugin, effGetVendorString, 0, 0, creator, 0); + + /*Some plugins DO implement GetVendorString, but DON'T put a name in it + so if its just a zero length string we replace it with 'Unknown' */ + + if (strlen(creator) == 0) { + info->creator = strdup ("Unknown"); + } else { + info->creator = strdup (creator); + } + + + switch (plugin->dispatcher (plugin, effGetPlugCategory, 0, 0, 0, 0)) + { + case kPlugCategEffect: info->Category = strdup ("Effect"); break; + case kPlugCategSynth: info->Category = strdup ("Synth"); break; + case kPlugCategAnalysis: info->Category = strdup ("Anaylsis"); break; + case kPlugCategMastering: info->Category = strdup ("Mastering"); break; + case kPlugCategSpacializer: info->Category = strdup ("Spacializer"); break; + case kPlugCategRoomFx: info->Category = strdup ("RoomFx"); break; + case kPlugSurroundFx: info->Category = strdup ("SurroundFx"); break; + case kPlugCategRestoration: info->Category = strdup ("Restoration"); break; + case kPlugCategOfflineProcess: info->Category = strdup ("Offline"); break; + case kPlugCategShell: info->Category = strdup ("Shell"); break; + case kPlugCategGenerator: info->Category = strdup ("Generator"); break; + default: info->Category = strdup ("Unknown"); break; + } + + info->UniqueID = plugin->uniqueID; + + info->numInputs = plugin->numInputs; + info->numOutputs = plugin->numOutputs; + info->numParams = plugin->numParams; + info->wantMidi = (vstfx_midi_input(vstfx) ? 1 : 0) | (vstfx_midi_output(vstfx) ? 2 : 0); + info->hasEditor = plugin->flags & effFlagsHasEditor ? true : false; + info->canProcessReplacing = plugin->flags & effFlagsCanReplacing ? true : false; + info->ParamNames = (char **) malloc(sizeof(char*)*info->numParams); + info->ParamLabels = (char **) malloc(sizeof(char*)*info->numParams); + + for (int i = 0; i < info->numParams; ++i) { + char name[64]; + char label[64]; + + /* Not all plugins give parameters labels as well as names */ + + strcpy (name, "No Name"); + strcpy (label, "No Label"); + + plugin->dispatcher (plugin, effGetParamName, i, 0, name, 0); + info->ParamNames[i] = strdup(name); + + //NOTE: 'effGetParamLabel' is no longer defined in vestige headers + //plugin->dispatcher (plugin, effGetParamLabel, i, 0, label, 0); + info->ParamLabels[i] = strdup(label); + } + return info; +} + +/** wrapper around \ref vstfx_parse_vst_state, + * iterate over plugins in shell, translate VST-info into ardour VSTState + */ +static void +vstfx_info_from_plugin (const char *dllpath, VSTState* vstfx, vector<VSTInfo *> *infos, enum ARDOUR::PluginType type) +{ + assert(vstfx); + VSTInfo *info; + + if (!(info = vstfx_parse_vst_state(vstfx))) { + return; + } + + infos->push_back(info); +#if 1 // shell-plugin support + /* If this plugin is a Shell and we are not already inside a shell plugin + * read the info for all of the plugins contained in this shell. + */ + if (!strncmp (info->Category, "Shell", 5) + && vstfx->handle->plugincnt == 1) { + int id; + vector< pair<int, string> > ids; + AEffect *plugin = vstfx->plugin; + string path = vstfx->handle->path; + + do { + char name[65] = "Unknown"; + id = plugin->dispatcher (plugin, effShellGetNextPlugin, 0, 0, name, 0); + ids.push_back(std::make_pair(id, name)); + } while ( id != 0 ); + + switch(type) { +#ifdef WINDOWS_VST_SUPPORT + case ARDOUR::Windows_VST: fst_close(vstfx); break; +#endif +#ifdef LXVST_SUPPORT + case ARDOUR::LXVST: vstfx_close (vstfx); break; +#endif + default: assert(0); break; + } + + for (vector< pair<int, string> >::iterator x = ids.begin(); x != ids.end(); ++x) { + id = (*x).first; + if (id == 0) continue; + /* recurse vstfx_get_info() */ + + bool ok; + switch (type) { +#ifdef WINDOWS_VST_SUPPORT + case ARDOUR::Windows_VST: ok = vstfx_instantiate_and_get_info_fst(dllpath, infos, id); break; +#endif +#ifdef LXVST_SUPPORT + case ARDOUR::LXVST: ok = vstfx_instantiate_and_get_info_lx(dllpath, infos, id); break; +#endif + default: ok = false; + } + if (ok) { + // One shell (some?, all?) does not report the actual plugin name + // even after the shelled plugin has been instantiated. + // Replace the name of the shell with the real name. + info = infos->back(); + free (info->name); + + if ((*x).second.length() == 0) { + info->name = strdup("Unknown"); + } + else { + info->name = strdup ((*x).second.c_str()); + } + } + } + } else { + switch(type) { +#ifdef WINDOWS_VST_SUPPORT + case ARDOUR::Windows_VST: fst_close(vstfx); break; +#endif +#ifdef LXVST_SUPPORT + case ARDOUR::LXVST: vstfx_close (vstfx); break; +#endif + default: assert(0); break; + } + } +#endif +} + + + +/* *** TOP-LEVEL PLUGIN INSTANTIATION FUNCTIONS *** */ + +#ifdef LXVST_SUPPORT +static bool +vstfx_instantiate_and_get_info_lx ( + const char* dllpath, vector<VSTInfo*> *infos, int uniqueID) +{ + VSTHandle* h; + VSTState* vstfx; + if (!(h = vstfx_load(dllpath))) { + PBD::warning << "Cannot get LinuxVST information from " << dllpath << ": load failed." << endmsg; + return false; + } + + vstfx_current_loading_id = uniqueID; + + if (!(vstfx = vstfx_instantiate(h, simple_master_callback, 0))) { + vstfx_unload(h); + PBD::warning << "Cannot get LinuxVST information from " << dllpath << ": instantiation failed." << endmsg; + return false; + } + + vstfx_current_loading_id = 0; + + vstfx_info_from_plugin(dllpath, vstfx, infos, ARDOUR::LXVST); + + vstfx_unload (h); + return true; +} +#endif + +#ifdef WINDOWS_VST_SUPPORT +static bool +vstfx_instantiate_and_get_info_fst ( + const char* dllpath, vector<VSTInfo*> *infos, int uniqueID) +{ + VSTHandle* h; + VSTState* vstfx; + if(!(h = fst_load(dllpath))) { + PBD::warning << "Cannot get Windows VST information from " << dllpath << ": load failed." << endmsg; + return false; + } + + vstfx_current_loading_id = uniqueID; + + if(!(vstfx = fst_instantiate(h, simple_master_callback, 0))) { + fst_unload(&h); + vstfx_current_loading_id = 0; + PBD::warning << "Cannot get Windows VST information from " << dllpath << ": instantiation failed." << endmsg; + return false; + } + vstfx_current_loading_id = 0; + + vstfx_info_from_plugin(dllpath, vstfx, infos, ARDOUR::Windows_VST); + + return true; +} +#endif + + + +/* *** ERROR LOGGING *** */ +#ifndef VST_SCANNER_APP + +static FILE * _errorlog_fd = 0; +static char * _errorlog_dll = 0; + +static void parse_scanner_output (std::string msg, size_t /*len*/) +{ + if (!_errorlog_fd && !_errorlog_dll) { + PBD::error << "VST scanner: " << msg; + return; + } + + if (!_errorlog_fd) { + if (!(_errorlog_fd = fopen(vstfx_errorfile_path(_errorlog_dll, 0).c_str(), "w"))) { + if (!(_errorlog_fd = fopen(vstfx_errorfile_path(_errorlog_dll, 1).c_str(), "w"))) { + PBD::error << "Cannot create plugin error-log for plugin " << _errorlog_dll; + free(_errorlog_dll); + _errorlog_dll = NULL; + } + } + } + + if (_errorlog_fd) { + fprintf (_errorlog_fd, "%s\n", msg.c_str()); + } else { + PBD::error << "VST scanner: " << msg; + } +} + +static void +set_error_log (const char* dllpath) { + assert(!_errorlog_fd); + assert(!_errorlog_dll); + _errorlog_dll = strdup(dllpath); +} + +static void +close_error_log () { + if (_errorlog_fd) { + fclose(_errorlog_fd); + _errorlog_fd = 0; + } + free(_errorlog_dll); + _errorlog_dll = 0; +} + +#endif + + +/* *** THE MAIN FUNCTION THAT USES ALL OF THE ABOVE :) *** */ + +static vector<VSTInfo *> * +vstfx_get_info (const char* dllpath, enum ARDOUR::PluginType type, enum VSTScanMode mode) +{ + FILE* infofile; + vector<VSTInfo*> *infos = new vector<VSTInfo*>; + + if (vstfx_check_blacklist(dllpath)) { + return infos; + } + + if (vstfx_get_info_from_file(dllpath, infos)) { + return infos; + } + +#ifndef VST_SCANNER_APP + std::string scanner_bin_path = ARDOUR::PluginManager::scanner_bin_path; + + if (mode == VST_SCAN_CACHE_ONLY) { + /* never scan explicitly, use cache only */ + return infos; + } + else if (mode == VST_SCAN_USE_APP && scanner_bin_path != "") { + /* use external scanner app */ + + char **argp= (char**) calloc(3,sizeof(char*)); + argp[0] = strdup(scanner_bin_path.c_str()); + argp[1] = strdup(dllpath); + argp[2] = 0; + + set_error_log(dllpath); + ARDOUR::SystemExec scanner (scanner_bin_path, argp); + PBD::ScopedConnectionList cons; + scanner.ReadStdout.connect_same_thread (cons, boost::bind (&parse_scanner_output, _1 ,_2)); + if (scanner.start (2 /* send stderr&stdout via signal */)) { + PBD::error << "Cannot launch VST scanner app '" << scanner_bin_path << "': "<< strerror(errno) << endmsg; + close_error_log(); + return infos; + } else { + int timeout = PLUGIN_SCAN_TIMEOUT; + bool no_timeout = (timeout <= 0); + ARDOUR::PluginScanTimeout(timeout); + while (scanner.is_running() && (no_timeout || timeout > 0)) { + if (!no_timeout && !ARDOUR::PluginManager::instance().no_timeout()) { + if (timeout%5 == 0) { + ARDOUR::PluginScanTimeout(timeout); + } + --timeout; + } + ARDOUR::GUIIdle(); + Glib::usleep (100000); + + if (ARDOUR::PluginManager::instance().cancelled()) { + // remove info file (might be incomplete) + vstfx_remove_infofile(dllpath); + // remove temporary blacklist file (scan incomplete) + vstfx_un_blacklist(dllpath); + scanner.terminate(); + close_error_log(); + return infos; + } + } + scanner.terminate(); + } + close_error_log(); + /* re-read index (generated by external scanner) */ + vstfx_clear_info_list(infos); + if (!vstfx_check_blacklist(dllpath)) { + vstfx_get_info_from_file(dllpath, infos); + } + return infos; + } + /* else .. instantiate and check in in ardour process itself */ +#else + (void) mode; // unused parameter +#endif + + bool ok; + /* blacklist in case instantiation fails */ + vstfx_blacklist(dllpath); + + switch (type) { +#ifdef WINDOWS_VST_SUPPORT + case ARDOUR::Windows_VST: ok = vstfx_instantiate_and_get_info_fst(dllpath, infos, 0); break; +#endif +#ifdef LXVST_SUPPORT + case ARDOUR::LXVST: ok = vstfx_instantiate_and_get_info_lx(dllpath, infos, 0); break; +#endif + default: ok = false; + } + + if (!ok) { + return infos; + } + + /* remove from blacklist */ + vstfx_un_blacklist(dllpath); + + /* crate cache/whitelist */ + infofile = vstfx_infofile_for_write (dllpath); + if (!infofile) { + PBD::warning << "Cannot cache VST information for " << dllpath << ": cannot create new FST info file." << endmsg; + return infos; + } else { + vstfx_write_info_file (infofile, infos); + fclose (infofile); + } + return infos; +} + + + +/* *** public API *** */ + +void +vstfx_free_info_list (vector<VSTInfo *> *infos) +{ + for (vector<VSTInfo *>::iterator i = infos->begin(); i != infos->end(); ++i) { + vstfx_free_info(*i); + } + delete infos; +} + +string +get_personal_vst_blacklist_dir() { + string dir = Glib::build_filename (ARDOUR::user_cache_directory(), "fst_blacklist"); + /* if the directory doesn't exist, try to create it */ + if (!Glib::file_test (dir, Glib::FILE_TEST_IS_DIR)) { + if (g_mkdir (dir.c_str (), 0700)) { + PBD::error << "Cannot create VST blacklist folder '" << dir << "'" << endmsg; + //exit(1); + } + } + return dir; +} + +string +get_personal_vst_info_cache_dir() { + string dir = Glib::build_filename (ARDOUR::user_cache_directory(), "fst_info"); + /* if the directory doesn't exist, try to create it */ + if (!Glib::file_test (dir, Glib::FILE_TEST_IS_DIR)) { + if (g_mkdir (dir.c_str (), 0700)) { + PBD::error << "Cannot create VST info folder '" << dir << "'" << endmsg; + //exit(1); + } + } + return dir; +} + +#ifdef LXVST_SUPPORT +vector<VSTInfo *> * +vstfx_get_info_lx (char* dllpath, enum VSTScanMode mode) +{ + return vstfx_get_info(dllpath, ARDOUR::LXVST, mode); +} +#endif + +#ifdef WINDOWS_VST_SUPPORT +vector<VSTInfo *> * +vstfx_get_info_fst (char* dllpath, enum VSTScanMode mode) +{ + return vstfx_get_info(dllpath, ARDOUR::Windows_VST, mode); +} +#endif + +#ifndef VST_SCANNER_APP +} // namespace +#endif diff --git a/libs/ardour/vst_plugin.cc b/libs/ardour/vst_plugin.cc index 729ee5c129..24020e8356 100644 --- a/libs/ardour/vst_plugin.cc +++ b/libs/ardour/vst_plugin.cc @@ -25,7 +25,6 @@ #include "pbd/floating.h" #include "pbd/locale_guard.h" -#include "pbd/pathscanner.h" #include "ardour/vst_plugin.h" #include "ardour/vestige/aeffectx.h" @@ -46,12 +45,12 @@ VSTPlugin::VSTPlugin (AudioEngine& engine, Session& session, VSTHandle* handle) , _state (0) , _plugin (0) { - + } VSTPlugin::~VSTPlugin () { - + } void @@ -78,7 +77,7 @@ VSTPlugin::activate () _plugin->dispatcher (_plugin, effMainsChanged, 0, 1, NULL, 0.0f); } -int +int VSTPlugin::set_block_size (pframes_t nframes) { deactivate (); @@ -93,13 +92,13 @@ VSTPlugin::default_value (uint32_t) return 0; } -float +float VSTPlugin::get_parameter (uint32_t which) const { return _plugin->getParameter (_plugin, which); } -void +void VSTPlugin::set_parameter (uint32_t which, float newval) { float oldval = get_parameter (which); @@ -109,7 +108,7 @@ VSTPlugin::set_parameter (uint32_t which, float newval) } _plugin->setParameter (_plugin, which, newval); - + float curval = get_parameter (which); if (!PBD::floateq (curval, oldval, 1)) { @@ -215,8 +214,8 @@ VSTPlugin::set_state (const XMLNode& node, int version) for (n = child->children ().begin (); n != child->children ().end (); ++n) { if ((*n)->is_content ()) { /* XXX: this may be dubious for the same reasons that we delay - execution of load_preset. - */ + execution of load_preset. + */ ret = set_chunk ((*n)->content().c_str(), false); } } @@ -250,6 +249,7 @@ VSTPlugin::get_parameter_descriptor (uint32_t which, ParameterDescriptor& desc) { VstParameterProperties prop; + memset (&prop, 0, sizeof (VstParameterProperties)); desc.min_unbound = false; desc.max_unbound = false; prop.flags = 0; @@ -257,6 +257,7 @@ VSTPlugin::get_parameter_descriptor (uint32_t which, ParameterDescriptor& desc) if (_plugin->dispatcher (_plugin, effGetParameterProperties, which, 0, &prop, 0)) { /* i have yet to find or hear of a VST plugin that uses this */ + /* RG: faust2vsti does use this :) */ if (prop.flags & kVstParameterUsesIntegerMinMax) { desc.lower = prop.minInteger; @@ -287,6 +288,10 @@ VSTPlugin::get_parameter_descriptor (uint32_t which, ParameterDescriptor& desc) desc.largestep = desc.step * 10.0f; } + if (strlen(prop.label) == 0) { + _plugin->dispatcher (_plugin, effGetParamName, which, 0, prop.label, 0); + } + desc.toggled = prop.flags & kVstParameterIsSwitch; desc.logarithmic = false; desc.sr_dependent = false; @@ -301,7 +306,7 @@ VSTPlugin::get_parameter_descriptor (uint32_t which, ParameterDescriptor& desc) memset (label, 0, sizeof (label)); _plugin->dispatcher (_plugin, effGetParamName, which, 0, label, 0); - + desc.label = label; desc.integer_step = false; desc.lower = 0.0f; @@ -335,7 +340,7 @@ VSTPlugin::load_preset (PresetRecord r) return s; } -bool +bool VSTPlugin::load_plugin_preset (PresetRecord r) { /* This is a plugin-provided preset. @@ -348,15 +353,14 @@ VSTPlugin::load_plugin_preset (PresetRecord r) #ifndef NDEBUG int const p = sscanf (r.uri.c_str(), "VST:%d:%d", &id, &index); assert (p == 2); -#else +#else sscanf (r.uri.c_str(), "VST:%d:%d", &id, &index); #endif - _state->want_program = index; return true; } -bool +bool VSTPlugin::load_user_preset (PresetRecord r) { /* This is a user preset; we load it, and this code also knows about the @@ -402,7 +406,7 @@ VSTPlugin::load_user_preset (PresetRecord r) return false; } else { - + for (XMLNodeList::const_iterator j = (*i)->children().begin(); j != (*i)->children().end(); ++j) { if ((*j)->name() == X_("Parameter")) { XMLProperty* index = (*j)->property (X_("index")); @@ -420,7 +424,7 @@ VSTPlugin::load_user_preset (PresetRecord r) return false; } -string +string VSTPlugin::do_save_preset (string name) { boost::shared_ptr<XMLTree> t (presets_tree ()); @@ -466,7 +470,7 @@ VSTPlugin::do_save_preset (string name) return uri; } -void +void VSTPlugin::do_remove_preset (string name) { boost::shared_ptr<XMLTree> t (presets_tree ()); @@ -482,7 +486,7 @@ VSTPlugin::do_remove_preset (string name) t->write (f); } -string +string VSTPlugin::describe_parameter (Evoral::Parameter param) { char name[64]; @@ -499,7 +503,7 @@ VSTPlugin::describe_parameter (Evoral::Parameter param) return name; } -framecnt_t +framecnt_t VSTPlugin::signal_latency () const { if (_user_latency) { @@ -509,7 +513,7 @@ VSTPlugin::signal_latency () const return *((int32_t *) (((char *) &_plugin->flags) + 12)); /* initialDelay */ } -set<Evoral::Parameter> +set<Evoral::Parameter> VSTPlugin::automatable () const { set<Evoral::Parameter> ret; @@ -523,20 +527,30 @@ VSTPlugin::automatable () const int VSTPlugin::connect_and_run (BufferSet& bufs, - ChanMapping in_map, ChanMapping out_map, - pframes_t nframes, framecnt_t offset) + ChanMapping in_map, ChanMapping out_map, + pframes_t nframes, framecnt_t offset) { Plugin::connect_and_run (bufs, in_map, out_map, nframes, offset); ChanCount bufs_count; bufs_count.set(DataType::AUDIO, 1); bufs_count.set(DataType::MIDI, 1); + _midi_out_buf = 0; BufferSet& silent_bufs = _session.get_silent_buffers(bufs_count); BufferSet& scratch_bufs = _session.get_scratch_buffers(bufs_count); - float *ins[_plugin->numInputs]; - float *outs[_plugin->numOutputs]; + /* VC++ doesn't support the C99 extension that allows + + typeName foo[variableDefiningSize]; + + Use alloca instead of dynamic array (rather than std::vector which + allocs on the heap) because this is realtime code. + */ + + float** ins = (float**)alloca(_plugin->numInputs*sizeof(float*)); + float** outs = (float**)alloca(_plugin->numInputs*sizeof(float*)); + int32_t i; uint32_t in_index = 0; @@ -560,58 +574,74 @@ VSTPlugin::connect_and_run (BufferSet& bufs, } if (bufs.count().n_midi() > 0) { - VstEvents* v = bufs.get_vst_midi (0); - _plugin->dispatcher (_plugin, effProcessEvents, 0, 0, v, 0); + VstEvents* v = 0; + bool valid = false; + const uint32_t buf_index_in = in_map.get(DataType::MIDI, 0, &valid); + if (valid) { + v = bufs.get_vst_midi (buf_index_in); + } + valid = false; + const uint32_t buf_index_out = out_map.get(DataType::MIDI, 0, &valid); + if (valid) { + _midi_out_buf = &bufs.get_midi(buf_index_out); + _midi_out_buf->silence(0, 0); + } else { + _midi_out_buf = 0; + } + if (v) { + _plugin->dispatcher (_plugin, effProcessEvents, 0, 0, v, 0); + } } /* we already know it can support processReplacing */ - _plugin->processReplacing (_plugin, ins, outs, nframes); + _plugin->processReplacing (_plugin, &ins[0], &outs[0], nframes); + _midi_out_buf = 0; return 0; } -string +string VSTPlugin::unique_id () const { char buf[32]; snprintf (buf, sizeof (buf), "%d", _plugin->uniqueID); - + return string (buf); } -const char * +const char * VSTPlugin::name () const { return _handle->name; } -const char * +const char * VSTPlugin::maker () const { return _info->creator.c_str(); } -const char * +const char * VSTPlugin::label () const { return _handle->name; } -uint32_t +uint32_t VSTPlugin::parameter_count () const { return _plugin->numParams; } -bool +bool VSTPlugin::has_editor () const { return _plugin->flags & effFlagsHasEditor; } -void +void VSTPlugin::print_parameter (uint32_t param, char *buf, uint32_t /*len*/) const { char *first_nonws; diff --git a/libs/ardour/windows_vst_plugin.cc b/libs/ardour/windows_vst_plugin.cc index 9fe9ba0049..03170e0d04 100644 --- a/libs/ardour/windows_vst_plugin.cc +++ b/libs/ardour/windows_vst_plugin.cc @@ -28,12 +28,14 @@ using namespace std; using namespace ARDOUR; using namespace PBD; -WindowsVSTPlugin::WindowsVSTPlugin (AudioEngine& e, Session& session, VSTHandle* h) +WindowsVSTPlugin::WindowsVSTPlugin (AudioEngine& e, Session& session, VSTHandle* h, int unique_id) : VSTPlugin (e, session, h) { + Session::vst_current_loading_id = unique_id; if ((_state = fst_instantiate (_handle, Session::vst_callback, this)) == 0) { throw failed_constructor(); } + Session::vst_current_loading_id = 0; set_plugin (_state->plugin); } @@ -43,9 +45,11 @@ WindowsVSTPlugin::WindowsVSTPlugin (const WindowsVSTPlugin &other) { _handle = other._handle; + Session::vst_current_loading_id = PBD::atoi(other.unique_id()); if ((_state = fst_instantiate (_handle, Session::vst_callback, this)) == 0) { throw failed_constructor(); } + Session::vst_current_loading_id = 0; _plugin = _state->plugin; } @@ -70,7 +74,7 @@ WindowsVSTPluginInfo::load (Session& session) if ((int) handle == -1) { error << string_compose(_("VST: cannot load module from \"%1\""), path) << endmsg; } else { - plugin.reset (new WindowsVSTPlugin (session.engine(), session, handle)); + plugin.reset (new WindowsVSTPlugin (session.engine(), session, handle, PBD::atoi(unique_id))); } } else { error << _("You asked ardour to not use any VST plugins") << endmsg; diff --git a/libs/ardour/worker.cc b/libs/ardour/worker.cc index b13398c69d..aea1c6f8e3 100644 --- a/libs/ardour/worker.cc +++ b/libs/ardour/worker.cc @@ -23,6 +23,8 @@ #include "ardour/worker.h" #include "pbd/error.h" +#include <glibmm/timer.h> + namespace ARDOUR { Worker::Worker(Workee* workee, uint32_t ring_size) @@ -80,6 +82,9 @@ Worker::verify_message_completeness(RingBuffer<uint8_t>* rb) uint32_t size; RingBuffer<uint8_t>::rw_vector vec; rb->get_read_vector (&vec); + if (vec.len[0] + vec.len[1] < sizeof(size)) { + return false; + } if (vec.len[0] >= sizeof(size)) { memcpy (&size, vec.buf[0], sizeof (size)); } else { @@ -119,6 +124,7 @@ Worker::run() while (true) { _sem.wait(); if (_exit) { + if (buf) free(buf); return; } @@ -128,8 +134,9 @@ Worker::run() continue; } while (!verify_message_completeness(_requests)) { - ::usleep(2000); + Glib::usleep(2000); if (_exit) { + if (buf) free(buf); return; } } @@ -141,7 +148,13 @@ Worker::run() if (size > buf_size) { buf = realloc(buf, size); - buf_size = size; + if (buf) { + buf_size = size; + } else { + PBD::error << "Worker: Error allocating memory" + << endmsg; + buf_size = 0; // TODO: This is probably fatal + } } if (_requests->read((uint8_t*)buf, size) < size) { diff --git a/libs/ardour/wscript b/libs/ardour/wscript index 608bbf1991..3ce94d892b 100644 --- a/libs/ardour/wscript +++ b/libs/ardour/wscript @@ -2,6 +2,7 @@ from waflib.extras import autowaf as autowaf from waflib import Options import os +import sys import re import subprocess import sys @@ -45,7 +46,6 @@ libardour_sources = [ 'automation_control.cc', 'automation_list.cc', 'automation_watch.cc', - 'backend_search_path.cc', 'beats_frames_converter.cc', 'broadcast_info.cc', 'buffer.cc', @@ -59,11 +59,11 @@ libardour_sources = [ 'configuration.cc', 'config_text.cc', 'control_protocol_manager.cc', - 'control_protocol_search_path.cc', 'cycle_timer.cc', 'data_type.cc', 'default_click.cc', 'debug.cc', + 'delayline.cc', 'delivery.cc', 'directory_names.cc', 'diskstream.cc', @@ -80,7 +80,6 @@ libardour_sources = [ 'export_format_manager.cc', 'export_format_specification.cc', 'export_formats.cc', - 'export_formats_search_path.cc', 'export_graph_builder.cc', 'export_handler.cc', 'export_preset.cc', @@ -109,7 +108,6 @@ libardour_sources = [ 'location.cc', 'location_importer.cc', 'ltc_slave.cc', - 'lv2_bundled_search_path.cc', 'meter.cc', 'midi_automation_list_binder.cc', 'midi_buffer.cc', @@ -117,12 +115,13 @@ libardour_sources = [ 'midi_diskstream.cc', 'midi_model.cc', 'midi_patch_manager.cc', - 'midi_patch_search_path.cc', 'midi_playlist.cc', 'midi_playlist_source.cc', 'midi_port.cc', 'midi_region.cc', 'midi_ring_buffer.cc', + 'midi_scene_change.cc', + 'midi_scene_changer.cc', 'midi_source.cc', 'midi_state_tracker.cc', 'midi_stretch.cc', @@ -132,6 +131,7 @@ libardour_sources = [ 'mix.cc', 'monitor_processor.cc', 'mtc_slave.cc', + 'mididm.cc', 'mtdm.cc', 'mute_master.cc', 'onset_detector.cc', @@ -140,10 +140,8 @@ libardour_sources = [ 'pannable.cc', 'panner.cc', 'panner_manager.cc', - 'panner_search_path.cc', 'panner_shell.cc', 'pcm_utils.cc', - 'pi_controller.cc', 'playlist.cc', 'playlist_factory.cc', 'playlist_source.cc', @@ -170,6 +168,8 @@ libardour_sources = [ 'route_group.cc', 'route_group_member.cc', 'rb_effect.cc', + 'scene_change.cc', + 'search_paths.cc', 'send.cc', 'session.cc', 'session_butler.cc', @@ -196,11 +196,13 @@ libardour_sources = [ 'sndfile_helpers.cc', 'sndfileimportable.cc', 'sndfilesource.cc', + 'soundcloud_upload.cc', 'source.cc', 'source_factory.cc', 'speakers.cc', 'srcfilesource.cc', 'strip_silence.cc', + 'system_exec.cc', 'revision.cc', 'tape_file_matcher.cc', 'template_utils.cc', @@ -242,23 +244,24 @@ def configure(conf): autowaf.build_version_files( path_prefix + 'ardour/version.h', path_prefix + 'version.cc', - 'libardour3', conf.env['MAJOR'], conf.env['MINOR'], 0) + 'libardour3', conf.env['MAJOR'], conf.env['MINOR'], 0, + 'LIBARDOUR_API', 'ardour/libardour_visibility.h') autowaf.configure(conf) autowaf.check_pkg(conf, 'aubio', uselib_store='AUBIO', atleast_version='0.3.2') autowaf.check_pkg(conf, 'aubio', uselib_store='AUBIO4', atleast_version='0.4.0', mandatory=False) autowaf.check_pkg(conf, 'libxml-2.0', uselib_store='XML') - autowaf.check_pkg(conf, 'lrdf', uselib_store='LRDF', - atleast_version='0.4.0') + if Options.options.dist_target != 'mingw': + autowaf.check_pkg(conf, 'lrdf', uselib_store='LRDF', + atleast_version='0.4.0') + autowaf.check_pkg(conf, 'aubio', uselib_store='AUBIO', + atleast_version='0.3.2') autowaf.check_pkg(conf, 'samplerate', uselib_store='SAMPLERATE', atleast_version='0.1.0') autowaf.check_pkg(conf, 'sigc++-2.0', uselib_store='SIGCPP', atleast_version='2.0') - if re.search ("linux", sys.platform) != None: - autowaf.check_pkg(conf, 'alsa', uselib_store='ALSA') - if Options.options.lv2: autowaf.check_pkg(conf, 'lv2', uselib_store='LV2', atleast_version='1.0.0', mandatory=True) @@ -288,10 +291,9 @@ def configure(conf): autowaf.check_pkg(conf, 'libcurl', uselib_store='CURL', atleast_version='7.0.0') - # we don't try to detect this, since its part of our source tree - - conf.define('HAVE_RUBBERBAND', 1) # controls whether we think we have it - conf.define('USE_RUBBERBAND', 1) # controls whether we actually use it + # controls whether we actually use it in preference to soundtouch + # Note: as of 2104, soundtouch (WSOLA) has been out-of-use for years. + conf.define('USE_RUBBERBAND', 1) conf.define('CURRENT_SESSION_FILE_VERSION', CURRENT_SESSION_FILE_VERSION) @@ -312,6 +314,11 @@ def configure(conf): autowaf.check_header(conf, 'cxx', 'boost/weak_ptr.hpp') autowaf.check_header(conf, 'cxx', 'boost/scoped_ptr.hpp') autowaf.check_header(conf, 'cxx', 'boost/ptr_container/ptr_list.hpp') + if conf.env['WINDOWS_VST_SUPPORT'] == True and Options.options.dist_target == 'mingw': + conf.check(compiler='cxx', + lib='gdi32', + mandatory=True, + uselib_store='GDI32') def build(bld): @@ -319,40 +326,45 @@ def build(bld): # major increment <=> incompatible changes # minor increment <=> compatible changes (additions) # micro increment <=> no interface changes - LIBARDOUR_LIB_VERSION = "3.0.0." + LIBARDOUR_LIB_VERSION = "3.0.0" # Library if bld.is_defined ('INTERNAL_SHARED_LIBS'): obj = bld.shlib(features = 'c cxx cshlib cxxshlib', source=libardour_sources) + # macros for this shared library + obj.defines = [ 'LIBARDOUR_DLL_EXPORTS=1' ] else: obj = bld.stlib(features = 'c cxx cstlib cxxstlib', source=libardour_sources) obj.cxxflags = [ '-fPIC' ] obj.cflags = [ '-fPIC' ] + obj.defines = [] obj.export_includes = ['.'] obj.includes = ['.', '../surfaces/control_protocol', '..'] - obj.name = 'ardour' + obj.name = 'libardour' obj.target = 'ardour' obj.uselib = ['GLIBMM','GTHREAD','AUBIO','SIGCPP','XML','UUID', 'SNDFILE','SAMPLERATE','LRDF','AUDIOUNITS', - 'OSX','BOOST','CURL','DL'] - obj.use = ['libpbd','libmidipp','libevoral','libvampplugin', - 'libaudiographer','libltc','libtimecode'] + 'OSX','BOOST','CURL','TAGLIB','VAMPSDK','VAMPHOSTSDK','RUBBERBAND'] + obj.use = ['libpbd','libmidipp','libevoral', + 'libaudiographer', + 'libtimecode', + ] + if bld.env['build_target'] != 'mingw': + obj.uselib += ['DL'] if bld.is_defined('USE_EXTERNAL_LIBS'): - obj.uselib.extend(['RUBBERBAND', 'TAGLIB', 'LIBLTC', 'VAMPSDK', - 'VAMPHOSTSDK']) + obj.uselib.extend(['VAMPSDK', 'LIBLTC']) else: - obj.use.extend(['libltc', 'librubberband', 'libtaglib', 'libvamphost']) + obj.use.extend(['librubberband', 'libltc_includes', 'libltc']) obj.vnum = LIBARDOUR_LIB_VERSION - obj.install_path = os.path.join(bld.env['LIBDIR'], 'ardour3') - obj.defines = [ + obj.install_path = bld.env['LIBDIR'] + obj.defines += [ 'PACKAGE="' + I18N_PACKAGE + '"', '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') + '"', - 'PROGRAM_NAME="' + bld.env['PROGRAM_NAME'] + '"', - 'EVORAL_MIDI_XML=1' + 'EVORAL_MIDI_XML=1', ] #obj.source += ' st_stretch.cc st_pitch.cc ' @@ -360,7 +372,7 @@ def build(bld): #obj.add_objects = 'default/libs/surfaces/control_protocol/smpte_1.o' if bld.is_defined('HAVE_LILV') : - obj.source += ['lv2_plugin.cc', 'lv2_evbuf.c', 'uri_map.cc'] + obj.source += ['lv2_plugin.cc', 'lv2_evbuf.c', 'uri_map.cc'] obj.uselib += ['LILV'] if bld.is_defined('HAVE_SUIL'): obj.uselib += ['SUIL'] @@ -369,13 +381,16 @@ def build(bld): obj.source += [ 'windows_vst_plugin.cc'] obj.includes += [ '../fst' ] obj.defines += [ 'WINDOWS_VST_SUPPORT' ] + if bld.env['build_target'] == 'mingw': + obj.source += [ '../fst/vstwin.c'] + obj.uselib += ['GDI32'] if bld.is_defined('LXVST_SUPPORT'): - obj.source += [ 'lxvst_plugin.cc', 'linux_vst_support.cc', 'linux_vst_info_file.cc' ] + obj.source += [ 'lxvst_plugin.cc', 'linux_vst_support.cc' ] obj.defines += [ 'LXVST_SUPPORT' ] if bld.is_defined('WINDOWS_VST_SUPPORT') or bld.is_defined('LXVST_SUPPORT'): - obj.source += [ 'session_vst.cc', 'vst_plugin.cc' ] + obj.source += [ 'session_vst.cc', 'vst_plugin.cc', 'vst_info_file.cc' ] if bld.is_defined('HAVE_COREAUDIO'): obj.source += [ 'coreaudiosource.cc', 'caimportable.cc' ] @@ -407,21 +422,18 @@ def build(bld): testcommon.source = ['test/testrunner.cc', 'test/test_needing_session.cc', 'test/test_common.cc', 'test/dummy_lxvst.cc', 'test/audio_region_test.cc', 'test/test_util.cc'] testcommon.uselib = ['CPPUNIT','SIGCPP','GLIBMM','GTHREAD', - 'SAMPLERATE','XML','LRDF','COREAUDIO'] + 'SAMPLERATE','XML','LRDF','COREAUDIO','TAGLIB','VAMPSDK','VAMPHOSTSDK','RUBBERBAND'] testcommon.use = ['libpbd','libmidipp','libevoral', - 'libvampplugin','libaudiographer','ardour'] + 'libaudiographer','libardour'] if bld.is_defined('USE_EXTERNAL_LIBS'): - testcommon.uselib.extend(['RUBBERBAND', 'TAGLIB', 'LIBLTC', 'VAMPSDK', - 'VAMPHOSTSDK']) + testcommon.uselib.extend(['LIBLTC',]) else: - testcommon.use.extend(['libltc', 'librubberband', 'libtaglib', 'libvamphost']) + testcommon.use.extend(['libltc', 'librubberband']) 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' @@ -434,6 +446,7 @@ def build(bld): testcommon.source += [ 'sse_functions_64bit.s' ] if bld.env['SINGLE_TESTS']: + create_ardour_test_program(bld, obj.includes, 'audio_engine_test', 'test_audio_engine', ['test/audio_engine_test.cc']) 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']) @@ -445,12 +458,14 @@ def build(bld): 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, 'plugins_test', 'test_plugins', ['test/plugins_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']) create_ardour_test_program(bld, obj.includes, 'session_test', 'test_session', ['test/session_test.cc']) test_sources = ''' + test/audio_engine_test.cc test/automation_list_property_test.cc test/bbt_test.cc test/tempo_test.cc @@ -462,6 +477,7 @@ def build(bld): test/framepos_minus_beats_test.cc test/playlist_equivalent_regions_test.cc test/playlist_layering_test.cc + test/plugins_test.cc test/region_naming_test.cc test/control_surfaces_test.cc test/mtdm_test.cc @@ -488,7 +504,7 @@ def build(bld): session_load_tester.includes.append ('test') session_load_tester.uselib = ['CPPUNIT','SIGCPP','GLIBMM','GTHREAD', 'SAMPLERATE','XML','LRDF','COREAUDIO'] - session_load_tester.use = ['libpbd','libmidipp','ardour'] + session_load_tester.use = ['libpbd','libmidipp','libardour'] session_load_tester.name = 'libardour-session-load-tester' session_load_tester.target = 'load-session' session_load_tester.install_path = '' @@ -498,8 +514,6 @@ def build(bld): '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']: session_load_tester.source += [ 'sse_functions_xmm.cc' ] @@ -523,7 +537,7 @@ def build(bld): profilingobj.includes.append ('test') profilingobj.uselib = ['CPPUNIT','SIGCPP','GLIBMM','GTHREAD', 'SAMPLERATE','XML','LRDF','COREAUDIO'] - profilingobj.use = ['libpbd','libmidipp','ardour'] + profilingobj.use = ['libpbd','libmidipp','libardour'] profilingobj.name = 'libardour-profiling' profilingobj.target = p profilingobj.install_path = '' @@ -533,8 +547,6 @@ def build(bld): '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']: profilingobj.source += [ 'sse_functions_xmm.cc' ] @@ -549,28 +561,24 @@ def create_ardour_test_program(bld, includes, name, target, sources): testobj.includes = includes + ['test', '../pbd', '..'] testobj.source = sources testobj.uselib = ['CPPUNIT','SIGCPP','GLIBMM','GTHREAD', - 'SAMPLERATE','XML','LRDF','COREAUDIO'] - testobj.use = ['libpbd','libmidipp','libevoral','libvampplugin', - 'libaudiographer','ardour','testcommon'] + 'SAMPLERATE','XML','LRDF','COREAUDIO','TAGLIB','VAMPSDK','VAMPHOSTSDK','RUBBERBAND'] + testobj.use = ['libpbd','libmidipp','libevoral', + 'libaudiographer','libardour','testcommon'] if bld.is_defined('USE_EXTERNAL_LIBS'): - testobj.uselib.extend(['RUBBERBAND', 'TAGLIB', 'LIBLTC', 'VAMPSDK', - 'VAMPHOSTSDK']) + testobj.uselib.extend(['LIBLTC']) else: - testobj.use.extend(['libltc', 'librubberband', 'libtaglib', - 'libvamphost']) + testobj.use.extend(['libltc']) testobj.name = name testobj.target = target # not sure about install path - testobj.install_path = os.path.join(bld.env['LIBDIR'], 'ardour3') + testobj.install_path = bld.env['LIBDIR'] 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(): |