# JACK Audio Connection Kit

JACK Audio Connection Kit of kortweg JACK is een high-bandwith-, low-latency-audioserver geschreven voor POSIX-besturingssystemen zoals Linux, Unix en Mac OS X, maar ook beschikbaar voor Windows. JACK kan verschillende audioapplicaties verbinden met het audioapparaat en kan ook audiodata delen tussen de verschillende applicaties onderling.
De clients kunnen werken als een eigen proces of als plug-in in de JACK-server.

## Overzicht

In april 2001 begonnen de mensen van de linux-audio-dev-lijst de noodzaak te zien van een systeem dat high-bandwidth-, low-latency-, sample-synchronised-datacommunicatie tussen verschillende onafhankelijke audioapplicaties mogelijk maakte. Zo'n systeem moest een robuuste prestatie leveren, ook bij systemen met veel CPU-belasting. Het project kreeg de naam LAAGA (Linux Audio Applications Glue API). In de herfst van 2001 werd een eerste implementatie (een afleiding van de broncode van Ardour) bekendgemaakt onder de naam JACK, een acroniem van JACK Audio Connection Kit. JACK heeft de doelen van LAAGA grotendeels ingevuld, hoewel JACK nog steeds in ontwikkeling is.
Oorspronkelijk werden de audiobron, de effecten, de sequencer enzovoorts bestuurd door hardware die door middel van een kabel aan elkaar gekoppeld was. Het probleem was dan de invoer/uitvoer van die hardware naar en van het pc-systeem. De laatste jaren is het de trend die hardware als programmatuur te implementeren op dezelfde machine. Er ontstond toen een nieuw probleem: in plaats van de hardware te verbinden met elkaar was er een eenduidige manier nodig om de verschillende softwareapplicaties met elkaar te laten communiceren. JACK maakt het mogelijk de verschillende audioapplicaties onderling met elkaar te verbinden, net zoals de hardware aan elkaar werd gekoppeld.
Traditioneel was het zeer moeilijk om audioapplicaties te schrijven die hun audiodata met elkaar konden delen. JACK bracht hier verandering in door een API te verzorgen die hoofdzakelijk twee dingen doet:
* Het verzorgt een abstractielaag voor programmeurs die de audio-interface wegwerkt, zodat de programmeurs zich kunnen concentreren op de kernfunctionaliteit van hun softwareapplicatie.
* Het maakt de ontvangst en verzending van audiodata door applicaties mogelijk van en naar andere audioapplicaties, alsook van de audio-interface. Het maakt niet uit voor de applicaties of de audiodata van een andere applicatie komen of van de audio-interface.
JACK beschikt over een callback-functie die audiodata kan verzenden en ontvangen en andere audioverwerkingstaken kan uitvoeren. Alle audiodata in JACK worden voorgesteld als 32-bitswaarden met zwevende komma. JACK is ontworpen om één server te draaien en meerdere clients, die dan onderling verbonden zijn. JACK kan ook meerdere servers draaien, maar iedere JACK-server heeft zijn eigen audio-set-up; onderling zijn de JACK-servers niet met elkaar verbonden.
JACK gebruiken met een audioapplicatie is eenvoudig en bestaat normaal gesproken uit de volgende vier stappen:
* de nieuwe audioapplicatie oproepen om te verbinden met de JACK-server
* poorten registreren om ervoor te zorgen dat de audiodata gecommuniceerd kunnen worden naar en van de applicatie
* callback process registreren, dat op tijd opgeroepen zal worden door de JACK-server
* JACK laten weten dat de applicatie klaar is om audiodata te verwerken
JACK komt zelf niet met een GUI (Graphical User Interface); ooit had men de command line nodig om JACK te configureren en te controleren. Tegenwoordig bestaat er een GUI onder de naam qjackctl, die het mogelijk maakt JACK gemakkelijker te configureren. Het is de aanbevolen manier om met JACK te werken.

## Ontwerpdoelen

JACK is ontworpen met de volgende doelen voor ogen.
* JACK moet snelle, low-latency-streaming van data mogelijk maken tussen onafhankelijke applicaties.
* JACK moet ieder streamingdatatype ondersteunen, niet slechts audio.
* In een typische set-up draait JACK één server en meerdere clients. Het is mogelijk om meerdere servers te draaien, maar iedere server vormt een aparte audio-set-up. Communicatie tussen meerdere servers is niet mogelijk, zoals dat wel mogelijk is tussen de clients.
* Applicaties die JACK gebruiken hebben elk hun eigen grafische interface tot JACK. JACK maakt geen specificaties voor een GUI. Als gevolg daarvan zijn verschillende stukjes van de JACK-set-up verspreid over de verschillende applicaties.
* JACK verzorgt volledige, sample-accurate synchronisatie.
* Data wordt door JACK gepresenteerd als 32-bitsfloating-pointwaarden
* Alleen non-interleaved audiostreams worden ondersteund.
* Een JACK-client kan meerdere data-streams produceren.
* De JACK-API wordt gespecificeerd in ANSI C-waarden. Er zijn geen beperkingen hoe servers en clients worden geïmplementeerd.
* Het moet mogelijk zijn om reeds draaiende applicaties te verbinden met JACK.
* Het moet mogelijk zijn om JACK-clients toe te voegen of te verwijderen terwijl de server werkt.

## Porting

JACK is ontworpen om te kunnen werken op een systeem dat voldoet aan de POSIX- en ANSI C-standaarden. Momenteel werkt JACK al op GNU/Linux en Mac OS X. De ontwikkelaars van JACK werken aan een versie voor Microsoft Windows. Informatie over hoe JACK te porten naar een ander platform kan men terugvinden in het Porting JACK-document.

## Licenties

JACK is vrije software, herdistribueren en/of aanpassen is toegestaan onder de GPL en LGPL zoals gepubliceerd door de Free Software Foundation. De JACK-server is vrijgegeven onder de GPL-licentie, terwijl de JACK-bibliotheek vrijgegeven is onder de LGPL-licentie, wat het mogelijk maakt dat eigendomsgebonden programma's de JACK-services gebruiken.