Jack unter Opensuse 10.3

Ich bin kein Linux-Audiofreak und habe von Audioservern, Jack und Konsorten keine Ahnung. Normalerweise reicht es mir, wenn an meinem Arbeitsplatz “amarok” (ein tolles Programm!) im Zusammenspiel mit Alsa oder Oss meine Musikdateien in Töne verwandelt. Ich habe eine Audigy 2 Soundcard unter Linux; an der hängt ein 7.1 Lautsprechersystem (Upmix von 5.1 oder 6.1 Sound auf 7.1) und damit bin ich vollkommen zufrieden.

Heute allerdings musste ich Rosegarden für einen potentiellen Kunden für Tests unter Opensuse 10.3 installieren. Rosegarden benötigt den Jack – Echtzeit- Audioserver. Also habe ich Jack und einige zugehörige Tools wir JackEQ aus den SuSE-Repositories installiert. Dann wollte ich Jack einfach mal ausprobieren.

Erste Hürde: Wie startet man Jack?
Der naive Versuch, dies über die Auswahl “Jack Echtzeit-Audioserver” in der Soundsystem-Konfiguration im KDE-Kontrollzentrum zu machen, scheiterte. Der Soundserver wird zwar wieder gestartet, doch jede danach von einem normalen User gestartete Jack-Applikation meldet, dass Jack nicht läuft. Der Verdacht, dass Jack beim gewählten Vorgehen gar nicht gestartet, sondern eher vorausgesetzt wird, bestätigte sich nach einem Blick in die Prozesstabelle. Von “jack”-Prozessen keine Spur. Ein wenig Forschen im Internet führt einen dann zum manuellen Start mittels

jackd -v -d alsa -d hw:0

Das ging dann auch problemlos. Später – nach dem Überwinden einer weiteren Hürde – fand ich dann das schöne Tool “Qjackctl”, das das Starten und Überwachen des Audio-Servers QT-basiert über eine gelungene graphische Oberfläche ermöglicht.

qjackctl_2

Ein Test des Soundservers ist möglich, indem man z.B. “amarok” startet und unter den Einstellungen für die Audio-Ausgabe “Jack” wählt. Das funktionierte auch schön, bis ich nach einer Weile kurzzeitige Aussetzer bemerkte, wenn man andere ressourcenlastige Applikationen mit hoher Priorität startete. (Dies resultiert in etwas kryptischen xrun-Meldungen). Ich spielte danach an Pufferparametern, Periodenparametern und Prioritätsparametern im Jack-Aufruf herum ( z.B. : -P 0 -p 512 -n 2 ). Nur mit begrenztem Erfolg. Es gab dennoch immer mal wieder einen kleinen Aussetzer. Für die Analyse hatte ich bisher keine Zeit. Da ich aber was von Echtzeit gelesen hatte, wollte ich nun Jack mit Echtzeit-Priorität starten.

Zweite Hürde: Jack mit Echtzeitpriorität?
Der (gem. man-Doku) erforderliche Aufruf

jackd -v -R -d alsa -d hw:0

scheitert mit einer Meldung des Systems, dass man dazu keine Berechtigungen hat. Gut so! Warum sollte ein beliebiger User das auch dürfen; das wäre ein immenses Sicherheitsrisiko. Jack als root zu starten ist aus dem gleichen Grund unsinnig. Das bringt einen auf den Gedanken, dass man wohl in den PAM-Dateien einen Einstellung vornehmen muss. Tatsächlich sind Einträge in der Datei /etc/security/limits.conf gefragt. Will man etwa genau einem User namens “ralph” die notwendigen Rechte geben, so sind folgende Einträge angebracht :

ralf – rtprio 99
ralf – memlock unlimited
ralf – nice -19

(Für Gruppen greife man statt “ralph” zu “@gruppenname”. )

Der User Ralf darf dann tatsächlich nach einem neuen Login jackd -R ausführen. Und nun läuft der Sound auch völlig ruckelfrei und problemlos in fast jeder Belastungslage des Systems.

Dritte Hürde: JackEQ läuft nicht ohne vorgegebenen Suchpfad
Im nächsten Schritt möchte man gerne JackEQ und andere Programme aus dem Jack-Umfeld starten. Das misslingt zumindest im Fall von JackEQ jedoch. Startet man vom Terminal aus, so erhält man die Meldung, dass die Library dj_eq_1901.so nicht gefunden wird. Nach einer kurzen Recherche findet man, dass man das Paket xxxx installieren muss. Leider reicht das auch nicht, denn JackEQ vermutet die Bibliotheken zumindest auf einem 64Bit-
System im falschen Verzeichnis. Eine Suche im Internet ergibt dann, dass man unter Opensuse tunlichst

