Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package audacity for openSUSE:Factory checked in at 2026-11-11 16:24:29 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/audacity (Old) and /work/SRC/openSUSE:Factory/.audacity.new.3759290 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "audacity" Wed Nov 11 16:24:29 2026 rev:136 rq:1396521 version:4.0.1 Changes: -------- --- /work/SRC/openSUSE:Factory/audacity/audacity.changes 2026-09-07 11:34:57.460825105 +0200 +++ /work/SRC/openSUSE:Factory/.audacity.new.3759290/audacity.changes 2026-11-11 16:24:54.391807190 +0100 @@ -1,0 +2,51 @@ +Sun Nov 8 09:18:02 UTC 2026 - Edgar Aichinger <[email protected]> + +- Fix build with Qt 6.12 by disabling QML cache generation + +------------------------------------------------------------------- +Sun Oct 18 07:54:13 UTC 2026 - Dave Plater <[email protected]> + +- Delete audacity-rpmlintrc, no longer needed + +------------------------------------------------------------------- +Sat Oct 17 17:05:42 UTC 2026 - Martin Pluskal <[email protected]> + +- Update to version 4.0.1, the major Audacity 4 release: + * Interface rebuilt on Qt with native high-DPI rendering; + toolbars and panels dock, float, hide, workspaces save layouts + * New clip-editing model: direct clip select, multi-clip move, + trim and stretch, clip groups, free placement across tracks + * Split tool, automatic track creation on paste, alignment guides, + per-project snap settings + * New .aup4 project format (.aup3 converts forward-only) + * Rebuilt-in effects, generators and meters; VST3, Nyquist and + LV2 support on Linux; per-track live meters + * Dropped in 4.0: Time Tracks, Note/MIDI tracks, Mixer, Macro + Manager and scripting pipe, VAMP and LADSPA hosting, Play-at-speed + * 4.0.1: export-multiple, portable Windows build, restored + Audacity 3 shortcuts, accessibility fixes, AppImage startup fix + * Packaging: switch to the audacity-sources tarball (submodules + included) with an offline extdeps source cache; link system + libraries (EXTDEPS_OVERRIDE_ALL=SYSTEM); drop the 3.x patches + audacity-no_buildstamp.patch, audacity-no_return_in_nonvoid.patch + and lib64-plugins-default-path.patch (obsolete) + * Ship the bundled sbsms runtime in a libsbsms10 subpackage + (no sbsms in Factory) and strip its build-tree RPATH; + package the versioned 4.0 datadir (languages.json, workspaces) + * CVE-2024-50602 (boo#1232608): not affected — links system expat (Factory 2.6.4 floor); rebuilt VST3 SDK vendors no expat + * Enable VST3 support by default (opt-in in 3.x): Audacity 4 + rebuilt VST3 effects on Linux, SDK rebuilt from bundled sources + * Drop the audacity-plugins Provides/Obsoletes: the 3.x plugin + modules are gone in 4.0 + * Exclude 32-bit, big-endian and unverified architectures + (i586, s390x, ppc64, ppc64le, riscv64) + * No %%check section: upstream unit tests are disabled in this build + * Restore the Recommends on audacity-lang; drop the unused + fdupes and update-desktop-files build requirements + * Build with the default Unix Makefiles generator: the macros' + build/install steps are make-based, -GNinja left no Makefile + * Fix au3 build against wxWidgets without the unsafe string + conversion (add audacity-wxstring-untranslatable.patch: route + wxString args through the au3::untranslatable bridge) + +------------------------------------------------------------------- Old: ---- Audacity-3.7.9.tar.gz audacity-no_buildstamp.patch audacity-no_return_in_nonvoid.patch audacity-rpmlintrc lib64-plugins-default-path.patch New: ---- audacity-extdeps-cache-4.0.1.tar.xz audacity-sources-4.0.1.tar.xz audacity-wxstring-untranslatable.patch ----------(Old B)---------- Old: libraries (EXTDEPS_OVERRIDE_ALL=SYSTEM); drop the 3.x patches audacity-no_buildstamp.patch, audacity-no_return_in_nonvoid.patch and lib64-plugins-default-path.patch (obsolete) Old: libraries (EXTDEPS_OVERRIDE_ALL=SYSTEM); drop the 3.x patches audacity-no_buildstamp.patch, audacity-no_return_in_nonvoid.patch and lib64-plugins-default-path.patch (obsolete) Old: audacity-no_buildstamp.patch, audacity-no_return_in_nonvoid.patch and lib64-plugins-default-path.patch (obsolete) * Ship the bundled sbsms runtime in a libsbsms10 subpackage ----------(Old E)---------- ----------(New B)---------- New: * Fix au3 build against wxWidgets without the unsafe string conversion (add audacity-wxstring-untranslatable.patch: route wxString args through the au3::untranslatable bridge) ----------(New E)---------- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ audacity.spec ++++++ --- /var/tmp/diff_new_pack.bBde6X/_old 2026-11-11 16:24:58.177965993 +0100 +++ /var/tmp/diff_new_pack.bBde6X/_new 2026-11-11 16:24:58.178966035 +0100 @@ -16,101 +16,101 @@ # -%bcond_with vst3 - +# VST3 is ON by default in 4.x (opt-in in 3.x): Audacity 4 rebuilt VST3 +# effects support on Linux and the SDK is rebuilt from the bundled +# sources (EXTDEPS_OVERRIDE_VST3SDK=REBUILD below), no network fetch. +%bcond_without vst3 Name: audacity -Version: 3.7.9 +Version: 4.0.1 Release: 0 Summary: A Multi Track Digital Audio Editor License: CC-BY-3.0 AND GPL-2.0-or-later AND GPL-3.0-only -Group: Productivity/Multimedia/Sound/Utilities -URL: http://audacityteam.org/ -Source: https://github.com/audacity/audacity/archive/Audacity-%{version}.tar.gz -Source1: audacity-license-nyquist -Source2: audacity-rpmlintrc -%if %{with vst3} -#Source3: vst3sdk-3.7.12_build_20.tar.xz -%endif -# PATCH-FIX-OPENSUSE audacity-no_buildstamp.patch [email protected] -- Remove the buildstamp. -Patch0: audacity-no_buildstamp.patch -# PATCH-FIX-UPSTREAM audacity-no_return_in_nonvoid.patch - Fix false positive errors Two new gcc10 ones ignoring assert -Patch1: audacity-no_return_in_nonvoid.patch -# PATCH-FIX-OPENSUSE vst-system-path.patch - search fo vsts in /usr/lib64 in x86_64 and ARM system -Patch3: lib64-plugins-default-path.patch -BuildRequires: cmake >= 3.16 -BuildRequires: desktop-file-utils -%if 0%{?suse_version} < 1600 -BuildRequires: gcc12 -BuildRequires: gcc12-c++ -%else -BuildRequires: gcc +URL: https://audacityteam.org/ +Source: https://github.com/audacity/audacity/releases/download/Audacity-%{version}/audacity-sources-%{version}.tar.xz +Source1: audacity-extdeps-cache-%{version}.tar.xz +Source2: audacity-license-nyquist +Patch0: audacity-wxstring-untranslatable.patch +BuildRequires: cmake BuildRequires: gcc-c++ -%endif -#!BuildIgnore: gstreamer-0_10-plugins-base +BuildRequires: gettext +# The muse extdeps CMake machinery shells out to the git binary even for +# the offline source cache (resolve.cmake: _extdeps_populate_source). +BuildRequires: git +# Qt tools want an UTF-8 locale +BuildRequires: glibc-locale-base BuildRequires: hicolor-icon-theme -BuildRequires: libmp3lame-devel -BuildRequires: portmidi-devel -BuildRequires: wxWidgets-3_2-nostl-devel -BuildRequires: xz +BuildRequires: patchelf +BuildRequires: pkgconfig +BuildRequires: qt6-gui-private-devel +BuildRequires: utfcpp-devel +BuildRequires: wxWidgets-3_2-devel +BuildRequires: cmake(Qt6Concurrent) +BuildRequires: cmake(Qt6Core) +BuildRequires: cmake(Qt6Core5Compat) +BuildRequires: cmake(Qt6DBus) +BuildRequires: cmake(Qt6Gui) +BuildRequires: cmake(Qt6LinguistTools) +BuildRequires: cmake(Qt6Network) +BuildRequires: cmake(Qt6NetworkAuth) +BuildRequires: cmake(Qt6PrintSupport) +BuildRequires: cmake(Qt6Qml) +BuildRequires: cmake(Qt6Quick) +BuildRequires: cmake(Qt6QuickControls2) +BuildRequires: cmake(Qt6QuickWidgets) +BuildRequires: cmake(Qt6ShaderTools) +BuildRequires: cmake(Qt6StateMachine) +BuildRequires: cmake(Qt6Svg) +BuildRequires: cmake(Qt6Test) +BuildRequires: cmake(Qt6Widgets) +BuildRequires: cmake(Qt6Xml) +# rapidjson ships a CMake config but no pkgconfig file, so the +# package-name dependency stays instead of a pkgconfig one. BuildRequires: pkgconfig(RapidJSON) BuildRequires: pkgconfig(alsa) -BuildRequires: pkgconfig(expat) -BuildRequires: pkgconfig(flac) >= 1.3.1 +# CVE-2024-50602 fixed in expat 2.6.4; Factory ships newer, floor it. +BuildRequires: pkgconfig(expat) >= 2.6.4 +BuildRequires: pkgconfig(flac) BuildRequires: pkgconfig(flac++) -BuildRequires: pkgconfig(gtk+-3.0) -BuildRequires: pkgconfig(gtkmm-3.0) -BuildRequires: pkgconfig(id3tag) -BuildRequires: pkgconfig(id3tag) +BuildRequires: pkgconfig(freetype2) +BuildRequires: pkgconfig(harfbuzz) BuildRequires: pkgconfig(jack) -BuildRequires: pkgconfig(libavcodec) >= 51.53 -BuildRequires: pkgconfig(libavformat) >= 52.12 -BuildRequires: pkgconfig(libavutil) -BuildRequires: pkgconfig(libjpeg) +BuildRequires: pkgconfig(lame) BuildRequires: pkgconfig(libmpg123) -BuildRequires: pkgconfig(lilv-0) >= 0.24.6 -BuildRequires: pkgconfig(lv2) >= 1.16.0 -BuildRequires: pkgconfig(mad) +BuildRequires: pkgconfig(libpng16) +BuildRequires: pkgconfig(libpulse) +BuildRequires: pkgconfig(lilv-0) +BuildRequires: pkgconfig(lv2) BuildRequires: pkgconfig(ogg) BuildRequires: pkgconfig(opus) BuildRequires: pkgconfig(opusfile) BuildRequires: pkgconfig(portaudio-2.0) -BuildRequires: pkgconfig(serd-0) >= 0.30.2 -BuildRequires: pkgconfig(shared-mime-info) +BuildRequires: pkgconfig(pugixml) BuildRequires: pkgconfig(sndfile) -BuildRequires: pkgconfig(sord-0) >= 0.16.4 BuildRequires: pkgconfig(soundtouch) BuildRequires: pkgconfig(soxr) BuildRequires: pkgconfig(sqlite3) -BuildRequires: pkgconfig(sratom-0) >= 0.6.4 -BuildRequires: pkgconfig(suil-0) >= 0.10.6 +BuildRequires: pkgconfig(suil-0) BuildRequires: pkgconfig(twolame) BuildRequires: pkgconfig(uuid) -BuildRequires: pkgconfig(vamp-hostsdk) BuildRequires: pkgconfig(vorbis) BuildRequires: pkgconfig(vorbisenc) BuildRequires: pkgconfig(vorbisfile) BuildRequires: pkgconfig(wavpack) -BuildRequires: pkgconfig(xcb-cursor) -BuildRequires: pkgconfig(xcb-keysyms) -BuildRequires: pkgconfig(xcb-util) -BuildRequires: pkgconfig(xkbcommon-x11) -# WARNING lilv-0 >= 0.24.6;lv2 >= 1.16.0;serd-0 >= 0.30.2;sord-0 >= 0.16.4;sratom-0 >= 0.6.4;suil-0 >= 0.10.6 -# check these versions after every update otherwise audacity builds libsuil itself. - -# This would require to patch our portaudio package with "PortMixer"... an extra API that never got integrated in PortAudio. -#BuildRequires: portaudio-devel -Recommends: %{name}-lang +BuildRequires: pkgconfig(zix-0) +BuildRequires: pkgconfig(zlib) # Nothing provides libavutil without a suffix Requires: ffmpeg -Requires: libmp3lame0 -Provides: %{name}-plugins = %{version} -Obsoletes: %{name}-plugins <= 2.4.2 +Recommends: %{name}-lang +# No Provides/Obsoletes audacity-plugins: the 3.x plugin modules it stood +# for (mod-script-pipe et al. under the audacity libdir) are dropped in 4.0. # pipewire-libjack-0_3 replaces jack and when audacity loads it # causes a sigsev See https://bugzilla.suse.com/show_bug.cgi?id=1191585 -#Conflicts: pipewire-libjack-0_3 -#Doesn't build for 32 bit anymore -#error All sample block data is little endian...big endian not yet supported -ExcludeArch: i586 s390x +# i586: 32-bit no longer supported upstream. +# s390x, ppc64: big-endian; the au3 sample engine is little-endian only +# ("All sample block data is little endian...big endian not yet supported"). +# ppc64le, riscv64: little-endian but with no Audacity 4 build on record; +# excluded until verified, re-enable with a test build. +ExcludeArch: i586 s390x ppc64 ppc64le riscv64 %description Audacity is a program that manipulates digital audio wave forms. @@ -119,92 +119,92 @@ AU, IRCAM, MP, and Ogg Vorbis. Wave data larger than the available physical memory size can be edited. +%package -n libsbsms10 +Summary: Subband Sinusoidal Modeling Synthesis audio library +# No standalone sbsms in Factory: Audacity rebuilds the bundled sbsms +# 2.2.0 extdep and ships its runtime here; no -devel subpackage, the +# unversioned link is build-time only and removed at install time. + +%description -n libsbsms10 +Subband Sinusoidal Modeling Synthesis library for high-quality +time-stretching and pitch-shifting, rebuilt from the sources bundled +with Audacity (no standalone sbsms package in Factory). + %lang_package %prep -%setup -q -n %{name}-Audacity-%{version} +%setup -q -n audacity-%{version} +# Offline extdeps source cache, see +# buildscripts/cmake/PrepareDepsSources.cmake ("offline/distro builds"). +# EXTDEPS_CACHE=... is exported at build time. +mkdir -p .extdeps-cache +tar -xf %{SOURCE1} -C .extdeps-cache %patch -P 0 -p1 -%patch -P 1 -p1 - -%ifarch x86_64 aarch64 -%patch -P 3 -p1 -%endif - -cp -f %{SOURCE1} LICENSE_NYQUIST.txt -# Make sure we use the system versions. -rm -rf lib-src/{expat,libvamp,libsoxr,ffmpeg,lame}/ - -#Included in src/AboutDialog.cpp but not supplied -touch include/RevisionIdent.h - -%if %{with vst3} -tar xf %{SOURCE3} --strip-components=1 --one-top-level=vst3sdk -%endif %build -%if 0%{?suse_version} < 1600 -export CC=gcc-12 -export CXX=g++-12 -%endif -if ! test -e %{_libdir}/pkgconfig/lame.pc -then -export PKG_CONFIG_PATH="`echo $PWD`:%{_libdir}/pkgconfig" -fi -export CFLAGS="%{optflags} -fno-strict-aliasing -ggdb $(wx-config --cflags)" - +export EXTDEPS_CACHE="%{_builddir}/audacity-%{version}/.extdeps-cache" +export LC_ALL=C.UTF-8 +export LANG=C.UTF-8 %cmake \ - -DAUDACITY_REV_TIME=$(date -u -d "@${SOURCE_DATE_EPOCH}" "+%Y-%m-%dT%H:%M:%SZ") \ - -DAUDACITY_REV_LONG=%{version} \ - -DAUDACITY_BUILD_LEVEL=2 \ - -DCMAKE_MODULE_LINKER_FLAGS:STRING="$(wx-config --libs)" \ - -DCMAKE_SHARED_LINKER_FLAGS:STRING="$(wx-config --libs)" \ - -Daudacity_conan_enabled=Off \ - -Daudacity_has_networking:BOOL=Off \ - -Daudacity_lib_preference:STRING=system \ - -Duse_lame:STRING=system \ - -Daudacity_use_ffmpeg:STRING=loaded \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DQT_QML_NO_CACHEGEN=ON \ + -DAU4_BUILD_MODE=release \ + -DAU4_BUILD_CONFIGURATION=app \ + -DEXTDEPS_OVERRIDE_ALL=SYSTEM \ + -DEXTDEPS_OVERRIDE_SBSMS=REBUILD \ + -DEXTDEPS_OVERRIDE_VST3SDK=REBUILD \ + -DMUSE_ENABLE_UNIT_TESTS=OFF \ + -DMUSE_MODULE_UPDATE=OFF \ %if %{without vst3} - -Daudacity_has_vst3=off \ + -DAU_MODULE_EFFECTS_VST=OFF \ + -DMUSE_MODULE_VST=OFF \ %endif - -DVST3_DEFAULT_INSTALL_PATH=%{_libdir}/vst3/ - + -DAU_MODULE_EFFECTS_LV2=ON \ + -DAU_USE_LIBCURL=OFF \ + -Wno-dev %cmake_build %install %cmake_install +cp -f %{SOURCE2} LICENSE_NYQUIST.txt +# The bundled sbsms extdep bakes its build-tree lib dir into the binary +# as RPATH; the shipped /usr/lib64/libsbsms.so.10 is found via the +# default search path, so drop it. No -devel subpackage: remove the +# unversioned link (build-time only, already linked). +patchelf --remove-rpath %{buildroot}%{_bindir}/%{name} +# The bundled sbsms extdep installs its licenses to a nonstandard prefix; +# relocate them with the other licenses (this also removes the stray dir). +mkdir -p %{buildroot}%{_licensedir}/%{name}-sbsms +mv %{buildroot}%{_prefix}/licenses/sbsms/COPYING %{buildroot}%{_prefix}/licenses/sbsms/LICENSE %{buildroot}%{_licensedir}/%{name}-sbsms/ +rmdir %{buildroot}%{_prefix}/licenses/sbsms %{buildroot}%{_prefix}/licenses +rm %{buildroot}%{_libdir}/libsbsms.so +%find_lang %{name} --with-qt -# E-mail wrote to [email protected]. -mkdir -p %{buildroot}%{_datadir}/icons/hicolor/48x48/mimetypes/ -mv -f %{buildroot}%{_datadir}/pixmaps/gnome-mime-application-x-audacity-project.xpm \ - %{buildroot}%{_datadir}/icons/hicolor/48x48/mimetypes/application-x-audacity-project.xpm -rm -rf %{buildroot}%{_datadir}/pixmaps/ -rm -rf %{buildroot}%{_datadir}/doc - -%find_lang %{name} - -%post -ldconfig %{_libdir}/%{name} -%end - -%postun -ldconfig %{_libdir}/%{name} -%end +# No "check" section: upstream unit tests compile only with +# MUSE_ENABLE_UNIT_TESTS=ON (set OFF above), so nothing runnable ships. + +%ldconfig_scriptlets -n libsbsms10 %files -%defattr(-,root,root) %doc README.md %license LICENSE.txt LICENSE_NYQUIST.txt %{_bindir}/%{name} -%{_libdir}/%{name} -%{_libdir}/%{name}/modules/mod-script-pipe.so %{_datadir}/%{name}/ -%{_datadir}/applications/%{name}.desktop +# Upstream 4.x installs its data under a versioned dir +%dir %{_datadir}/audacity-4.0/ +%dir %{_datadir}/audacity-4.0/locale/ +%{_datadir}/audacity-4.0/locale/languages.json +%{_datadir}/audacity-4.0/workspaces/ +%{_datadir}/applications/org.audacityteam.Audacity.desktop %{_datadir}/icons/hicolor/* -%{_datadir}/mime/packages/%{name}.xml -%{_mandir}/man?/%{name}.?%{?ext_man} -%dir %{_datadir}/metainfo/ -%{_datadir}/metainfo/%{name}.appdata.xml +%{_datadir}/metainfo/org.audacityteam.Audacity.appdata.xml +%{_datadir}/mime/packages/audacity.xml + +%files -n libsbsms10 +%license %{_licensedir}/%{name}-sbsms/COPYING +%license %{_licensedir}/%{name}-sbsms/LICENSE +%dir %{_licensedir}/%{name}-sbsms/ +%{_libdir}/libsbsms.so.10* %files lang -f %{name}.lang -%defattr(-,root,root) ++++++ audacity-license-nyquist ++++++ --- /var/tmp/diff_new_pack.bBde6X/_old 2026-11-11 16:24:58.231968258 +0100 +++ /var/tmp/diff_new_pack.bBde6X/_new 2026-11-11 16:24:58.235968426 +0100 @@ -1,34 +1,117 @@ -There are a number of files under the nyquist subdirectory, which -carry a non-commercial license : +LICENSE INFORMATION -lib-src/libnyquist/nyquist/xlisp/xlcont.c -lib-src/libnyquist/nyquist/xlisp/xldbug.c -lib-src/libnyquist/nyquist/xlisp/xldmem.c -lib-src/libnyquist/nyquist/xlisp/xleval.c -lib-src/libnyquist/nyquist/xlisp/xlfio.c -lib-src/libnyquist/nyquist/xlisp/xlftab.c -lib-src/libnyquist/nyquist/xlisp/xlimage.c -lib-src/libnyquist/nyquist/xlisp/xlinit.c -lib-src/libnyquist/nyquist/xlisp/xlio.c -lib-src/libnyquist/nyquist/xlisp/xlisp.c -lib-src/libnyquist/nyquist/xlisp/xlisp.h -lib-src/libnyquist/nyquist/xlisp/xlmath.c -lib-src/libnyquist/nyquist/xlisp/xlobj.c -lib-src/libnyquist/nyquist/xlisp/xlprin.c -lib-src/libnyquist/nyquist/xlisp/xlread.c -lib-src/libnyquist/nyquist/xlisp/xlstr.c -lib-src/libnyquist/nyquist/xlisp/xlsys.c - -To clarify this licensing here is the response from David: - -"The copyright notices in the source code are intended to suggest that -non-commercial users need not contact me for permission. It is granted -in the source code comments. Originally, commercial users needed -a license and in some cases paid a fee. Now, commercial use is governed -by a BSD-like license as you've mentioned. I guess I should at least -update my copies of the source files to say that but I have no control -over what is floating around the net. +Nyquist is built upon and derived from XLISP. Both are copyrighted software. +Two copyright notices and licenses appear below. -David Betz" +In addition, Nyquist uses two LGPL libraries: libsndfile and liblo. +These libraries are NOT covered by the Nyquist license, and Nyquist +is NOT licensed under or restricted by GPL or LGPL licenses. The +license agreements for libsndfile and liblo can be found in the +Nyquist source libraries nyquist/nylsf and nyquist/liblo, respectively. +-------------------------------------------------------------------------------- +COPYRIGHT AND LICENSE INFORMATION FOR NYQUIST + +Copyright (c) 2000-2002, by Roger B. Dannenberg +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list +of conditions and the following disclaimer. + +Redistributions of source code must retain the copyright notice, the +list of conditions, and the disclaimer, all three of which appear below under +"COPYRIGHT AND LICENSE INFORMATION FOR XLISP." + +Redistributions in binary form must reproduce the above copyright notice, this +list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +Redistributions in binary form must reproduce the copyright notice, the +list of conditions, and the disclaimer, all three of which appear below under +"COPYRIGHT AND LICENSE INFORMATION FOR XLISP," in the documentation and/or +other materials provided with the distribution. + +Neither the name of Roger B. Dannenberg, Carnegie Mellon University, nor the +names of any contributors may be used to endorse or promote products derived +from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +What follows is not a part of the license: + +Please send bug fixes and improvements to me at the address below. + +Please do not distribute modified versions of Nyquist without permission. + +Any redistribution of Nyquist should include a notice that Nyquist can be +obtained free from http://www.cs.cmu.edu/~music. + +In addition, as a courtesy, I ask that you send me a copy of any product that +makes substantial use of Nyquist. Please contact me at the address below for my +current mailing address. I am asking this because I enjoy learning about +applications of my software. + +When Nyquist is used to generate music and conduct research, please mention +and acknowledge the use of Nyquist in program notes, acknowledgement sections +of papers, and whereever thanks or credits would normally be given. + +Roger B. Dannenberg + [email protected] + +-------------------------------------------------------------------------------- +COPYRIGHT AND LICENSE INFORMATION FOR XLISP + +Copyright (c) 1984-2002, by David Michael Betz +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list +of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this +list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +Neither the name of David Michael Betz nor the names of any contributors may be +used to endorse or promote products derived from this software without specific +prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +What follows is not a part of the license: + +Please send bug fixes and improvements to me at the address below. + +In addition, as a courtesy, I ask that you send me a copy of any product that +makes substantial use of XLISP. Please contact me at the address below for my +current mailing address. I am asking this because I enjoy learning about +applications of my software. + +David Betz + [email protected] ++++++ audacity-wxstring-untranslatable.patch ++++++ au3 passes wxString to APIs taking (const char*) or (const wxChar*) in several places -- TranslatableString::untranslatable() (which only overloads on (const char*) and (const QString&)), sqlite3_exec()/ sqlite3_prepare_v2()/GetValue() (which take UTF-8 SQL strings), SettingsVisitorBase::Define() and ExportFFmpegOptions:: FetchCompatibleCodecList() (whose key/format parameters are const wxChar*), Nyquist cvstring() (which takes const char*), and a (const char*) cast. That compiles only when wxWidgets still allows the unsafe implicit wxString conversion (wxUSE_UNSAFE_WXSTRING_CONV); with it disabled (e.g. openSUSE wxWidgets 3.2) it is a hard error: error: no matching function for call to 'TranslatableString::untranslatable(wxString&)' error: cannot convert 'wxString' to 'const char*' error: invalid cast from type 'wxString' to type 'const char*' Route the TranslatableString arguments through the au3::untranslatable( const wxString&) bridge from WxMuseStringCompat.h -- the same idiom Internat.h's Verbatim(const wxString&) already uses --, convert the sqlite3 SQL strings explicitly with .ToUTF8().data() (the idiom ProjectFileIO.cpp already uses for sqlite3_open_v2), and pass setting keys as static_cast<const wxChar*>(key.c_str()) (the idiom NyquistBase already uses for the other Define() call sites). UTF-8 round-trip preserves non-ASCII names on every platform. Call sites passing (const char*), (const XML_Char*), char arrays, string literals, or wxCharBuffer-returning .mb_str()/.fn_str()/.ToUTF8() are left untouched. PATCH-FIX-UPSTREAM: upstream relies on wxUSE_UNSAFE_WXSTRING_CONV. Index: audacity-4.0.1/au3/libraries/au3-audio-io/AudioIO.cpp =================================================================== --- audacity-4.0.1.orig/au3/libraries/au3-audio-io/AudioIO.cpp +++ audacity-4.0.1/au3/libraries/au3-audio-io/AudioIO.cpp @@ -1228,7 +1228,7 @@ StartStreamCleanup(); // PRL: PortAudio error messages are sadly not internationalized BasicUI::ShowMessageBox( - TranslatableString::untranslatable(LAT1CTOWX(Pa_GetErrorText(err)))); + au3::untranslatable(LAT1CTOWX(Pa_GetErrorText(err)))); return 0; } } Index: audacity-4.0.1/au3/libraries/au3-builtin-effects/EqualizationBase.cpp =================================================================== --- audacity-4.0.1.orig/au3/libraries/au3-builtin-effects/EqualizationBase.cpp +++ audacity-4.0.1/au3/libraries/au3-builtin-effects/EqualizationBase.cpp @@ -114,9 +114,9 @@ const wxString nameFreq = wxString::Format("f%i", point); const wxString nameVal = wxString::Format("v%i", point); visitor.Define( - curves[0].points[point].Freq, nameFreq, 0.0, 0.0, 0.0, 0.0); + curves[0].points[point].Freq, static_cast<const wxChar*>(nameFreq.c_str()), 0.0, 0.0, 0.0, 0.0); visitor.Define( - curves[0].points[point].dB, nameVal, 0.0, 0.0, 0.0, 0.0); + curves[0].points[point].dB, static_cast<const wxChar*>(nameVal.c_str()), 0.0, 0.0, 0.0, 0.0); } } return true; @@ -137,8 +137,8 @@ const wxString nameVal = wxString::Format("v%i", i); double f = -1000.0; double d = 0.0; - visitor.Define(f, nameFreq, 0.0, -10000.0, 1000000.0, 0.0); - visitor.Define(d, nameVal, 0.0, -10000.0, 10000.0, 0.0); + visitor.Define(f, static_cast<const wxChar*>(nameFreq.c_str()), 0.0, -10000.0, 1000000.0, 0.0); + visitor.Define(d, static_cast<const wxChar*>(nameVal.c_str()), 0.0, -10000.0, 10000.0, 0.0); if (f <= 0.0) { break; } Index: audacity-4.0.1/au3/libraries/au3-cloud-audiocom/sync/MixdownUploader.cpp =================================================================== --- audacity-4.0.1.orig/au3/libraries/au3-cloud-audiocom/sync/MixdownUploader.cpp +++ audacity-4.0.1/au3/libraries/au3-cloud-audiocom/sync/MixdownUploader.cpp @@ -186,7 +186,7 @@ BasicUI::CallAfter( [this, message = error.What()] { - ShowExportErrorDialog(TranslatableString::untranslatable(message), TranslatableString("cloud-audiocom", "Export failed"), true); + ShowExportErrorDialog(au3::untranslatable(message), TranslatableString("cloud-audiocom", "Export failed"), true); }); } Index: audacity-4.0.1/au3/libraries/au3-components/ComponentInterfaceSymbol.h =================================================================== --- audacity-4.0.1.orig/au3/libraries/au3-components/ComponentInterfaceSymbol.h +++ audacity-4.0.1/au3/libraries/au3-components/ComponentInterfaceSymbol.h @@ -35,12 +35,12 @@ // Allows implicit construction from an internal string re-used as a msgid ComponentInterfaceSymbol(const wxString& internal) - : mInternal{internal}, mMsgid{::TranslatableString::untranslatable(internal)} + : mInternal{internal}, mMsgid{au3::untranslatable(internal)} {} // Allows implicit construction from an internal string re-used as a msgid ComponentInterfaceSymbol(const wxChar* msgid) - : mInternal{msgid}, mMsgid{::TranslatableString::untranslatable(wxString(msgid))} + : mInternal{msgid}, mMsgid{au3::untranslatable(wxString(msgid))} {} // Two-argument version distinguishes internal from translatable string Index: audacity-4.0.1/au3/libraries/au3-import-export/ExportProgressUI.h =================================================================== --- audacity-4.0.1.orig/au3/libraries/au3-import-export/ExportProgressUI.h +++ audacity-4.0.1/au3/libraries/au3-import-export/ExportProgressUI.h @@ -42,7 +42,7 @@ } catch (ExportException& e) { - BasicUI::ShowMessageBox(TranslatableString::untranslatable(e.What())); + BasicUI::ShowMessageBox(au3::untranslatable(e.What())); } catch (...) { Index: audacity-4.0.1/au3/libraries/au3-module-manager/PluginManager.cpp =================================================================== --- audacity-4.0.1.orig/au3/libraries/au3-module-manager/PluginManager.cpp +++ audacity-4.0.1/au3/libraries/au3-module-manager/PluginManager.cpp @@ -470,7 +470,7 @@ auto message = TranslatableString( "module-manager", "Enable this plug-in?\n", "plug-ins", static_cast<int>(nIds)); for (const auto& name : names) { - message.Join(TranslatableString::untranslatable(name), "\n"); + message.Join(au3::untranslatable(name), "\n"); } bool enable = (MessageBoxResult::Yes == ShowMessageBox( message, Index: audacity-4.0.1/au3/libraries/au3-nyquist-effects/NyquistBase.cpp =================================================================== --- audacity-4.0.1.orig/au3/libraries/au3-nyquist-effects/NyquistBase.cpp +++ audacity-4.0.1/au3/libraries/au3-nyquist-effects/NyquistBase.cpp @@ -104,7 +104,7 @@ mFileName = fName; // Use the file name verbatim as effect name. // This is only a default name, overridden if we find a $name line: - mName = TranslatableString::untranslatable(mFileName.GetName()); + mName = au3::untranslatable(mFileName.GetName()); mFileModified = mFileName.GetModificationTime(); ParseFile(); @@ -280,7 +280,7 @@ ctrl.choices.data(), ctrl.choices.size()); } else if (ctrl.type == NYQ_CTRL_STRING || ctrl.type == NYQ_CTRL_FILE) { visitor.Define( - ctrl.valStr, ctrl.var, wxString {}, ctrl.lowStr, ctrl.highStr); + ctrl.valStr, static_cast<const wxChar*>(ctrl.var.c_str()), wxString {}, ctrl.lowStr, ctrl.highStr); // parms.Write(ctrl.var, ctrl.valStr); } } @@ -1439,7 +1439,7 @@ // Assume the string has already been translated within the Lisp runtime // if necessary, by one of the gettext functions defined below, before it // is communicated back to C++ - auto msg = TranslatableString::untranslatable(NyquistToWxString(nyx_get_string())); + auto msg = au3::untranslatable(NyquistToWxString(nyx_get_string())); if (!msg.empty()) { // Empty string may be used as a No-Op return value. if (!isOk) { mLastError = msg.Translation(); @@ -1726,7 +1726,7 @@ extensions.push_back(ext); } } - results.push_back({ TranslatableString::untranslatable(pieces[ii]), extensions }); + results.push_back({ au3::untranslatable(pieces[ii]), extensions }); } } return results; @@ -1776,7 +1776,7 @@ // would make the effectId differ from the URL-captured one and break // plugin lookup. Display labels are translated separately at dialog // time (convertControl in nyquistparameterextractorservice.cpp). - return TranslatableString::untranslatable(unquoted); + return au3::untranslatable(unquoted); } else if ( allowParens && len >= 2 && s[0] == wxT('(') && s[len - 1] == wxT(')')) { Tokenizer tzer; @@ -1800,7 +1800,7 @@ } } else { // If string was not quoted, assume no translation exists - return TranslatableString::untranslatable(s); + return au3::untranslatable(s); } } @@ -2080,17 +2080,17 @@ if (name.EndsWith(wxT("..."))) { name = name.RemoveLast(3); } - mName = TranslatableString::untranslatable(name); + mName = au3::untranslatable(name); return true; } if (len >= 2 && tokens[0] == wxT("action")) { - mAction = TranslatableString::untranslatable(UnQuote(tokens[1])); + mAction = au3::untranslatable(UnQuote(tokens[1])); return true; } if (len >= 2 && tokens[0] == wxT("info")) { - mInfo = TranslatableString::untranslatable(UnQuote(tokens[1])); + mInfo = au3::untranslatable(UnQuote(tokens[1])); return true; } @@ -2139,18 +2139,18 @@ } if (len >= 2 && tokens[0] == wxT("author")) { - mAuthor = TranslatableString::untranslatable(UnQuote(tokens[1])); + mAuthor = au3::untranslatable(UnQuote(tokens[1])); return true; } if (len >= 2 && tokens[0] == wxT("release")) { // Value must be quoted if the release version string contains spaces. - mReleaseVersion = TranslatableString::untranslatable(UnQuote(tokens[1])); + mReleaseVersion = au3::untranslatable(UnQuote(tokens[1])); return true; } if (len >= 2 && tokens[0] == wxT("copyright")) { - mCopyright = TranslatableString::untranslatable(UnQuote(tokens[1])); + mCopyright = au3::untranslatable(UnQuote(tokens[1])); return true; } @@ -2732,7 +2732,7 @@ LVAL success; wxString Left = Str.BeforeLast('\n').BeforeLast('\n').ToAscii(); wxString Right = Str.BeforeLast('\n').AfterLast('\n').ToAscii(); - message = cvstring(Left); + message = cvstring(Left.ToUTF8()); success = Right.EndsWith("OK") ? s_true : nullptr; dst = cons(message, success); return (void*)dst; Index: audacity-4.0.1/au3/libraries/au3-project-file-io/DBConnection.cpp =================================================================== --- audacity-4.0.1.orig/au3/libraries/au3-project-file-io/DBConnection.cpp +++ audacity-4.0.1/au3/libraries/au3-project-file-io/DBConnection.cpp @@ -392,7 +392,7 @@ sql.Replace(wxT("<schema>"), schema); // Set the configuration - rc = sqlite3_exec(db, sql, nullptr, nullptr, nullptr); + rc = sqlite3_exec(db, sql.ToUTF8().data(), nullptr, nullptr, nullptr); if (rc != SQLITE_OK) { ADD_EXCEPTION_CONTEXT("sqlite3.rc", std::to_string(rc)); ADD_EXCEPTION_CONTEXT("sqlite3.context", "DBConnection::ModeConfig"); @@ -625,7 +625,7 @@ char* errmsg = nullptr; int rc = sqlite3_exec(mConnection.DB(), - wxT("SAVEPOINT ") + name + wxT(";"), + (wxT("SAVEPOINT ") + name + wxT(";")).ToUTF8().data(), nullptr, nullptr, &errmsg); @@ -649,7 +649,7 @@ char* errmsg = nullptr; int rc = sqlite3_exec(mConnection.DB(), - wxT("RELEASE ") + name + wxT(";"), + (wxT("RELEASE ") + name + wxT(";")).ToUTF8().data(), nullptr, nullptr, &errmsg); @@ -673,7 +673,7 @@ char* errmsg = nullptr; int rc = sqlite3_exec(mConnection.DB(), - wxT("ROLLBACK TO ") + name + wxT(";"), + (wxT("ROLLBACK TO ") + name + wxT(";")).ToUTF8().data(), nullptr, nullptr, &errmsg); Index: audacity-4.0.1/au3/libraries/au3-project-file-io/ProjectFileIO.cpp =================================================================== --- audacity-4.0.1.orig/au3/libraries/au3-project-file-io/ProjectFileIO.cpp +++ audacity-4.0.1/au3/libraries/au3-project-file-io/ProjectFileIO.cpp @@ -839,7 +839,7 @@ sql.Printf(ProjectFileSchema, ProjectFileID, ProjectSchemaVersion.GetPacked()); sql.Replace("<schema>", schema); - rc = sqlite3_exec(db, sql, nullptr, nullptr, nullptr); + rc = sqlite3_exec(db, sql.ToUTF8().data(), nullptr, nullptr, nullptr); if (rc != SQLITE_OK) { SetDBError( TranslatableString("project-file-io", "Unable to initialize the project file") @@ -906,7 +906,7 @@ auto sql = wxString::Format( "DELETE FROM sampleblocks WHERE %sinset(blockid);", complement ? "NOT " : ""); - rc = sqlite3_exec(db, sql, nullptr, nullptr, nullptr); + rc = sqlite3_exec(db, sql.ToUTF8().data(), nullptr, nullptr, nullptr); if (rc != SQLITE_OK) { ADD_EXCEPTION_CONTEXT("sqlite3.query", sql.ToStdString()); ADD_EXCEPTION_CONTEXT("sqlite3.rc", std::to_string(rc)); @@ -1046,7 +1046,7 @@ dbName.Replace("'", "''"); sql.Printf("ATTACH DATABASE '%s' AS outbound;", dbName.ToUTF8()); - rc = sqlite3_exec(db, sql, nullptr, nullptr, nullptr); + rc = sqlite3_exec(db, sql.ToUTF8().data(), nullptr, nullptr, nullptr); if (rc != SQLITE_OK) { SetDBError( TranslatableString("project-file-io", "Unable to attach destination database") @@ -1683,7 +1683,7 @@ =/*: %1 is the project number, %2 is the project name.*/ TranslatableString("project-file-io", "[Project %1] Audacity “%2”") .Format(number + 1, - name.empty() ? TranslatableString("project-file-io", "<untitled>") : TranslatableString::untranslatable((const char*)name)) + name.empty() ? TranslatableString("project-file-io", "<untitled>") : au3::untranslatable(name)) .Translation(); } // If we are not showing numbers, then <untitled> shows as 'Audacity'. @@ -2011,7 +2011,7 @@ const wxString rowIDSql =wxString::Format("SELECT ROWID FROM %s.%s WHERE id = 1;", schema, table); - if (!GetValue(rowIDSql, rowID, true)) { + if (!GetValue(rowIDSql.ToUTF8().data(), rowID, true)) { ADD_EXCEPTION_CONTEXT("sqlite3.rc", std::to_string(sqlite3_errcode(db))); ADD_EXCEPTION_CONTEXT("sqlite3.context", "ProjectGileIO::WriteDoc::rowid"); Index: audacity-4.0.1/au3/libraries/au3-strings/Languages.cpp =================================================================== --- audacity-4.0.1.orig/au3/libraries/au3-strings/Languages.cpp +++ audacity-4.0.1/au3/libraries/au3-strings/Languages.cpp @@ -210,7 +210,7 @@ auto str = wxString::FromUTF8(utf8Name); auto code = str.BeforeFirst(' '); auto name = str.AfterFirst(' '); - localLanguageName[code] = TranslatableString::untranslatable(name); + localLanguageName[code] = au3::untranslatable(name); } return localLanguageName; }(); @@ -240,7 +240,7 @@ wxString fullCode = info->CanonicalName; wxString code = fullCode.Left(2); - auto name = TranslatableString::untranslatable(info->Description); + auto name = au3::untranslatable(info->Description); // Logic: Languages codes are sometimes hierarchical, with a // general language code and then a subheading. For example, Index: audacity-4.0.1/au3/modules/import-export/mod-ffmpeg/ExportFFmpeg.cpp =================================================================== --- audacity-4.0.1.orig/au3/modules/import-export/mod-ffmpeg/ExportFFmpeg.cpp +++ audacity-4.0.1/au3/modules/import-export/mod-ffmpeg/ExportFFmpeg.cpp @@ -1599,7 +1599,7 @@ int label = sampRates[i]; if ((!lowrate || label >= lowrate) && (!highrate || label <= highrate)) { wxString name = wxString::Format(wxT("%d"), label); - choices.push_back(TranslatableString::untranslatable(name)); + choices.push_back(au3::untranslatable(name)); if (label <= rate) { selected = i; } Index: audacity-4.0.1/au3/modules/import-export/mod-ffmpeg/ExportFFmpegOptions.cpp =================================================================== --- audacity-4.0.1.orig/au3/modules/import-export/mod-ffmpeg/ExportFFmpegOptions.cpp +++ audacity-4.0.1/au3/modules/import-export/mod-ffmpeg/ExportFFmpegOptions.cpp @@ -892,7 +892,7 @@ } } - FetchCompatibleCodecList(selcdcid, wxString(format)); + FetchCompatibleCodecList(selcdcid, static_cast<const wxChar*>(wxString(format).c_str())); return; } Index: audacity-4.0.1/au3/modules/import-export/mod-ffmpeg/FFmpeg.cpp =================================================================== --- audacity-4.0.1.orig/au3/modules/import-export/mod-ffmpeg/FFmpeg.cpp +++ audacity-4.0.1/au3/modules/import-export/mod-ffmpeg/FFmpeg.cpp @@ -63,7 +63,7 @@ auto ffmpeg = FFmpegFunctions::Load(); if (ffmpeg) { - return TranslatableString::untranslatable(wxString::Format( + return au3::untranslatable(wxString::Format( wxT("F(%d.%d.%d),C(%d.%d.%d),U(%d.%d.%d)"), ffmpeg->AVFormatVersion.Major, ffmpeg->AVFormatVersion.Minor, ffmpeg->AVFormatVersion.Micro, ffmpeg->AVCodecVersion.Major, ffmpeg->AVCodecVersion.Minor, ffmpeg->AVCodecVersion.Micro, Index: audacity-4.0.1/au3/modules/import-export/mod-mp3/ExportMP3.cpp =================================================================== --- audacity-4.0.1.orig/au3/modules/import-export/mod-mp3/ExportMP3.cpp +++ audacity-4.0.1/au3/modules/import-export/mod-mp3/ExportMP3.cpp @@ -1738,7 +1738,7 @@ #ifndef DISABLE_DYNAMIC_LOADING_LAME if (exporter.LoadEncoderLibrary(prompt ? MP3Exporter::Yes : MP3Exporter::No)) { #endif // DISABLE_DYNAMIC_LOADING_LAME - versionString = TranslatableString::untranslatable(exporter.GetLibraryVersion()); + versionString = au3::untranslatable(exporter.GetLibraryVersion()); #ifdef MP3_EXPORT_BUILT_IN versionString.Join(TranslatableString("import-export", "(Built-in)"), " "); #endif Index: audacity-4.0.1/au3/modules/import-export/mod-pcm/ExportPCM.cpp =================================================================== --- audacity-4.0.1.orig/au3/modules/import-export/mod-pcm/ExportPCM.cpp +++ audacity-4.0.1/au3/modules/import-export/mod-pcm/ExportPCM.cpp @@ -110,7 +110,7 @@ if (sf_format_check(&info)) { // Store subtype and name values.emplace_back(sub); - names.push_back(TranslatableString::untranslatable(sf_encoding_index_name(i))); + names.push_back(au3::untranslatable(sf_encoding_index_name(i))); } } } @@ -213,7 +213,7 @@ default: { typeOption.values.emplace_back(type); - typeOption.names.push_back(TranslatableString::untranslatable(sf_header_index_name(i))); + typeOption.names.push_back(au3::untranslatable(sf_header_index_name(i))); ExportOption encodingOption { type, TranslatableString("import-export", "Encoding"), Index: audacity-4.0.1/au3/modules/import-export/mod-pcm/ImportPCM.cpp =================================================================== --- audacity-4.0.1.orig/au3/modules/import-export/mod-pcm/ImportPCM.cpp +++ audacity-4.0.1/au3/modules/import-export/mod-pcm/ImportPCM.cpp @@ -234,7 +234,7 @@ ); auto untranslated = SFCall<wxString>(sf_header_name, mInfo.format); - return TranslatableString::untranslatable(untranslated); + return au3::untranslatable(untranslated); } double PCMImportFileHandle::GetDuration() const
