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 |