export LADSPA_PATH=”/usr/lib64/ladspa”

in eine der profile-Dateien für den Start der Shell einfügen sollte. Danach werden die Bibliotheken auch gefunden und JackEQ verrichtet seinen Dienst zusammen mit Jack.

Fazit
Jack in Ehren – aber an der Installationsfreundlichkeit lässt sich noch Einiges verbessern.

Tja, und was war eigentlich der Anlass für das Ganze? Ach ja, Rosegarden. Ein Test zeigt, dass auch dieses Programm läuft – zumindest im Prinzip. Auch hier meldet das Programm nämlich das Fehlen diverser benötigter Zusatzprogramme, die sich jedoch nachinstallieren lassen. Zu Rosegarden mehr an anderer Stelle.

Links
http://lau.linuxaudio.org/jack/
http://jackaudio.org/faq

Heiße Tage, sensors und KPowersave

Temp

An so warmen Tagen wie heute, in denen sich das Thermometer im Arbeitsraum sich in die Nähe von 30° bewegt, kommt ab und zu Sorge über den Temperaturzustand und das Wohlbefinden der Desktop-Systeme auf. Manch einer, der vom Board-Hersteller seiner Wahl unter MS-Windows mit hübscher Zusatzsoftware verwöhnt wurde, mag sich dann fragen, wie er unter Linux an entsprechende Informationen gelangt. Unter einer aktuellen SuSE-Distribution ist das i.d.R. kein Problem dank umfänglicher Libraries und Module zur Unterstützung einer Vielfalt von Sensoren. Unter anderen Distributionen muss man sich ggf. ein kleines Startskript zum Laden der Module selbst schreiben.

Ksysguard, sensors-detect und sensors
Auf unseren Rechnern befinden sich in der Regel Asus-Boards. Nach dem Einrichten der jeweiligen Linux-Systeme (Opensuse) lassen wir immer auch das nette Tool “/usr/sbin/sensors-detect” laufen und nehmen zu den identifizierten Sensoren der Boards und des Prozessors die entsprechenden Konfigurationseinträge in der Datei /etc/modprobe.conf vor. Unter SuSE versehen wir zusätzlich die Datei “/etc/sysconfig/lmsensors” mit Einträgen wie von “sensors-detect” vorgeschlagen. Übrigens: Ein zusätzlicher Blick in die Datei “/etc/sensors.conf” ist in jedem Fall interessant und lehrreich.

Ein kleines Startscript startet dann unter Suse die Sensor-spezifischen Module während des Hochfahrens der Systeme. Ein ähnliches Skript kann man auch zum manuellen Start der Sensor-Module verwenden. Bei einem unserer Rechner sieht der zentrale Teil des Skripts etwa wie folgt aus:

modprobe i2c-nforce2
modprobe eeprom
modprobe it87
modprobe k8temp
# sleep 2 # optional
/usr/bin/sensors -s

Danach bleibt eigentlich nur noch übrig, unter der KDE-Applikation “ksysguard” ein sog. “Arbeitsblatt” für die Temperatur und Lüfterdaten anzulegen und die Updatefrequenz vorzugeben. (Die verschiedenen verfügbaren Sensoren werden im linken Bereich des “ksysguard”-Fensters angezeigt.)
Unter KDE lasse ich mich dann nicht nur über die aktuellen internen Temperaturen des lokalen Rechners (s. Bild), sondern auch über den Zustand anderer Linux-Desktop-PCs informieren (per ssh -X Verbindung). Traut man den graphischen Bildern nicht oder braucht man Werte genauer, so hilft der Aufruf von “/usr/bin/sensors” im Terminal oder an der Konsole.

KPowersave
Hat man erst einmal vernünftige Informationen über die Temperaturen des Prozessors und des Chipsatzes am Display, so lohnt es sich, verschiedene Einflussfaktoren auf die Temperatur zu studieren. U.a. kann man ein wenig mit KPowersave herumzuspielen. Viele AMD- und Intel-Prozessoren können über entsprechende Schema-Einstellungen unter KPowersave auch dynamisch getaktet werden. Voraussetzung ist i.d.R., dass eine entsprechende Option im BIOS geschaltet ist (z.B. “AMD Cool and Quiet”). Meiner Erfahrung nach bringt das Umstellen des CPU-Frequenzschemas auf “dynamic” u.U. bis zu 8 ° Celsius Temperaturabsenkung im zeitlichen Mittel. Das ist an sehr heißen Tagen eine beträchtliche Reserve und man vermeidet unter normalen Lastanforderungen permanent hoch drehende CPU-Lüfter.

