Distribution concernée : a priori Debian / Ubuntu.

Principe

En noyau 2.4, il faut absolument patcher le noyau alors qu'en 2.6 on peut se contenter de charger le module realtime du paquet realtime-lsm. Une fois tout ceci en place, il faut lancer jackd avec la commande suivante :

jackd -s -d alsa -d hw:0 -r 44100 -H -z s &

Normalement on peut aussi utiliser jackstart mais il semble que ce ne soit pas toujours équivalent comme le montre les commentaires de la page At the Sounding Edge: Introducing seq24[1]. Ensuite il faut donner le droit de lancer des applications avec priorité temps réel aux utilisateurs du groupe audio (id 29) en chargeant le module avec l'option qui va bien :

modprobe -v realtime gid=29

On lancera alors jackd de cette façon :

jackd -s -R -d alsa -d hw:1 -r 44100 -H -z s &

Noter le -d hw:1 qui indique le numéro de la carte son dans le système et le -R qui indique la priorité temps réel. Cette option ne peut être utilisée si le module realtime-lsm n'est pas chargé et que le noyau n'est pas patché. Attention, il faut au préalable que le port de la carte son /dev/dsp soit libre. On vérifie cela avec la commande suivante :

fuser -v /dev/dsp

Classiquement, on retrouvera esd après une session Gnome et artsd après une session KDE. On les tuera simplement avec kill ou killall. On peut ensuite tester la disponibilité de jack avec la commande suivante qu'on adaptera à son propre cas (le myport) :

ecasound -f:32,1,48000 -i null -o jack_alsa,myport -b:1024 -el:sine_fcac,440,1

Script de lancement

Le problème classique lorsqu'on a une carte audio de bonne facture en plus du chipset sonore de la carte mère, est qu'on ne connaît pas forcément l'ordre des cartes son dans le système. Si on connaît le nom de sa carte son (!), on doit donc pouvoir s'en tirer avec ce petit script Tcl :

#!/bin/sh
#
# jack.tcl
# smart jack startup: guesses where is your (best) sound card
#
# Author: JM. Philippe - http://philipjm.free.fr/blog/ - public domain
#
# the next line restarts using tclsh \
exec tclsh "$0" "$@"

# sound card of interest
set SoundCard EWX2496

# guess if realtime mode is available
set HasRealTime ""
catch {
        set HasRealTime exec lsmod 
}
if {$HasRealTime == ""} {
        puts "!!! No realtime-lsm module found, consider installing it then start it with this command:"
        puts "root@localhost:/ # modprobe realtime gid=29 any=1"
        puts "*** Starting jackd in normal mode..."
        set RTmode "-s"
        set BufferMode "-p 512 -n 4"
} else {
        puts "*** Starting jackd in realtime mode..."
        set RTmode "-sRP 70"
        set BufferMode "-p 512 -n 4"
}

# guess on which ALSA port is our card
set a [exec cat /proc/asound/cards | grep $SoundCard]
set a [lindex $a 0]

# guess the correct jackd command
if [string match 2.4.* [exec uname -r]] {
        set JackCmd jackstart
} else {
        set JackCmd jackd
}

# start jackd if not already running
if {[catch {exec ps -A | grep jackd} ErrMsg] || $ErrMsg == ""} {
        puts "> running '$JackCmd $RTmode -d alsa -d hw:$a -r 44100 $BufferMode -Hz s &'"
        puts [eval exec $JackCmd $RTmode -d alsa -d hw:$a -r 44100 $BufferMode -Hz s &]
} else {
        puts "!!! Jackd is already running"
}

En prime ce script démarre jackd en mode non temps réel si realtime-lsm n'est pas lancé et notifie l'existence d'une instance de jackd déjà lancée. Testé sur Debian Sarge, Ubuntu Breezy & Dapper.

Notes

[1] l'un servirait au cas realtime-lsm alors que l'autre servirait au cas noyau patché