jack: Add support for detecting libjack on Windows
authorNirbheek Chauhan <nirbheek@centricular.com>
Wed, 25 May 2022 19:51:43 +0000 (01:21 +0530)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Sat, 28 May 2022 11:34:23 +0000 (11:34 +0000)
No source code changes were necessary to get the plugin working on
Windows with MSVC.

Run QJackCtl and audiotestsrc ! jackaudiosink just works.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2497>

subprojects/gst-plugins-good/ext/jack/meson.build

index 7929978..caa0807 100644 (file)
@@ -6,17 +6,97 @@ jack_sources = [
   'gstjackutil.c',
 ]
 
-libjack_dep = dependency('jack', version : '>= 1.9.7', required : get_option('jack'))
-
-if libjack_dep.found()
-  gstjack = library('gstjack',
-    jack_sources,
-    c_args : gst_plugins_good_args + ['-DHAVE_JACK_1_9_7'],
-    include_directories : [configinc, libsinc],
-    dependencies : [gst_dep, gstbase_dep, gstaudio_dep, libjack_dep],
-    install : true,
-    install_dir : plugins_install_dir,
-  )
-  pkgconfig.generate(gstjack, install_dir : plugins_pkgconfig_install_dir)
-  plugins += [gstjack]
+jack_option = get_option('jack')
+if jack_option.disabled()
+  subdir_done()
 endif
+
+jack_incdirs = [configinc, libsinc]
+
+libjack_dep = dependency('jack', version : '>= 1.9.7', required : false)
+
+if not libjack_dep.found()
+  fs = import('fs')
+  host_cpu = host_machine.cpu_family()
+  jack_maybe_installed = false
+  error_msg = '"jack" option is enabled but '
+  if (host_system == 'windows' and build_machine.system() == 'windows')
+    # Need to detect whether we're running on 64-bit Windows or not.
+    # If `C:/Program Files (x86)/` exists, we're running on 64-bit Windows, and
+    # C:/Program Files/ contains 64-bit programs. Else, we're on 32-bit Windows
+    # and C:/Program Files/ contains 32-bit programs.
+    #
+    # The user could either have a 32-bit JACK installation or a 64-bit one.
+    # When building for 32-bit x86, we need to check for both.
+    if fs.is_dir('C:/Program Files (x86)')
+      jack64_install_dir = 'C:/Program Files/JACK2'
+      jack32_install_dir = 'C:/Program Files (x86)/JACK2'
+    else
+      jack64_install_dir = ''
+      jack32_install_dir = 'C:/Program Files/JACK2'
+    endif
+
+    if host_cpu == 'x86'
+      jack_install_dir = jack32_install_dir
+      jack_maybe_installed = fs.is_dir(jack32_install_dir / 'include')
+      if not jack_maybe_installed and jack64_install_dir != ''
+        jack_maybe_installed = fs.is_dir(jack64_install_dir / 'include')
+        jack_install_dir = jack64_install_dir
+      endif
+    elif jack64_install_dir != ''
+      jack_maybe_installed = import('fs').is_dir(jack64_install_dir / 'include')
+      jack_install_dir = jack64_install_dir
+    endif
+
+    error_msg += 'JACK2 installation could not be found'
+  else
+    error_msg += 'JACK dependency could not be found'
+  endif
+
+  if not jack_maybe_installed
+    if jack_option.enabled()
+      error(error_msg)
+    endif
+    subdir_done()
+  endif
+
+  if not host_cpu.startswith('x86')
+    if jack_option.enabled()
+      error('On Windows, JACK only supports x86 32-bit and 64-bit')
+    endif
+    subdir_done()
+  endif
+
+  if host_cpu == 'x86'
+    jack_libname = 'libjack'
+    if jack_install_dir == jack64_install_dir
+      jack_libdir = jack_install_dir / 'lib32'
+    else
+      jack_libdir = jack_install_dir / 'lib'
+    endif
+  else
+    jack_libname = 'libjack64'
+    jack_libdir = jack_install_dir / 'lib'
+  endif
+
+  inc = include_directories(jack_install_dir / 'include')
+  libjack_dep = cc.find_library(jack_libname,
+      dirs: jack_libdir,
+      has_headers: 'jack/jack.h',
+      header_include_directories: inc,
+      required: jack_option)
+  # This won't be needed once we require a meson version that includes this:
+  # https://github.com/mesonbuild/meson/pull/10428
+  jack_incdirs += inc
+endif
+
+gstjack = library('gstjack',
+  jack_sources,
+  c_args : gst_plugins_good_args + ['-DHAVE_JACK_1_9_7'],
+  include_directories : jack_incdirs,
+  dependencies : [gst_dep, gstbase_dep, gstaudio_dep, libjack_dep],
+  install : true,
+  install_dir : plugins_install_dir,
+)
+pkgconfig.generate(gstjack, install_dir : plugins_pkgconfig_install_dir)
+plugins += [gstjack]