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
							 |