KPower_CPU

Zusätzlicher Seitenlüfter im Gehäuse bei Heatpipes auf dem Mainboard
Gerade bei Mainboards mit einer Heatpipe zur Kühlung des Chipsatzes lohnt sich evtl. auch der Einbau eines kleinen (leisen) Lüfters in die seitliche Gehäusewand, der vertikal kühle Luft von außen auf die Kühlbleche der Pipes lenkt. Dieser zusätzliche Lüfter brachte bei mir eine erhebliche Temperaturabsenkungen des Boards.

IE7, bicubic interpolation – nicht immer!

Im Internet kann man feststellen, dass viele Microsoft Fans begeistetr darauf reagiert haben, dass der IE7 mit Opera bzgl. der Skalierung von Webseiten und Ihrer Inhalte gleichgezogen hat. Ein Schlagwort in diesem Zusammenhang ist die bikubische Interpolation – für Numeriker und Physiker ein uralter Hut, mit dem jetzt halt auch Browser ausstaffiert werden.

Dagegen gibt es an und für sich nichts zu sagen. In der Praxis kann man aber das Verfahren der bikubischen Interpolation nicht immer “blind” einsetzen, und leider ist die Implementierung von MS auf den zweiten Blick auch nicht intelligent genug. Ein schönes Beispiel hatten wir vor kurzem, als wir auf einer Webseite Bilder aneinander gereiht haben, die vom Bildinhalt her nahtlos ineinander laufen. Realisierung z.B. mit Container-DIV und gefloateten Images. Nun möchte man diese Nahtlosigkeit gerne auch im Browser sehen – und dort auch nach einer Skalierung des gesamten Seite (Strg +).

Ergebnis in Opera: Kein Problem.
Ergebnis im IE7: In der Normalansicht (keine Skalierung) kein Problem. Bei einer Vergrößerung der Browseransicht mit “Strg +” wird aber offenbar jedes Bild einzeln bikubisch interpoliert. Dies führt im Ergebnis zu klar erkennbaren Rändern und manchmal sogar transparenten Zwischenräumen zwischen den Bildern. Das Hindurchschimmern des Hintergrundes kann man durch “margin:-1px” künstlich beheben. Die durch die Interpolation erzeugten minimalen Randstreifen jedes Bildes verschwinden jedoch nicht.
Ganz schlimm wird die Sachen, wenn die Bilder in einzelnen aneinander grenzenden Tabellenzellen untergebracht werden – obwohl die Bilder die Zellen ausfülllen, cellspacing, cellpadding, border auf 0 bzw. im Falle von CSS “border-collapse” etc. richtig gesetzt sind.

Das wird z.B. dann sehr unangenehm, wenn man Bilder verwendet, um den Rand eines Bereichs schön zu gestalten – z.B. mit abgerundeten Ecken. Die auftretenden Streifen zwischen den Bildern trüben die mühsam erarbeiteten Effekte sehr.

Woran liegt das? Nun, MS interpoliert die Bildern anscheinend einzeln. Bikubische Interpolationen sind an (scharfen) Rändern problematisch (Überschwingen). Hier muss man mit der Vorgabe der Randwerte aufpassen und den Rand ggf. einer Sonderbehandlung unterziehen, oder in der Nähe des Randes das Interpolationsverfahren wechseln. In der Regel der Vergleich mit Umgebungsdaten außerhalb des Randes. Im MS IE7 wird das leider nicht automatisch gemacht.

Es gibt aber eine Lösung:
Microsoft hat mit der Einführung der bikubischen Interpolation dem Anwender die Möglichkeit gelassen, per CSS-Anweisung auch ein anderes Interpolationsverfahren zu wählen. So gibt es zwei mögliche MS-spezifische CSS-Anweisungen:

-ms-interpolation-mode:bicubic
oder
-ms-interpolation-mode:nearest-neighbor

Bei Bildern, die man also auch nach einem Strg + nahtlos und ohne Randeffekte aneinandergehängt sehen möchte, muss man dem -Tag der aneinandergrenzenden Bilder halt ein
style=”-ms-interpolation-mode:nearest-neighbor” mitgeben. Dann funktioniert die Sache – leider auf Kosten der Interpolationsqualität.

Compiz-Fusion – besser als Beryl?

3D-Compiz

