JACK, Linux und ein neues Spielzeug

  • strict warning: Non-static method view::load() should not be called statically in /usr/share/nginx/www/drupal/sites/all/modules/views/views.module on line 1113.
  • strict warning: Declaration of views_handler_field::query() should be compatible with views_handler::query($group_by = false) in /usr/share/nginx/www/drupal/sites/all/modules/views/handlers/views_handler_field.inc on line 0.
  • strict warning: Declaration of views_handler_field_user::init() should be compatible with views_handler_field::init(&$view, $options) in /usr/share/nginx/www/drupal/sites/all/modules/views/modules/user/views_handler_field_user.inc on line 0.
  • strict warning: Declaration of views_handler_argument::options_validate() should be compatible with views_handler::options_validate($form, &$form_state) in /usr/share/nginx/www/drupal/sites/all/modules/views/handlers/views_handler_argument.inc on line 0.
  • strict warning: Declaration of views_handler_argument::query() should be compatible with views_handler::query($group_by = false) in /usr/share/nginx/www/drupal/sites/all/modules/views/handlers/views_handler_argument.inc on line 0.
  • strict warning: Declaration of views_handler_sort::options_validate() should be compatible with views_handler::options_validate($form, &$form_state) in /usr/share/nginx/www/drupal/sites/all/modules/views/handlers/views_handler_sort.inc on line 0.
  • strict warning: Declaration of views_handler_sort::options_submit() should be compatible with views_handler::options_submit($form, &$form_state) in /usr/share/nginx/www/drupal/sites/all/modules/views/handlers/views_handler_sort.inc on line 0.
  • strict warning: Declaration of views_handler_sort::query() should be compatible with views_handler::query($group_by = false) in /usr/share/nginx/www/drupal/sites/all/modules/views/handlers/views_handler_sort.inc on line 0.
  • strict warning: Declaration of views_handler_filter::options_validate() should be compatible with views_handler::options_validate($form, &$form_state) in /usr/share/nginx/www/drupal/sites/all/modules/views/handlers/views_handler_filter.inc on line 0.
  • strict warning: Declaration of views_handler_filter::query() should be compatible with views_handler::query($group_by = false) in /usr/share/nginx/www/drupal/sites/all/modules/views/handlers/views_handler_filter.inc on line 0.
  • strict warning: Declaration of views_handler_relationship::query() should be compatible with views_handler::query($group_by = false) in /usr/share/nginx/www/drupal/sites/all/modules/views/handlers/views_handler_relationship.inc on line 0.
  • strict warning: Declaration of views_plugin_query::options_submit() should be compatible with views_plugin::options_submit($form, &$form_state) in /usr/share/nginx/www/drupal/sites/all/modules/views/plugins/views_plugin_query.inc on line 0.
  • strict warning: Declaration of views_plugin_argument_validate::options_submit() should be compatible with views_plugin::options_submit($form, &$form_state) in /usr/share/nginx/www/drupal/sites/all/modules/views/plugins/views_plugin_argument_validate.inc on line 0.
  • strict warning: Declaration of views_plugin_row::options_validate() should be compatible with views_plugin::options_validate(&$form, &$form_state) in /usr/share/nginx/www/drupal/sites/all/modules/views/plugins/views_plugin_row.inc on line 0.

Hin und wieder komme ich in Versuchung mit der Soundwiedergabe unter Linux herumzuspielen. Nachdem ich nun mit der Zeit grundlegende Konzepte von OSS, PulseAudio und ALSA verstanden hatte, kam ich mit den meisten Problemen klar. Natürlich gibt es nach wie vor eine paar Fragezeichen und manchen Programmen schweigen in bestimmten Situationen vor sich hin, aber der Nebel lichtet sich. Also war es an der Zeit sich neue Probleme zu schaffen und mit einem Soundserver herumzuspielen, den ich mir schon länger ansehen wollte:
JACK (JACK Audio Connection Kit)

Mit JACK lassen sich Ein- und Ausgänge von Audioprogrammen verwalten und verbinden. Das Routing hat dabei nur eine sehr geringe Latenz zur Folge, was auch einen produktiven Einsatz erlaubt. Gerade in Verbindung mit einem Realtime-Kernel lassen sich oft sehr gute Geschwindigkeiten erreichen. Diesen habe ich hier aber nicht verwendet. Auch um mal zu testen was ohne so drin ist. Mein Linux ist momentan ein Ubuntu 9.04. Einen guten Einblick in JACK liefert der Knowing Jack-Artikel aus dem „Linux Magazine“.

Installation

Installiert habe ich JACK direkt aus dem Ubuntu Repository (Universe):

sudo aptitude install jackd

Es empfiehlt sich zusätzlich eine GUI wie qjackctl zu installieren und auch ein Testprogramm wie den Sequencer Hydrogen ist sehr hlifreich:

sudo aptitude install qjackctl hydrogen

Normalerweise sollte durch qjackctl auch der JACK-Daemon gestartet werden, nur ermöglichen dies die Standardeinstellungen bei mir nicht. Daher ist es zu Beginn viellecht einfacher, erst manuell jackd und danach qjackctl zu starten. Bei mir sieht das folgendermaßen aus:

sudo jackd -d alsa -d hw:1 &
sudo qjackctl &

