80 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| Weak-JACK
 | |
| =========
 | |
| 
 | |
| This small library abstracts the [JACK](http://jackaudio.org) Application Binary Interface.
 | |
| 
 | |
| Background and Motivation
 | |
| -------------------------
 | |
| 
 | |
| The jack shared library needs to be installed system-wide (for all jack applications
 | |
| to share), it can not be part of an application itself.
 | |
| 
 | |
| JACK developers take great care to not break binary compatibility of libjack. An
 | |
| application compiled with one version of jack will work with all future versions
 | |
| of jack. However, this only works well on GNU/Linux, BSD and to some extend on OSX.
 | |
| 
 | |
| weak-jack linking is useful (at least) in the following cases:
 | |
| 
 | |
| *   the resulting application should not be directly linked to libjack.[so|dll|dylib]
 | |
|     IOW: the application should start even if libjack is not installed.
 | |
| *   the ABI of libjack is not stable. Note, this is only relevant for the Windows .dll
 | |
|     (e.g. applications compiled and linked with jack-1.9.9 will crash with jack-1.9.10
 | |
| 		 on windows. -- MSVC has a workaround: link by function-name, not ordinal, mingw
 | |
| 		 does not offer this)
 | |
| *   Reference new API functions (e.g. meta-data API or new latency compensation)
 | |
|     in the application, which is not available on older versions of jack.
 | |
| 
 | |
| Usage
 | |
| -----
 | |
| 
 | |
| 1. Copy the source files into your application's source (or use a git submodule)
 | |
| 2. replace all `#include<jack/*>` in your sources with `#include "weak-jack.h"`
 | |
| 3. add `weak_libjack.c` to the build-source of your project
 | |
|    (in case your build-system does not detect `#include` dependencies automatically,
 | |
| 	 also reference the header and .def file).
 | |
| 4. Define `USE_WEAK_JACK` for all platforms where you want to use weak-linking. Usually
 | |
|    `CFLAGS+=-DUSE_WEAK_JACK  CXXFLAGS+=-DUSE_WEAK_JACK`
 | |
| 5. Do not link your application to libjack (`-ljack`) when `USE_WEAK_JACK` is defined.
 | |
| 
 | |
| Note the jack-headers still need to be present when compiling the application.
 | |
| 
 | |
| The application code itself does not need to be changed.
 | |
| 
 | |
| The first call to `jack_client_open()` will try to find and load libjack, if it cannot be
 | |
| found, it will fail (return `NULL` and set `jack_status_t` if provided to `JackFailure`.)
 | |
| 
 | |
| It is possible to explicitly initialize and query availability of libjack using
 | |
| `have_libjack();` it returns 0 if libjack is available and can be used. (see the header
 | |
| file for non-zero error codes).
 | |
| 
 | |
| Caveats
 | |
| -------
 | |
| 
 | |
| If libjack is not available, all `jack_*` API calls are turned into no-operation functions.
 | |
| This is not a problem in general, as jack-applications will not use any part of the jack API if
 | |
| jack_client_open fails. The only exception here may be `jack_ringbuffer`. Note that the ringbuffer
 | |
| implementation is also part of libjack and will not be available.
 | |
| 
 | |
| The dummy implementation for the ringbuffer API is safe (read, writes are ignored and return failure
 | |
| or zero-bytes length), but if your application depends on it to work, you're out of luck :)
 | |
| 
 | |
| The function wrappers in `weak_libjack.def` were collected pragmatically it's quite possible that
 | |
| some JACK API calls have been missed. If you application fails to link (without -ljack), please report
 | |
| at https://github.com/x42/weakjack/issues
 | |
| 
 | |
| License
 | |
| -------
 | |
| 
 | |
| GNU General Public License version 2 (or later).
 | |
| 
 | |
| Alternatives
 | |
| ------------
 | |
| 
 | |
| An alternative, more liberally licensed, implementation that abstracts and wraps jack completely
 | |
| (incl headers) can be found at
 | |
| https://github.com/falkTX/Carla/tree/master/source/jackbridge (C++ only),
 | |
| and a jack2 specific version at https://github.com/sletz/jack2/blob/master/common/JackWeakAPI.c
 | |
| 
 | |
| A variant for python bindings is also provided by falkTX:
 | |
| https://github.com/falkTX/Cadence/blob/master/src/jacklib.py
 | 