Nach dem Verschmelzen des Beryl-Projektes mit Compiz habe ich damals die Version 0.65 von Compiz-Fusion ausprobiert. Ich war eher enttäuscht. Sehr schlecht fand ich den überdeutlichen Tearing Effekt an den vertikalen Seiten von Wobbling-Windows. Die Einstellung zur VBlank-Synchronization, die man im Compiz-Fusion-Einstellungsdialog vornehmen konnte, zeigte in meiner Version leider auch keinerlei Wirkung. Jedenfalls nicht bei Verwendung der nativen Nvidia-Funktionen zur 3D-Deskop Unterstützung.

Das schien mir unter Beryl viel besser gelöst. (Die Methoden zur Synchronisation mit der Vertikalfrequenz der Grafikkarte sind offensichtlich in Beryl und in Compiz verschieden.)

Hinzu kamen danach dann größere Probleme mit dem x86_64_169-Treiber von Nvidia. Ich bin dann für ein paar Monate wieder auf das alte Beryl umgestiegen.

Inzwischen hat sich jedoch an Compiz-Fusion Einiges verbessert und es gibt Positives zu berichten:

  1. Die Option zur Vertikalsynchronization zeigt Wirkung. Der Tearing-Effekt für die Vertikalseiten lässt sich damit deutlich reduzieren. Insgesamt leidet dann jedoch die Performance beim Drehen des Würfels spürbar – im Besonderen dann, wenn mehr als 4 Würfelseiten vorhanden sind. Die Option “Loose-Binding” zeigt dann manchmal positive Wirkung. Die Verhältnisse sind jedenfalls so, dass man damit leben kann.
  2. Mir gefallen der neue Einstellungsdialog und etliche der neuen Optionen inzwischen sehr gut.

Also im Moment lohnt es sich wieder mit dem 3D-Desktop zu spielen, wenn man dafür Zeit erübrigen kann. Ein kleiner Augenschmaus ist das allemal.

Weboutput von PHP in Datei umlenken

Problemstellung
In einem unserer letzten Projekte stellte sich das Problem, den Output eines PHP-Programms – eine Webseite – nicht per HTTP zu einem Browser zu transportieren, sondern parallel auch als Datei wegzuschreiben. Die Webseite wurde auf Basis eines TPL-Templates erzeugt.

Lösungsansatz
Nun könnte man meinen, dass man hierzu in komplizierter Weise neben den Befehlen zum Füllen des Templates parallel fwrite-Befehle absetzen muss. Es geht jedoch viel kompakter und einfacher, indem man den Output puffert und die gepufferten Strings in die gewünschte Datei schreibt.

Diese Lösung haben wir ”’Jani Hartikainen”’ zu verdanken und in seinem Blog gefunden.

Lösung
Zu benutzen sind die Funktionen ob_start() und ob_end_flush(). Die Funktion ob_start() akzeptiert einen optionalen Parameter für eine callback-Funktion und hier setzt das Verfahren an.

Wir zeigen das an einem einfachen Beispiel, nämlich den letzten Zeilen des Codes zum Füllen eines ITX-Templates


function generate output () 
{
  // letzter Schritt im template, z.B. Anzeige von Warnungen und Fehlern    

  $template->setCurrentBlock("ERROR_VA");
     $template->setVariable("ERR_VIS", $vis_error); 				
     $template->setVariable("ERROR_MSG", $error_msg); 			
  $template->parseCurrentBlock();

  // Öffnen eines Files 
  $ob_file = fopen('output.html','w');

  // Pufferung unter Rückgriff auf die callback-Funktion aktivieren 
  ob_start('ob_file_callback');
		
  // Der Output - nämlich in diesem Fall die aus dem Template HTML-Datei wird in den Puffer gelenkt 
  $template->show();

  // Pufferung beenden und File schließen 		
  ob_end_flush();
  fclose($ob_file);
  exit;
}

function ob_file_callback($buffer)
{

  global $ob_file;                       // hier kann man über das Erstellen einer Klasse viel verbessern 
  fwrite($ob_file, $buffer);        // Umlenken des Puffers in die Datei output.html

  // Das nachfolgende Return-Statement sorgt dafür, dass der Output gleichzeitig auch auf dem Browser-Schirm  zu sehen ist. 
  return $buffer;

}

Verbesserungen
Dieses Beispiel verdeutlich nur das Prinzip. Jani Hartikainen beschreibt in seinem Blog-Artikel, wie man das Vorgehen in einer Klasse kapselt. Der geschätzte Leser möge sich dort bitte weiter informieren.