rebuilt by autoport with build requirements: libfltk-devel>=0:1.4.4-1mamba [release 3.0.6-3mamba;Fri Aug 01 2025]

This commit is contained in:
2026-01-22 13:39:16 +01:00
parent a8d5fe12c5
commit fa014e867d
3 changed files with 351 additions and 35 deletions

View File

@@ -0,0 +1,10 @@
--- zynaddsubfx-3.0.6/src/UI/MasterUI.fl.orig 2025-08-02 10:55:18.877392424 +0200
+++ zynaddsubfx-3.0.6/src/UI/MasterUI.fl 2025-08-02 10:56:43.221530857 +0200
@@ -1594,7 +1594,6 @@
configui=new ConfigUI(osc);
make_window();
-fl_open_display();
\#if !defined(PLUGINVERSION) && defined(FLTK_GUI)
Fl_Pixmap *pixmap = new Fl_Pixmap(zynaddsubfx_xpm);

View File

@@ -0,0 +1,322 @@
From f57e0ce3a56ab508cce8946f78c94de91ed9c313 Mon Sep 17 00:00:00 2001
From: Johannes Lorenz <j.git@lorenz-ho.me>
Date: Sun, 12 Jan 2025 15:33:11 +0100
Subject: [PATCH] Support MXML4, if available
Improve comments
MXML4: Free memory
Fixup test, so it works on mxml3 and 4
Fix MessageTest for MXML4
---
src/CMakeLists.txt | 5 ++-
src/Misc/XMLwrapper.cpp | 93 +++++++++++++++++++++++++++++++--------
src/Tests/MessageTest.cpp | 16 +++----
src/Tests/PluginTest.cpp | 21 ++++++++-
4 files changed, 104 insertions(+), 31 deletions(-)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 396f28fee..555825d42 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -33,7 +33,10 @@ if(PKG_CONFIG_FOUND AND NOT (${CMAKE_SYSTEM_NAME} STREQUAL "Windows"))
pkg_check_modules(NTK_IMAGES ntk_images)
pkg_check_modules(FFTW3F REQUIRED fftw3f)
- pkg_check_modules(MXML REQUIRED mxml)
+ pkg_check_modules(MXML mxml4)
+ if(NOT MXML_FOUND)
+ pkg_check_modules(MXML REQUIRED mxml)
+ endif()
pkg_search_module(LASH lash-1.0)
mark_as_advanced(LASH_LIBRARIES)
diff --git a/src/Misc/XMLwrapper.cpp b/src/Misc/XMLwrapper.cpp
index e1c55a495..b34c843cc 100644
--- a/src/Misc/XMLwrapper.cpp
+++ b/src/Misc/XMLwrapper.cpp
@@ -32,9 +32,30 @@ namespace zyn {
int xml_k = 0;
bool verbose = false;
-const char *XMLwrapper_whitespace_callback(mxml_node_t *node, int where)
+#if MXML_MAJOR_VERSION <= 3
+// Mimic datatypes present in mxml4 for compatibility
+typedef int mxml_ws_t;
+typedef int mxml_descend_t;
+// Mimic typenames present in mxml4 for compatibility
+constexpr int MXML_DESCEND_ALL = MXML_DESCEND;
+constexpr int MXML_DESCEND_NONE = MXML_NO_DESCEND;
+constexpr int MXML_TYPE_OPAQUE = MXML_OPAQUE;
+constexpr int MXML_TYPE_ELEMENT = MXML_ELEMENT;
+constexpr int MXML_TYPE_TEXT = MXML_TEXT;
+#endif
+
+const char *XMLwrapper_whitespace_callback(void*, mxml_node_t *node, mxml_ws_t where)
{
+#if MXML_MAJOR_VERSION >= 4
+ // New node types in MXL4
+ if(mxmlGetDirective(node)) // "?xml" directive
+ return "\n";
+ else if(mxmlGetDeclaration(node)) // "!DOCTYPE" declaration
+ return nullptr;
+#endif
+
const char *name = mxmlGetElement(node);
+ assert(name);
if((where == MXML_WS_BEFORE_OPEN) && (!strcmp(name, "?xml")))
return NULL;
@@ -67,13 +88,21 @@ const char *XMLwrapper_whitespace_callback(mxml_node_t *node, int where)
return 0;
}
+#if MXML_MAJOR_VERSION <= 3
+// Wrapper, because int and mxml_ws_t are different types
+inline const char *XMLwrapper_whitespace_callback(mxml_node_t *node, int where)
+{
+ return XMLwrapper_whitespace_callback(nullptr, node, where);
+}
+#endif
+
//temporary const overload of mxmlFindElement
const mxml_node_t *mxmlFindElement(const mxml_node_t *node,
const mxml_node_t *top,
const char *name,
const char *attr,
const char *value,
- int descend)
+ mxml_descend_t descend)
{
return const_cast<const mxml_node_t *>(mxmlFindElement(
const_cast<mxml_node_t *>(node),
@@ -92,16 +121,22 @@ XMLwrapper::XMLwrapper()
minimal = true;
SaveFullXml=false;
- node = tree = mxmlNewElement(MXML_NO_PARENT,
- "?xml version=\"1.0f\" encoding=\"UTF-8\"?");
+ node = tree = mxmlNewXML("1.0");
+ assert(node);
/* for mxml 2.1f (and older)
tree=mxmlNewElement(MXML_NO_PARENT,"?xml");
mxmlElementSetAttr(tree,"version","1.0f");
mxmlElementSetAttr(tree,"encoding","UTF-8");
*/
- mxml_node_t *doctype = mxmlNewElement(tree, "!DOCTYPE");
- mxmlElementSetAttr(doctype, "ZynAddSubFX-data", NULL);
+ mxml_node_t *doctype =
+#if MXML_MAJOR_VERSION <= 3
+ mxmlNewElement(tree, "!DOCTYPE");
+ mxmlElementSetAttr(doctype, "ZynAddSubFX-data", NULL);
+#else
+ mxmlNewDeclaration(tree, "DOCTYPE ZynAddSubFX-data");
+#endif
+ assert(doctype);
node = root = addparams("ZynAddSubFX-data", 4,
"version-major", stringFrom<int>(
@@ -164,7 +199,7 @@ bool XMLwrapper::hasPadSynth() const
"INFORMATION",
NULL,
NULL,
- MXML_DESCEND);
+ MXML_DESCEND_ALL);
mxml_node_t *parameter = mxmlFindElement(tmp,
tmp,
@@ -204,7 +239,15 @@ char *XMLwrapper::getXMLdata() const
{
xml_k = 0;
+#if MXML_MAJOR_VERSION <= 3
char *xmldata = mxmlSaveAllocString(tree, XMLwrapper_whitespace_callback);
+#else
+ mxml_options_t *options = mxmlOptionsNew();
+ mxmlOptionsSetWhitespaceCallback(options, XMLwrapper_whitespace_callback, /*cbdata*/nullptr);
+ char *xmldata = mxmlSaveAllocString(tree, options);
+ mxmlOptionsDelete(options);
+#endif
+
return xmldata;
}
@@ -317,8 +360,15 @@ int XMLwrapper::loadXMLfile(const string &filename)
if(xmldata == NULL)
return -1; //the file could not be loaded or uncompressed
+#if MXML_MAJOR_VERSION <= 3
root = tree = mxmlLoadString(NULL, trimLeadingWhite(
- xmldata), MXML_OPAQUE_CALLBACK);
+ xmldata), MXML_OPAQUE_CALLBACK);
+#else
+ mxml_options_t *options = mxmlOptionsNew();
+ mxmlOptionsSetTypeValue(options, MXML_TYPE_OPAQUE);
+ root = tree = mxmlLoadString(NULL, options, trimLeadingWhite(xmldata));
+ mxmlOptionsDelete(options);
+#endif
delete[] xmldata;
@@ -330,7 +380,7 @@ int XMLwrapper::loadXMLfile(const string &filename)
"ZynAddSubFX-data",
NULL,
NULL,
- MXML_DESCEND);
+ MXML_DESCEND_ALL);
if(root == NULL)
return -3; //the XML doesn't embbed zynaddsubfx data
@@ -384,8 +434,15 @@ bool XMLwrapper::putXMLdata(const char *xmldata)
if(xmldata == NULL)
return false;
+#if MXML_MAJOR_VERSION <= 3
root = tree = mxmlLoadString(NULL, trimLeadingWhite(
- xmldata), MXML_OPAQUE_CALLBACK);
+ xmldata), MXML_OPAQUE_CALLBACK);
+#else
+ mxml_options_t *options = mxmlOptionsNew();
+ mxmlOptionsSetTypeValue(options, MXML_TYPE_OPAQUE);
+ root = tree = mxmlLoadString(NULL, options, trimLeadingWhite(xmldata));
+ mxmlOptionsDelete(options);
+#endif
if(tree == NULL)
return false;
@@ -394,7 +451,7 @@ bool XMLwrapper::putXMLdata(const char *xmldata)
"ZynAddSubFX-data",
NULL,
NULL,
- MXML_DESCEND);
+ MXML_DESCEND_ALL);
if(root == NULL)
return false;
@@ -531,11 +588,11 @@ void XMLwrapper::getparstr(const string &name, char *par, int maxstrlen) const
return;
if(mxmlGetFirstChild(tmp) == NULL)
return;
- if(mxmlGetType(mxmlGetFirstChild(tmp)) == MXML_OPAQUE) {
+ if(mxmlGetType(mxmlGetFirstChild(tmp)) == MXML_TYPE_OPAQUE) {
snprintf(par, maxstrlen, "%s", mxmlGetOpaque(mxmlGetFirstChild(tmp)));
return;
}
- if((mxmlGetType(mxmlGetFirstChild(tmp)) == MXML_TEXT)
+ if((mxmlGetType(mxmlGetFirstChild(tmp)) == MXML_TYPE_TEXT)
&& (mxmlGetFirstChild(tmp) != NULL)) {
snprintf(par, maxstrlen, "%s", mxmlGetText(mxmlGetFirstChild(tmp),NULL));
return;
@@ -555,11 +612,11 @@ string XMLwrapper::getparstr(const string &name,
if((tmp == NULL) || (mxmlGetFirstChild(tmp) == NULL))
return defaultpar;
- if(mxmlGetType(mxmlGetFirstChild(tmp)) == MXML_OPAQUE
+ if(mxmlGetType(mxmlGetFirstChild(tmp)) == MXML_TYPE_OPAQUE
&& (mxmlGetOpaque(mxmlGetFirstChild(tmp)) != NULL))
return mxmlGetOpaque(mxmlGetFirstChild(tmp));
- if(mxmlGetType(mxmlGetFirstChild(tmp)) == MXML_TEXT
+ if(mxmlGetType(mxmlGetFirstChild(tmp)) == MXML_TYPE_TEXT
&& (mxmlGetText(mxmlGetFirstChild(tmp),NULL) != NULL))
return mxmlGetText(mxmlGetFirstChild(tmp),NULL);
@@ -684,8 +741,8 @@ std::vector<XmlNode> XMLwrapper::getBranch(void) const
std::vector<XmlNode> res;
mxml_node_t *current = mxmlGetFirstChild(node);
while(current) {
- if(mxmlGetType(current) == MXML_ELEMENT) {
-#if MXML_MAJOR_VERSION == 3
+ if(mxmlGetType(current) == MXML_TYPE_ELEMENT) {
+#if MXML_MAJOR_VERSION >= 3
XmlNode n(mxmlGetElement(current));
int count = mxmlElementGetAttrCount(current);
const char *name;
@@ -705,7 +762,7 @@ std::vector<XmlNode> XMLwrapper::getBranch(void) const
#endif
res.push_back(n);
}
- current = mxmlWalkNext(current, node, MXML_NO_DESCEND);
+ current = mxmlWalkNext(current, node, MXML_DESCEND_NONE);
}
return res;
}
diff --git a/src/Tests/MessageTest.cpp b/src/Tests/MessageTest.cpp
index ef7558dfa..f6810a2f1 100644
--- a/src/Tests/MessageTest.cpp
+++ b/src/Tests/MessageTest.cpp
@@ -105,22 +105,16 @@ class MessageTest
mw->transmitMsg("/presets/copy", "s", "/part0/kit0/adpars/VoicePar0/FMSmp/");
TS_ASSERT_EQUAL_STR("Poscilgen", mw->getPresetsStore().clipboard.type.c_str());
- // a regex would be better here...
- // hopefully, mxml will not change its whitespace behavior
- assert_non_null(strstr(mw->getPresetsStore().clipboard.data.c_str(), "<par name=\"base_function_par\" value=\"32\" />"),
- "base_function_par at right value", __LINE__);
-
- /* // better test this without string comparison:
+ //Use XMLwrapper to validate copied XML
{
XMLwrapper xml;
bool couldPutXml = xml.putXMLdata(mw->getPresetsStore().clipboard.data.c_str());
TS_ASSERT(couldPutXml);
+ xml.enterbranch("Poscilgen");
unsigned char copiedBasefuncPar = xml.getpar127("base_function_par", 0);
- TS_ASSERT_EQUALS(copiedBasefuncPar, 32);
- }*/
-
- //printf("clipboard type: %s\n",mw->getPresetsStore().clipboard.type.c_str());
- //printf("clipboard data:\n%s\n",mw->getPresetsStore().clipboard.data.c_str());
+ xml.exitbranch();
+ TS_ASSERT_EQUAL_INT(+copiedBasefuncPar, 32);
+ }
TS_ASSERT_EQUAL_INT(osc_dst.Pbasefuncpar, 64);
TS_ASSERT_EQUAL_INT(osc_oth.Pbasefuncpar, 64);
diff --git a/src/Tests/PluginTest.cpp b/src/Tests/PluginTest.cpp
index 665a7311f..dd0c4214a 100644
--- a/src/Tests/PluginTest.cpp
+++ b/src/Tests/PluginTest.cpp
@@ -15,6 +15,7 @@
#include <cstdlib>
#include <iostream>
#include <fstream>
+#include <regex>
#include <string>
#include "../Misc/MiddleWare.h"
#include "../Misc/Master.h"
@@ -228,12 +229,30 @@ class PluginTest
void testLoadSave(void)
{
+ // Do the load/save
const string fname = string(SOURCE_DIR) + "/guitar-adnote.xmz";
- const string fdata = loadfile(fname);
+ string fdata = loadfile(fname);
char *result = NULL;
master[0]->putalldata((char*)fdata.c_str());
int res = master[0]->getalldata(&result);
+ // Fixup, because d44dc9b corrupted guitar-adnote.xmz:
+ // Replace "1.0f" with "1.0" and "UTF-8" with "utf-8" in `<?xml...`
+ fdata = std::regex_replace(fdata,
+ std::regex(R"(<\?xml version="1\.0f" encoding="UTF-8"\?>)"),
+ R"(<?xml version="1.0" encoding="utf-8"?>)");
+
+ // Fixups, because guitar-adnote.xmz was saved with MXML3
+#if MXML_MAJOR_VERSION >= 4
+ // guitar-adnote has tags ending on " />" - we remove the space
+ fdata = std::regex_replace(fdata, std::regex(" />"), "/>");
+ // Remove trailing newline
+ if (fdata.size() >= 1 && fdata[fdata.size() - 1] == '\n') {
+ fdata.pop_back();
+ }
+#endif
+
+ // Checks
TS_ASSERT_EQUAL_INT((int)(fdata.length()+1), res);
TS_ASSERT(fdata == result);
if(fdata != result)

View File

@@ -1,6 +1,6 @@
Name: zynaddsubfx
Version: 3.0.6
Release: 2mamba
Release: 3mamba
Summary: A software synthesizer capable of making a countless number of instruments
Group: Graphical Desktop/Applications/Multimedia
Vendor: openmamba
@@ -9,6 +9,8 @@ Packager: Silvan Calarco <silvan.calarco@mambasoft.it>
URL: https://sourceforge.net/projects/zynaddsubfx/
Source: https://sourceforge.net/projects/zynaddsubfx/files/zynaddsubfx/%{version}/zynaddsubfx-%{version}.tar.bz2
Patch0: zynaddsubfx-3.0.6-gcc-14.patch
Patch1: zynaddsubfx-3.0.6-mxml-4.0.3.patch
Patch2: zynaddsubfx-3.0.6-fltk-1.4.4.patch
License: GPL
## AUTOBUILDREQ-BEGIN
BuildRequires: glibc-devel
@@ -23,38 +25,48 @@ BuildRequires: libXinerama-devel
BuildRequires: libXpm-devel
BuildRequires: libXrender-devel
BuildRequires: libalsa-devel
BuildRequires: libcairo-devel
BuildRequires: libdbus-devel
BuildRequires: libdecor-devel
BuildRequires: libfftw-devel
BuildRequires: libfltk-devel
BuildRequires: libfontconfig-devel
BuildRequires: libfreetype-devel
BuildRequires: libgcc
BuildRequires: libglib-devel
BuildRequires: libglu-devel
BuildRequires: libglvnd-devel
BuildRequires: libharfbuzz-devel
BuildRequires: libjack-devel
BuildRequires: libjpeg-devel
BuildRequires: libjpeg-turbo
BuildRequires: liblash-devel
BuildRequires: liblo-devel
BuildRequires: libmxml-devel
BuildRequires: libpango-devel
BuildRequires: libpng-devel
BuildRequires: libportaudio-devel
BuildRequires: libsndio-devel
BuildRequires: libstdc++6-devel
BuildRequires: libuuid-devel
BuildRequires: libwayland-devel
BuildRequires: libxkbcommon-devel
BuildRequires: libxml2-devel
BuildRequires: libz-devel
## AUTOBUILDREQ-END
BuildRequires: dssi-devel
BuildRequires: libfltk-devel >= 0:1.4.4-1mamba
BuildRequires: libmxml-devel >= 4.0.3
Provides: ZynAddSubFX
Obsoletes: ZynAddSubFX < 3.0.6-2mamba
%description
ZynAddSubFX is a opensource software synthesizer capable of making a countless number of instruments, from some common heared from expensive hardware to interesting sounds that you'll boost to an amazing universe of sounds.
%debug_package
%prep
%setup -q
%patch 0 -p1 -b .gcc-14
%patch 1 -p1 -b .mxml-4.0.3
%patch 2 -p1
%build
%cmake -d build \
@@ -67,37 +79,6 @@ ZynAddSubFX is a opensource software synthesizer capable of making a countless n
[ "%{buildroot}" != / ] && rm -rf "%{buildroot}"
%makeinstall -C build
#install -D -m0755 src/zynaddsubfx %{buildroot}%{_bindir}/zynaddsubfx
#install -D -m0644 zynaddsubfx_icon.ico %{buildroot}%{_datadir}/pixmaps/zynaddsubfx.ico
#install -d -m0755 %{buildroot}%{_datadir}/zynaddsubfx/banks
#install -d -m0755 %{buildroot}%{_datadir}/zynaddsubfx/examples
#install -d -m0755 %{buildroot}%{_datadir}/zynaddsubfx/presets
#cp -a instruments/* %{buildroot}%{_datadir}/zynaddsubfx/
## make and instal DSSI plugin library
#cd src
#sed -i "s|\#\(LINUX_DSSI=YES\)|\1|" Makefile.inc
#sed -i "s|\(^LINUX_DSSI=NO$\)|\#\1|" Makefile.inc
#% make
#install -D -m0755 zynaddsubfx.so %{buildroot}%{_libdir}/dssi/zynaddsubfx.so
#cd ..
#mkdir -p $RPM_BUILD_ROOT/%{_datadir}/applications
#cat > $RPM_BUILD_ROOT/%{_datadir}/applications/ZynAddSubFX.desktop << EOF
#[Desktop Entry]
#Name=ZynAddSubFX
#GenericName=Software synthetizer
#GenericName[it]=Sintetizzatore software
#Comment=A software synthesizer capable of making a countless number of instruments
#Comment[it]=Un sintetizzatore capace di riprodurre molti strumenti
#Exec=zynaddsubfx
#Type=Application
#Terminal=0
#Icon=%{_datadir}/pixmaps/zynaddsubfx.ico
#Categories=Qt;KDE;AudioVideo;Music;
#EOF
%clean
[ "%{buildroot}" != / ] && rm -rf "%{buildroot}"
@@ -121,6 +102,9 @@ ZynAddSubFX is a opensource software synthesizer capable of making a countless n
%doc COPYING
%changelog
* Fri Aug 01 2025 Automatic Build System <autodist@mambasoft.it> 3.0.6-3mamba
- rebuilt by autoport with build requirements: libfltk-devel>=0:1.4.4-1mamba
* Tue Jun 04 2024 Automatic Build System <autodist@mambasoft.it> 3.0.6-2mamba
- renamed from ZynAddSubFX to zynaddsubfx