Dabei kann man mittels dem „-d“-Parameter der zu nutzende Soundtreiber konfiguriert werden. Weitere Informationen zu den Parametern gibt es wie immer in den Manual-Pages. In meinem Falle nutze ich eben ALSA („-d alsa“) und die zweite Soundkarte in meinem Computer („-d hw:1“).
In den ersten Tests hatte ich immer das Problem, zwar routen zu können, aber nichts zu hören. Irgenwann viel mir auf, dass mir qjackctl nur zwei „beschreibbare“ Ausgänge (Ausgänge, an die Sound geschickt werden kann) anbot. Nun ist hier aber eine 7.1-Soundkarte verbaut und entsprechend sollten da auch acht Kanäle verfügbar sein. Wählt man nicht explizit einen Soundchip aus, ist die erste Soundkarte der Standard (= „-d hw:0”). Mittels ALSA lassen sich die verfügbaren Karten anzeigen:
$ cat /proc/asound/cards
 0 [GuitarPort     ]: line6usb - GuitarPort
                      Line6 GuitarPort at USB 6-1:1.0
 1 [Intel          ]: HDA-Intel - HDA Intel
                      HDA Intel at 0xf9ff8000 irq 22

Das wird auf anderen Rechnern sicher anders aussehen, aber hier bekommt man die Information her, was man alles wählen kann. Sofern man keinen Realtime-Kernel hat, sollte man auch auf die „-R“-Option verzichten.

Verwendung

Hat man den Daemon und qjackctl gestartet,lassen sich einige Fenster öffnen, din den aktuellen Status von JACK wiedergeben. Das könnte dann folgendermaßen aussehen:
JACK DesktopJACK Desktop
Rechts oben ist das eigentliche Hauptfenster von qjackctl zu sehen. Die Verbindungen selbst lassen sich im Fenster links unten verwalten. Statusinformationen werden gut lesbar und farblich hervorgehoben auf der rechten Seite präsentiert.
Man sieht im Verbindungsfenster, dass die beiden Ausgänge von Hydrogen über die acht Kanäle irgendwie verteilt werden und der Output somit hörbar ist. Der Sequencer selbst ist hier zu sehen:
HydrogenHydrogen
Zum weiteren Testen habe ich noch creox installiert. Dieser (Gitarren-)Effektprozissor unterstützt auch JACK und somit kann ich den Hydrogen-Beat durch Creox und dessen Output widerum zur Soundkarte routen. Schon damit lassen sich lustige Dinge machen. Zuvor habe ich zwar auch schon mit Soundprogrammen gearbeitet, aber das Zusammenspiel einzelner Programme ist mir neu. Ich glaube das wird ein super Spielzeug. Mittels VST-Plugins und Rewire würde man wohl eine kommerzielle Windows-Lösung für sowas finden.

Amarok bzw. Xine

Verwendet man Ubuntu, ist JACK nicht im Main-Repository eingegliedert. Das hat zur Folge, dass Programme und Bibliotheken im Main-Repo keine JACK-Abhängigkeiten haben dürfen. Mehr dazu hier. Damit hat auch die xine-Bibliothek, die für mein Amarok das Backend darstellt, unter Ubuntu kein JACK-Plugin an Board.
Eine einfache Möglichkeit Xine und Amarok dennoch dieses Plugin zur Verfügung zu stellen, ist es sich selbiges aus einem Debin-Repository zu holen und zu benutzen. Das passende deb-Packet läd man sich runter und entpackt es:

$ dpkg-deb -x {deb-package name} {target directory}

Im Archiv befindet sich das Plugin dann als „xineplug_ao_out_jack.so“ unter Pfad „usr/lib/xine/plugins/1.26/“ (Versionsnummer kann sich ändern). Dise muss anschließend ins lokale Pluginverzeichni kopiert werden. Bei mir nach „/usr/lib/xine/plugins/1.26/“. Nach einem Neustart von Amarok ist JACK als Ausgabegerät verfügbar. Um das herauszufinden war dieser Forumseintrag sehr hilfreich. Dort werden auch noch andere Möglichkeiten diskutiert.

Probleme

Leider habe ich nach wie vor ein paar ungelöste Probleme:

  1. Soll eine Anwendung JACK nutzen können, muss sie im Moment mit root-Rechten („sudo“ in Ubuntu) gestartet werden. Das ist schlecht und legt vermutlich an irgendeiner fehlenden Gruppenzugehörigkeit.
  2. Das Fehlen eines Realtime-Kerneli macht sich schon bei der Nutzung von Potamus (Sehr kleines GTK-Musikabspielprogramm mit JACK-Support), Hydrogen und Creox bemerkbar: Hin und wieder ist ein kurzes Knacksen zu hören und der JACK-Log spricht von einigen XRUNs. Zum RT-Linux gibts hier einige Infos.
  3. Mein Line6 GuitarPort läuft noch nicht mit JACK.
  4. PulseAudio-Anwendungen laufen nicht während JACK läuft (wie z. B. Adobes schlechter Flashplayer).

Das werde ich demnächst aber angehen. Bis dahin freue ich mich aber erstmal über die neuen Möglichkeiten der Linux-Audio-Möglichkeiten. Es gibt sehr viele brauchbare Programme und malsehen, vielleicht findet doch noch ein Linux-Rechner den Weg in den Band-Proberaum :-).

Hin und wieder komme ich in Versuchung mit der Soundwiedergabe unter Linux herumzuspielen. Nachdem ich nun mit der Zeit grundlegende Konzepte von OSS, PulseAudio und ALSA verstanden hatte, kam ich mit den meisten Problemen klar. Natürlich gibt es nach wie vor eine paar Fragezeichen und manchen Programmen schweigen in bestimmten Situationen vor sich hin, aber der Nebel lichtet sich. Also war es an der Zeit sich neue Probleme zu schaffen und mit einem Soundserver herumzuspielen, den ich mir schon länger ansehen wollte:

Trackback URL for this post:

https://blog.voodoo-arts.net/trackback/38

Tags for JACK, Linux und ein neues Spielzeug