summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorMax Kellermann <max@musicpd.org>2021-04-07 17:29:58 +0200
committerMax Kellermann <max@musicpd.org>2021-04-26 21:47:20 +0200
commit0f02bbc2fe4fa5e359dd3da7bb6fe9e87e96a98b (patch)
tree824508159b1c1736659d84d1304db9cb6f678a68 /python
parentb885f358a51d1ea6b126372a3d122b26c19dbe46 (diff)
output/jack: enable on Windows
This enables the JACK output plugin on Windows, but doesn't link against libjack64.dll, instead loads the DLL at runtime with LoadLibrary(). This kludge avoids the extremely fragile JACK shared memory protocol by using the system's libjack64.dll, without requiring the same DLL at build time.
Diffstat (limited to 'python')
-rw-r--r--python/build/jack.py47
-rw-r--r--python/build/libs.py7
2 files changed, 54 insertions, 0 deletions
diff --git a/python/build/jack.py b/python/build/jack.py
new file mode 100644
index 000000000..6e71e7f1d
--- /dev/null
+++ b/python/build/jack.py
@@ -0,0 +1,47 @@
+import os, shutil
+import re
+
+from .project import Project
+
+# This class installs just the public headers and a fake pkg-config
+# file which defines the macro "DYNAMIC_JACK". This tells MPD's JACK
+# output plugin to load the libjack64.dll dynamically using
+# LoadLibrary(). This kludge avoids the runtime DLL dependency for
+# users who don't use JACK, but still allows using the system JACK
+# client library.
+#
+# The problem with JACK is that it uses an extremely fragile shared
+# memory protocol to communicate with the daemon. One needs to use
+# daemon and client library from the same build. That's why we don't
+# build libjack statically here; it would probably not be compatible
+# with the user's JACK daemon.
+
+class JackProject(Project):
+ def __init__(self, url, md5, installed,
+ **kwargs):
+ m = re.match(r'.*/v([\d.]+)\.tar\.gz$', url)
+ self.version = m.group(1)
+ Project.__init__(self, url, md5, installed,
+ name='jack2', version=self.version,
+ base='jack2-' + self.version,
+ **kwargs)
+
+ def build(self, toolchain):
+ src = self.unpack(toolchain)
+
+ includes = ['jack.h', 'ringbuffer.h', 'systemdeps.h', 'transport.h', 'types.h', 'weakmacros.h']
+ includedir = os.path.join(toolchain.install_prefix, 'include', 'jack')
+ os.makedirs(includedir, exist_ok=True)
+
+ for i in includes:
+ shutil.copyfile(os.path.join(src, 'common', 'jack', i),
+ os.path.join(includedir, i))
+
+ with open(os.path.join(toolchain.install_prefix, 'lib', 'pkgconfig', 'jack.pc'), 'w') as f:
+ print("prefix=" + toolchain.install_prefix, file=f)
+ print("", file=f)
+ print("Name: jack", file=f)
+ print("Description: dummy", file=f)
+ print("Version: " + self.version, file=f)
+ print("Libs: ", file=f)
+ print("Cflags: -DDYNAMIC_JACK", file=f)
diff --git a/python/build/libs.py b/python/build/libs.py
index e5277856c..aa64db05c 100644
--- a/python/build/libs.py
+++ b/python/build/libs.py
@@ -9,6 +9,7 @@ from build.autotools import AutotoolsProject
from build.ffmpeg import FfmpegProject
from build.openssl import OpenSSLProject
from build.boost import BoostProject
+from build.jack import JackProject
libmpdclient = MesonProject(
'https://www.musicpd.org/download/libmpdclient/2/libmpdclient-2.19.tar.xz',
@@ -443,6 +444,12 @@ libnfs = AutotoolsProject(
autoreconf=True,
)
+jack = JackProject(
+ 'https://github.com/jackaudio/jack2/archive/v1.9.17.tar.gz',
+ '38f674bbc57852a8eb3d9faa1f96a0912d26f7d5df14c11005ad499c8ae352f2',
+ 'lib/pkgconfig/jack.pc',
+)
+
boost = BoostProject(
'https://dl.bintray.com/boostorg/release/1.75.0/source/boost_1_75_0.tar.bz2',
'953db31e016db7bb207f11432bef7df100516eeb746843fa0486a222e3fd49cb',