RoarAudio/Vortrag/Erster Vortrag: Unterschied zwischen den Versionen

Aus UUGRN
K (→‎Vorführung: genaure ideen samlung)
K (Typo)
Zeile 1: Zeile 1:
<div style="background:#fee846;text-align:left; color: #000;font-weight:bold;font-size:125%;margin: 0px 5px 0px 0; padding: 4px 4px 4px 14px;">Was ist RoarAudio?</div>
<div style="background:#fee846;text-align:left; color: #000;font-weight:bold;font-size:125%;margin: 0px 5px 0px 0; padding: 4px 4px 4px 14px;">Was ist RoarAudio?</div>
<div style="margin: 0 5px 5px 0; padding: 1em 1em 1em 1em; border: 1px solid #fee846; background-color:#fffdf5;">
<div style="margin: 0 5px 5px 0; padding: 1em 1em 1em 1em; border: 1px solid #fee846; background-color:#fffdf5;">
; Ziel : ein Vortrag über [[RoarAudio]] und die realtime Audio mixing Problematik vor einem Unixpublikum mit keinen oder kaum Vorwissen zum Thema.
; Ziel : ein Vortrag über [[RoarAudio]] und die Realtime Audio mixing Problematik vor einem Unixpublikum mit keinen oder kaum Vorwissen zum Thema.
</div>
</div>


Zeile 14: Zeile 14:


==== Was ist ein Soundserver ====
==== Was ist ein Soundserver ====
Ein Soundserver ist eine Programm das im Hintergrund Audio Daten mischt und das Ergebnis weiter leidet, meist an eine Soundcard.
Ein Soundserver ist eine Programm das im Hintergrund Audio Daten mischt und das Ergebnis weiter leitet, meist an eine Soundcard.


Soundserver werden benötigt wenn wenn das unterliegende Audio Ausgabe-Gerät nur einen Datenstrom zu einer zeit verarbeiten kann (Single Stream Soundcards). Sie Stellen eine Art virtuelle Soundcard da zu der Programme wie Player ihre Daten schicken können um eine Simultane Ausgabe mit zum Beispiel Notify-Sounds von Chat Clients oder ähnlichem zu ermöglichen.
Soundserver werden benötigt wenn wenn das unterliegende Audio-Ausgabegerät nur einen Datenstrom zu einer Zeit verarbeiten kann (Single Stream Soundcards). Sie stellen eine Art virtuelle Soundcard dar zu der Programme wie Player ihre Daten schicken können um eine simultane Ausgabe mit zum Beispiel Notify-Sounds von Chat Clients oder ähnlichem zu ermöglichen.


Sie bieten meist weitere Funktionen wie das Mischen unter berücksichtigung von verschiedenen Pegeln. Einige Soundserver ermöglichen auch die Benutzung von Netzwerken zur Übertragung von Audio Daten zur Wiedergabe auf einer anderen Maschine. Dies Beides kann auch RoarAudio.
Sie bieten meist weitere Funktionen wie das Mischen unter Berücksichtigung von verschiedenen Pegeln. Einige Soundserver ermöglichen auch die Benutzung von Netzwerken zur Übertragung von Audio Daten zur Wiedergabe auf einer anderen Maschine. Dies beides kann auch RoarAudio.


=== Projekt Ziele ===
=== Projekt Ziele ===
Das Projekt verfolgt im Prinzip das Ziel eine leistungsfähige Mischsoftware für den Studio Betrieb zur Verfügung zu stellen aber dennoch ein Produkt zu liefen das auch für den Heim-Anwender angemessen ist.
Das Projekt verfolgt im Prinzip das Ziel, eine leistungsfähige Mischsoftware für den Studio Betrieb zur Verfügung zu stellen, aber dennoch ein Produkt zu liefern das auch für den Heim-Anwender angemessen ist.


==== für Heim-Anwender ====
==== für Heim-Anwender ====
Heim-Anwender Teilen sich in zwei Gruppen auf:
Heim-Anwender Teilen sich in zwei Gruppen auf:
Die größere Menge interessiert es nicht wieso Musik aus den Lautsprechern kommt, Hauptsache sie tut es. Für diese Gruppe muss RoarAudio einfach ''out of the box'' funktionieren.
Die größere Menge interessiert es nicht wieso Musik aus den Lautsprechern kommt, Hauptsache sie tut es. Für diese Gruppe muss RoarAudio einfach ''out of the box'' funktionieren.
Die Andere Gruppe sind Anwender die mehr machen wollen. Hier soll RoarAudio ein leistungsstarkes Backend sein das möglichst Ressourcen schonend alle gewünschten Funktionen anbietet.
Die andere Gruppe sind Anwender die mehr machen wollen. Hier soll RoarAudio ein leistungsstarkes Backend sein das möglichst Ressourcen schonend alle gewünschten Funktionen anbietet.


==== Im Studio Betrieb ====
==== Im Studio Betrieb ====
Wie Oben schon angedeutet ist RoarAudio aber im Studio Einsatz wesentlich interessanter: In einem klassisches Studio steht meist ein großes analoges Mischpult. Dies ist eine Wundervolle Sache solange man primär Analoge Eingänge braucht: Beispielsweise von einer Band. In Heutigen Radio- und Fernsehstudios kommen aber die meisten Kanäle aus dem Rechner oder anderen Digitalen Geräten wie CD Spielern.
Wie oben schon angedeutet ist RoarAudio aber im Studio Einsatz wesentlich interessanter: in einem klassischen Studio steht meist ein großes analoges Mischpult. Dies ist eine wundervolle Sache solange man primär analoge Eingänge braucht: beispielsweise von einer Band. In heutigen Radio- und Fernsehstudios kommen aber die meisten Kanäle aus dem Rechner oder anderen digitalen Geräten wie CD Spielern.


Ein Analoges Mischen hat hier nun mehre Nachteile, die wichtigsten sind wohl:
Ein analoges Mischen hat hier nun mehre Nachteile, die wichtigsten sind wohl:
* Analoges Rauschen
* Analoges Rauschen
* Verzerrungen im Frequenzgang
* Verzerrungen im Frequenzgang
* Klirren
* Klirren
* Quantisierungsrauchen
* Quantisierungsrauchen
* Effekte durch Asynchrone Abtastung
* Effekte durch asynchrone Abtastung


Eine Alternative wäre in einigen Fällen sicherlich ein Digital-Mischpult. Diese sind aber Meist sehr teuer.
Eine Alternative wäre in einigen Fällen sicherlich ein Digital-Mischpult. Diese sind aber meist sehr teuer.


RoarAudio kommt hier als erst einmal rein Software basierende Lösung. Natürlich ist es möglich über die Steuerschnittstellen auch Externe Hardware an zu schließen. Hier gibt es auch Planungen ein Hardware Frontend zu entwerfen das dann Kostengünstig zu haben ist.
RoarAudio kommt hier als erst einmal reine Software-basierende Lösung. Natürlich ist es möglich über die Steuerschnittstellen auch externe Hardware anzuschließen. Hier gibt es auch Planungen, ein Hardware Frontend zu entwerfen das dann kostengünstig zu haben ist.


=== Exkurs: Codecs und Container ===
=== Exkurs: Codecs und Container ===
Ein Codec ist eine Spezifikation (meist werden auch die Implementierungen Codec genannt) wie Rohdaten, im Falle von Audio meist PCM Daten, Als Datenstrom oder -block repräsentiert werden. Hierzu Zählt meist als primäres Kriterium die Kompression. Weitere Informationen wie Synchronisationsdaten können ebenfalls durch den Codec Spezifiziert sein werden aber meist im Container abgelegt.
Ein Codec ist eine Spezifikation (meist werden auch die Implementierungen Codec genannt) wie Rohdaten, im Falle von Audio meist PCM Daten, als Datenstrom oder -block repräsentiert werden. Hierzu zählt meist als primäres Kriterium die Kompression. Weitere Informationen wie Synchronisationsdaten können ebenfalls durch den Codec spezifiziert sein, werden aber meist im Container abgelegt.


Ein Container ist im Gegensatz zu einem Codec eine Spezifikation wie Daten die mittels Codecs codiert wurden in eine Datei oder einen Stream verpackt werden. Hierzu Zählen Dinge wie globale File-Magic, Angabe des Codecs, Meta Daten, Angaben über rate/bps/channels und Ähnliches.
Ein Container ist im Gegensatz zu einem Codec eine Spezifikation wie Daten die mittels Codecs in eine Datei codiert wurden in oder einen Stream verpackt werden. Hierzu zählen Dinge wie globale File-Magic, Angabe des Codecs, Meta Daten, Angaben über rate/bps/channels und Ähnliches.


==== Verschiedene Arten von Codecs ====
==== Verschiedene Arten von Codecs ====
Zeile 56: Zeile 56:


=== Was hebt RoarAudio hervor? ===
=== Was hebt RoarAudio hervor? ===
Hier Sollen einige der Besonderen Fähigkeiten von RoarAudio Erläutert werden.
Hier Sollen einige der besonderen Fähigkeiten von RoarAudio erläutert werden.


==== Codecs ====
==== Codecs ====
RoarAudio zeichnet sich dadurch aus das er zusätzlich zu PCM Rohdaten auch höher Codecs versteht. Dies hat mehre Vorteile:
RoarAudio zeichnet sich dadurch aus daß er zusätzlich zu PCM Rohdaten auch höher Codecs versteht. Dies hat mehre Vorteile:


* Der Server kann Streams in höheren Codecs selbstständig verarbeiten. Dies ist zum Beispiel wichtig um Webradio im Als Background Stream ab zu spielen.
* Der Server kann Streams in höheren Codecs selbstständig verarbeiten. Dies ist zum Beispiel wichtig um Webradio als Background Stream ab zu spielen.
* Es ist dem Server möglich direkt Streaming-Server wie [[icecast]] zu Bedinen. Es ist keine weitere ''lange pipe'' nötig um Webradio zu senden. Dies verringert die Störanfälligkeit erheblich und verringert die Latenz da pipe-Puffer entfallen.
* Es ist dem Server möglich direkt Streaming-Server wie [[icecast]] zu bedienen. Es ist keine weitere ''lange pipe'' nötig um Webradio zu senden. Dies verringert die Störanfälligkeit erheblich und verringert die Latenz, da pipe-Puffer entfallen.
* Auch ist nur mit stark komprimierenden Codecs es möglich über dem Heim-Anwender zur Verfügung stehenden Schmalband Anschlüssen Audio entweder von Client zu Server oder zwischen zwei Servern aus zu tauchen. Auch eine Kopplung über ISDN Kanäle ist so möglich.
* Auch ist es nur mit stark komprimierenden Codecs möglich über die dem Heim-Anwender zur Verfügung stehenden Schmalband Anschlüsse Audio entweder von Client zu Server oder zwischen zwei Servern auszutauschen. Auch eine Kopplung über ISDN Kanäle ist so möglich.


==== Netzwerk-Transparenz ====
==== Netzwerk-Transparenz ====
RoarAudio ist Netzwerk transparent, das heißt das Applikationen keinen Unterschied sehen zwischen Verbindungen mit einer Lokalen Instanz oder einer auf einem anderen Rechner.
RoarAudio ist Netzwerk transparent, das heißt das Applikationen keinen Unterschied sehen zwischen Verbindungen mit einer lokalen Instanz oder einer auf einem anderen Rechner.


Zu diesem Zweck werden mehre Protokolle Unterstützt: UNIX Domain Sockets für Lokale Verbindungen sowie TCP/IP und DECnet für Verbindungen mit entfernten Rechnern. Auch existiert Support für verschiedene Proxy Typen.
Zu diesem Zweck werden mehre Protokolle unterstützt: UNIX Domain Sockets für Lokale Verbindungen sowie TCP/IP und DECnet für Verbindungen mit entfernten Rechnern. Auch existiert Support für verschiedene Proxy Typen.


==== Background Streams ====
==== Background Streams ====
Background Streams sind Streams die vom Server selbst bearbeitet werden und keinen Player benötigen um abgespielt zu werden. Dies kann zum Beispiel genutzt werden um Hintergrundmusik ein zu spielen wie Beispielsweise in einem Kaufhaus. Auch Webradio Streams werden hier unterstützt.
Background Streams sind Streams die vom Server selbst bearbeitet werden und keinen Player benötigen um abgespielt zu werden. Dies kann zum Beispiel genutzt werden um Hintergrundmusik einzuspielen wie beispielsweise in einem Kaufhaus. Auch Webradio Streams werden hier unterstützt.


==== Virtual IO ====
==== Virtual IO ====
Zeile 79: Zeile 79:
''Viele Programme haben keine Unterstützung für RoarAudio, was nun?''
''Viele Programme haben keine Unterstützung für RoarAudio, was nun?''


Um dieses Problem zu lösen gibt es diverse Kompatibilitäts Bibliotheken.
Um dieses Problem zu lösen gibt es diverse Kompatibilitäts-Bibliotheken.
Diese Stellen Bibliotheken da welche binär kompatibel andere Audio Systeme emulieren.
Diese stellen Bibliotheken dar welche binär-kompatibel andere Audio Systeme emulieren.
Dazu müssen sie schlichtweg einfach anstelle der Bibliothek des entsprechen Systems installiert werden und Leiten dann alle anfragen an RoarAudio weiter. Dies geschieht natürlich nur im Rahmen des Funktionsumfang der entsprechen Bibliothek.
Dazu müssen sie schlichtweg einfach anstelle der Bibliothek des entsprechen Systems installiert werden und leiten dann alle Anfragen an RoarAudio weiter. Dies geschieht natürlich nur im Rahmen des Funktionsumfang der entsprechenden Bibliothek.


Die mit Abstand wohl wichtigste ist '''libroaresd''' welche das [[EsounD]] Interface Emuliert. das EsounD Interface wird von den allermeisten Applikationen unterstützt da es das wohl älteste Soundserver Interface ist. Es existiert seit 1998.
Die mit Abstand wohl wichtigste ist '''libroaresd''' welche das [[EsounD]] Interface emuliert. das EsounD Interface wird von den allermeisten Applikationen unterstützt da es das wohl älteste Soundserver Interface ist. Es existiert seit 1998.


Weitere Kompatibilitäts Bibliotheken gibt es für das YIFF Sound System, KDEs aRtsc und PulseAudio. Zusammen mit den Existierenden Plugins deckt dies nahezu den vollständigen Player Markt fuer GNU/Linux und BSD ab.
Weitere Kompatibilitäts Bibliotheken gibt es für das YIFF Sound System, KDEs aRtsc und PulseAudio. Zusammen mit den existierenden Plugins deckt dies nahezu den vollständigen Player Markt fuer GNU/Linux und BSD ab.


===== Welche Schnittstelle für was? =====
===== Welche Schnittstelle für was? =====
Zeile 116: Zeile 116:


=== Konzepte und Architektur ===
=== Konzepte und Architektur ===
RoarAudio ist zwar in C geschrieben aber großen Teils Objekt orientiert.
RoarAudio ist zwar in C geschrieben aber größtenteils Objekt-orientiert.


==== Clients und Streams ====
==== Clients und Streams ====


Vor allem wichtig und nach Ausen hin sichtbar sind die Client und Stream Objekte.
Vor allem wichtig und nach Außen hin sichtbar sind die Client und Stream Objekte.
Ein Client Objekt verkörpert einen (Netzwerk) Client, zum Beispiel einen Player oder ein Steuerprogramm wie roarctl. Es kann auch Stream Objekte assoziiert haben (Beispielsweise im Falle von Abspielen von Musik).
Ein Client Objekt verkörpert einen (Netzwerk) Client, zum Beispiel einen Player oder ein Steuerprogramm wie roarctl. Es kann auch Stream Objekte assoziiert haben (Beispielsweise im Falle von Abspielen von Musik).


Ein Stream Objekt stellt einen eigentlichen Audio Datenstrom da. Dieses Objekt beinhaltet diverse Informationen über den Datenstrom: Informationen wie der roard ihn auslesen kann, Sample Rate/Bits/Channels, Meta Daten und vieles mehr. Ein Stream gehört immer zu einem Client. Wobei der Client auch der roard selbst sein kann und sich durch attachen wechseln lest. Dies Kommt zum Einsatz um Hintergrund Streams zu ermöglichen.
Ein Stream Objekt stellt einen eigentlichen Audio Datenstrom da. Dieses Objekt beinhaltet diverse Informationen über den Datenstrom: Informationen wie der roard ihn auslesen kann, Sample Rate/Bits/Channels, Meta Daten und vieles mehr. Ein Stream gehört immer zu einem Client. Wobei der Client auch der roard selbst sein kann und sich durch attachen wechseln läßt. Dies kommt zum Einsatz um Hintergrund Streams zu ermöglichen.


Bei Jedem Audio Datenstrom der in den roard hinein oder heraus fliest handelt es sich um einen Stream. Dies schliest Datenströme zu Geräten wie Soundcards mit ein. Hier durch ist eine maximale Flexibilität gegeben.
Bei jedem Audio Datenstrom der in den roard hinein oder heraus fließt handelt es sich um einen Stream. Dies schließt Datenströme zu Geräten wie Soundcards mit ein. Hier durch ist eine maximale Flexibilität gegeben.


===== Stream Typen =====
===== Stream Typen =====
Zeile 137: Zeile 137:
  | Play
  | Play
  | zu Server
  | zu Server
  | Standard Typ: Eingehende Audio Daten.
  | Standard Typ: eingehende Audio Daten.
  |-
  |-
  | Monitor
  | Monitor
  | von Server
  | von Server
  | Hier werden die Aktuellen gemischten Audio Daten vom Server Abgefragt.
  | Hier werden die aktuellen gemischten Audio Daten vom Server abgefragt.
  |-
  |-
  | Filter
  | Filter
  | bidirektional
  | bidirektional
  | Dieser Stream Dient zum zwischenschalten von Filtern im Mixer
  | Dieser Stream dient zum zwischenschalten von Filtern im Mixer
  |-
  |-
  | Output
  | Output
Zeile 174: Zeile 174:


===== Stream Flags =====
===== Stream Flags =====
Ein Stream kann des weiteren Flags haben die sein Verhalten genauer bestimmen. Die Flags sind Hier zusammen gefasst:
Ein Stream kann desweiteren Flags haben die sein Verhalten genauer bestimmen. Die Flags sind hier zusammen gefasst:


{| class="wikitable"
{| class="wikitable"
Zeile 181: Zeile 181:
  |-
  |-
  | Primary
  | Primary
  | Bei ende des Streams beendet sich roard selbst.
  | Bei Ende des Streams beendet sich roard selbst.
  |-
  |-
  | Output
  | Output
Zeile 193: Zeile 193:
  |-
  |-
  | Meta
  | Meta
  | Ausgehende Streams mit diesem Flag beziehen ihre Meta Daten automatisch von Eingehenden Streams mit diesem Flag.
  | Ausgehende Streams mit diesem Flag beziehen ihre Meta Daten automatisch von eingehenden Streams mit diesem Flag.
  |-
  |-
  |}
  |}


==== Driver ====
==== Driver ====
Ein Driver ist ein Objekt das eine Schnittstelle zur Verfügung stellt um Externe Ressourcen an zu sprechen die sich nicht der UNIX IO Philosophie entsprechend verhalten (Erweiterte Handshake zum Beispiel). Dies können Soundcards oder auch Streaming Server sein. Hierzu zählen als Beispiel der OSS (Open Sound System) und der libshout (Icecast) Treiber.
Ein Driver ist ein Objekt das eine Schnittstelle zur Verfügung stellt um externe Ressourcen anzusprechen, die sich nicht der UNIX IO Philosophie entsprechend verhalten (Erweiterte Handshake zum Beispiel). Dies können Soundcards oder auch Streaming Server sein. Hierzu zählen als Beispiel der OSS (Open Sound System) und der libshout (Icecast) Treiber.


==== Sources ====
==== Sources ====
Eine Source ist an sich ein normaler Stream. Der unterschied besteht darin das roard selbst den Stream beim Starten Inizialiesiert. Neben Test Szenarien ist dies vor allem Hilfreich um sich die Audio Ausgabe eines anderen Rechners lokal zu Spiegeln.
Eine Source ist an sich ein normaler Stream. Der Unterschied besteht darin das roard selbst den Stream beim Starten initialisiert. Neben Test Szenarien ist dies vor allem hilfreich um sich die Audio Ausgabe eines anderen Rechners lokal zu spiegeln.


==== Codecfilter ====
==== Codecfilter ====
Bei den Codecfiltern handelt es sich um ein Abstraktions Layer welches roard die möklichkeit gibt höhre Codecs zu sprechen wie etwa Ogg Vorbis. Einige Codecfilter können nur Lesen andere auch Schreiben. Wird ein Stream mit einem unterstützen Codec aufgebaut so wird automatisch eine Instanz eines passenden Codecfilters erzeugt. Sie verhalten sich somit weitgehend Transparent. Viele höheren Codec sind allerdings nicht in der Lage alle Stream Typen zu bedienen. Der Streamtype Filter wird am wenigsten Unterstützt da er ein exaktes Timing und Blocking Verhalten benötigt.
Bei den Codecfiltern handelt es sich um ein Abstraktions Layer welches roard die Möglichkeit gibt höhere Codecs zu sprechen wie etwa Ogg Vorbis. Einige Codecfilter können nur Lesen andere auch Schreiben. Wird ein Stream mit einem unterstützen Codec aufgebaut so wird automatisch eine Instanz eines passenden Codecfilters erzeugt. Sie verhalten sich somit weitgehend transparent. Viele höheren Codec sind allerdings nicht in der Lage alle Stream Typen zu bedienen. Der Streamtype Filter wird am wenigsten unterstützt da er ein exaktes Timing und Blocking Verhalten benötigt.


<!--
<!--
Zeile 213: Zeile 213:


=== Probleme des Realtime Audio Mischens ===
=== Probleme des Realtime Audio Mischens ===
Beim Mischen in realtime kommen zu den Problemen die beim Normalen Mischen von Audio auftreten noch weitere hinzu.
Beim Mischen in Realtime kommen zu den Problemen die beim normalen Mischen von Audio auftreten noch weitere hinzu.


Die Wichtigsten Probleme sind:
Die wichtigsten Probleme sind:


* Resampling - Wenn nicht alle Streams die selbe Abtast Frequens haben müssen die betroffenen Streams auf die Abtastrate des Ausgangs umgerechnet werden. Hierzu gibt es diverse verfahren. Man kann sich das etwa wie das Skalieren eines Bildes vorstellen: Es gibt Filter die sind schnell und welche die sind gut. Muss man in realtime resampeln so muss man vorallem schnell sein, will aber auch noch möglichst gut sein. Viele Soundserver behalten schlichtweg die Pegel entsprechent der neuen Abtaste Rate länger oder kürzer bei. Dies erzeugt Rechteck Signale welche diverse Oberwellen Erzeugen. RoarAudio setzt hier Polynomapporximation dritten Gardes ein. Dies Reduziert die Oberwellen schon deutlich dank leichter Tiefpass Eigenschaft.
* Resampling - Wenn nicht alle Streams dieselbe Abtastfrequens haben müssen die betroffenen Streams auf die Abtastrate des Ausgangs umgerechnet werden. Hierzu gibt es diverse Verfahren. Man kann sich das etwa wie das Skalieren eines Bildes vorstellen: Es gibt Filter die sind schnell und welche die sind gut. Muss man in Realtime resampeln so muss man vor allem schnell sein, will aber auch noch möglichst gut sein. Viele Soundserver behalten schlichtweg die Pegel entsprechend der neuen Abtaste Rate länger oder kürzer bei. Dies erzeugt Rechteck Signale welche wiederum diverse Oberwellen erzeugen. RoarAudio setzt hier Polynomapproximation dritten Grades ein. Dies reduziert die Oberwellen schon deutlich dank leichter Tiefpass Eigenschaft.
* Da nicht für den gesamten Titel der Amplituden-Gang bestimmt werden kann kann es passieren das es zu so genannten clipping kommt. Clipping bezeichnet das Problem das wenn die Summe der Amplituden aller Eingangssignale größer ist als der zulässige Wertebereich. In diesem falle wird das Ausgangssignal geclippt, sprich es wird auf den maximalen sich im zulässigen Wertebereich liegenden Wert herunter gesetzt. Dies lässt sich nicht vollkommen vermeiden aber durch geschickte Wahl des Mischverfahrens reduzieren. Es empfiehlt sich dennoch dem einen ReplayGain ein zu beziehen. Dieser kann das Clipping zwar auch nicht komplett verhindern aber der Soundserver kann besser abschätzen wie die gefahr für Clipping ist rechtzeitig reagieren.
* Da nicht für den gesamten Titel der Amplituden-Gang bestimmt werden kann ist es möglich daß es zu sogenanntem Clipping kommt. Clipping bezeichnet das Problem, daß die Summe der Amplituden aller Eingangssignale größer ist als der zulässige Wertebereich. In diesem Falle wird das Ausgangssignal geclippt, sprich es wird auf den maximalen sich im zulässigen Wertebereich liegenden Wert herunter gesetzt. Dies lässt sich nicht vollkommen vermeiden aber durch geschickte Wahl des Mischverfahrens reduzieren. Es empfiehlt sich dennoch dem einen ReplayGain einzubeziehen. Dieser kann das Clipping zwar auch nicht komplett verhindern aber der Soundserver kann besser abschätzen wie die Gefahr für Clipping ist und rechtzeitig reagieren.
* Vor allem beim Pegel umrechnen kommt es selbstverständlich zu Rechenungenauigkeiten. Um diese zu minimieren skaliert RoarAudio die Signale auf bis zu ihrer doppelten größe auf um Rechenungenauigkeiten zu vermeiden. bei einem 16 Bit Eingangssignal wird als Beispiel auf 32 Bit skaliert was zusätzliche 96dB Rauschabstand während der Umrechnung liefert.
* Vor Allem beim Pegel umrechnen kommt es selbstverständlich zu Rechenungenauigkeiten. Um diese zu minimieren skaliert RoarAudio die Signale auf bis zu ihrer doppelten Größe auf um Rechenungenauigkeiten zu vermeiden. bei einem 16 Bit Eingangssignal wird als Beispiel auf 32 Bit skaliert was zusätzliche 96dB Rauschabstand während der Umrechnung liefert.
* Werden Signale mit verschiedenen Pegeln gemischt so kann es Sinnig sein mit der Breite der Ausgangs Samples hoch zu gehen. Als Beispiel wenn zwei Signale mit 16 Bit mit den Pegeln 1 und 1/4 gemischt werden reduziert der Rauschabstand des zweiten Signals um 12dB. Man sollte überlegen auf 24 Bit am Ausgang zu wechseln. Die Allgemeine Regel lautet: für den Faktor 2 oder 6dB die ein Signal abgeschwächt wird braucht man am Ausgang ein Bit mehr. Wenn mal also ein Hintergrund Musik mit -48dB auf Sprache mischt (durchaus realistisch) muss man von 16 Bit am Ausgang auf 24 Bit hoch gehen um keinen Qualitäts-Verlust der Musik zu erhalten.
* Werden Signale mit verschiedenen Pegeln gemischt so kann es sinnvoll sein mit der Breite der Ausgangs-Samples hoch zu gehen. Als Beispiel: wenn zwei Signale mit je 16 Bit mit den Pegeln 1 und 1/4 gemischt werden reduziert der Rauschabstand des zweiten Signals um 12dB. Man sollte überlegen auf 24 Bit am Ausgang zu wechseln. Die Allgemeine Regel lautet: für den Faktor 2 oder 6dB die ein Signal abgeschwächt wird braucht man am Ausgang ein Bit mehr. Wenn mal also eine Hintergrund-Musik mit -48dB auf Sprache mischt (durchaus realistisch) muss man von 16 Bit am Ausgang auf 24 Bit hoch gehen um keinen Qualitäts-Verlust der Musik zu erhalten.
* Einige Formate sind nicht Frame basierend. Dies sind vor allem MIDI Formate Hier Kann es passieren das die Synchronisation zwischen diesen Streams und den anderen sich an Frame Grensen treffe. Dies kann zu unschönen Nebeneffekten führen. Manche Codecs sind auch nur in der lage auf gewisse Zeitraster Ende-Marken zu setzen was in unsauberen Enden mit Artefakten enden kann. IM realtime Bereich lässt sich dies nicht korrigieren und solche Codecs sollten vermieden werden.
* Einige Formate sind nicht Frame basierend. Dies sind vor allem MIDI Formate Hier kann es passieren das die Synchronisation zwischen diesen Streams und den anderen sich an Frame-Grenzen treffe. Dies kann zu unschönen Nebeneffekten führen. Manche Codecs sind auch nur in der Lage auf gewisse Zeitraster Ende-Marken zu setzen was in unsauberen Enden mit Artefakten enden kann. Im Realtime Bereich lässt sich dies nicht korrigieren und solche Codecs sollten vermieden werden.




==== Problem: Lokale Syncronität ====
==== Problem: Lokale Synchronität ====
Die wichtigsten Störfaktoren sind:
Die wichtigsten Störfaktoren sind:


* Wie jede Hardware besitzen Soundkarten eine Verzögerung. Das heißt das sie eine gewisse zeit braucht zwichen erhalt von Daten und deren Ausgabe. Diese zeit liegt im Bereich von wenigen Millisekunden (z.B. Studio Karten) und kann bis in den Bereich von mehren hundert Millisekunden gehen (z.B. 2.5 Euro USB Karten von $SUPERMARKT), je nach Karte. Die meisten Karten bieten aber eine Möglichkeit ab zu fragen wo sie gerade in ihrem Puffer sind. Wie dies genau Funktioniert ist von Karte zu Karte Unterschiedlich. Der Treiber der Karte ist dafür zuständig diese Funktionen an höhere Interfaces (OSS, alsa, sndio,...) weiter zu reichen und den Applikationen zur Verfügung zu stellen.
* Wie jede Hardware besitzen Soundkarten eine Verzögerung. Das heißt daß sie eine gewisse Zeit brauchen zwischen Erhalt von Daten und deren Ausgabe. Diese Zeit liegt im Bereich von wenigen Millisekunden (z.B. Studio Karten) und kann bis in den Bereich von mehren hundert Millisekunden gehen (z.B. 2.5 Euro USB Karten von $SUPERMARKT), je nach Karte. Die meisten Karten bieten aber eine Möglichkeit ab zu fragen wo sie gerade in ihrem Puffer sind. Wie dies genau funktioniert ist von Karte zu Karte unterschiedlich. Der Treiber der Karte ist dafür zuständig diese Funktionen an höhere Interfaces (OSS, alsa, sndio,...) weiterzureichen und den Applikationen zur Verfügung zu stellen.
* Neben dem Delay in der Hardware erzeugt selbstverständlich auch der Kernel und die Treiber eine weiter Verzögerung. Dies passiert aus vielen Gründen: Der Programmcode muss natürlich erst einmal ausgeführt werden. Auch werden Interupts nicht um bedingt sofort bearbeitet (zum Beispiel weil gerade ein anderer, höherwertiger bearbeitet wird).
* Neben dem Delay in der Hardware erzeugt selbstverständlich auch der Kernel und die Treiber eine weiter Verzögerung. Dies passiert aus vielen Gründen: Der Programmcode muss natürlich erst einmal ausgeführt werden. Auch werden Interupts nicht um bedingt sofort bearbeitet (zum Beispiel weil gerade ein anderer, höherwertiger bearbeitet wird).
* Die nächste Schicht, die Sound APIs, erzeugen auf ähnliche weise weiteren Delay. Hier kommt dazu das viele mit relativ großen Puffern arbeiten. Die Puffergröße ist in dem meisten fällen die kleinste Einheit in der Synchronität gewährleistet werden kann.
* Die nächste Schicht, die Sound APIs, erzeugen auf ähnliche Weise weitere Delays. Hier kommt dazu das viele mit relativ großen Puffern arbeiten. Die Puffergröße ist in dem meisten Fällen die kleinste Einheit in der Synchronität gewährleistet werden kann.
* Da die Meisten Systeme (alle auf denen RoarAudio läuft) Multitasking betreiben stellt sich ein weiteres Problem: Der entsprechende Prozess muss eine Zeitscheibe bekommen bevor er Reagieren kann. Läuft ein anderer Prozess gerade so muss er potentiell Warten. Auf den Meisten POSIX kompatiblem Systemen Basiert das Multitasking zwar auf Ereignissen, sprich ein Prozess läuft so lange bis ein anderer ein Ereignis zu bearbeiten hat (keine Feste Zeitscheiben Länge) was dazu führt das dieses Problem ist nicht all zu groß ist. Aber es kann natürlich gerade ein anderer Prozess mit höherer Priorität laufen der ein anderes Ereignis bearbeitet und somit nicht vom Kernel unterbrochen wird.
* Da die meisten Systeme (alle auf denen RoarAudio läuft) Multitasking betreiben stellt sich ein weiteres Problem: Der entsprechende Prozess muss eine Zeitscheibe bekommen bevor er reagieren kann. Läuft ein anderer Prozess gerade so muss er potentiell warten. Auf den meisten POSIX kompatiblem Systemen basiert das Multitasking zwar auf Ereignissen, sprich ein Prozess läuft so lange bis ein anderer ein Ereignis zu bearbeiten hat (keine feste Zeitscheiben-Länge), was dazu führt das dieses Problem ist nicht all zu groß ist. Aber es kann natürlich gerade ein anderer Prozess mit höherer Priorität laufen der ein anderes Ereignis bearbeitet und somit nicht vom Kernel unterbrochen wird.
* Unsyncrnes clocking
* Unsynchrones clocking


==== Problem: Netzwerk Syncronität ====
==== Problem: Netzwerk Synchronität ====
* lag
* lag
* jitter
* jitter
Zeile 242: Zeile 242:
...
...
==== Win32 Port ====
==== Win32 Port ====
Ein Win32 Port existiert zum jetzigen Zeitpunkt nicht. Dies liegt an mehren Faktoren: Zum einen ist Win32 nicht was den nahe-realtime betrieb angeht nicht zuverlässig genug. Zum anderen ist bei Win32 das Networking kein teil des Kernels wie auf UNIX und POSIX Systemen: Es ist viel mehr teilweise im Userland. Dies hat zur folge das zu jedem Zeitpunkt eine Applikation wissen muss von welchem type ein Filehandle ist da man Basis Funktionen wie read(), write(), close() nicht auf alle Filehandles anwenden kann. Vielmehr hat jeder Type von Filehandle seinen eigenen Satz Funtionen. RoarAudio verfolgt die UNIX Philosophie: ''Alles ist eine Datei''. Große Patches wären nötig.
Ein Win32 Port existiert zum jetzigen Zeitpunkt nicht. Dies liegt an mehren Faktoren: Zum einen ist Win32 nicht was den nahe-realtime Betrieb angeht nicht zuverlässig genug. Zum anderen ist bei Win32 das Networking kein Teil des Kernels wie auf UNIX und POSIX Systemen: Es ist viel mehr teilweise im Userland. Dies hat zur Folge das zu jedem Zeitpunkt eine Applikation wissen muss von welchem Type ein Filehandle ist da man Basis Funktionen wie read(), write(), close() nicht auf alle Filehandles anwenden kann. Vielmehr hat jeder Type von Filehandle seinen eigenen Satz Funtionen. RoarAudio verfolgt die UNIX Philosophie: ''Alles ist eine Datei''. Große Patches wären nötig.


Ein Weiteres ist das ein solcher Port viel zeit in Anspruch nimmt und weder das Projekt noch die Freie Software bewegung voranbringt.
Ein Weiteres ist das ein solcher Port viel Zeit in Anspruch nimmt und weder das Projekt noch die Freie Software Bewegung voranbringt.


Im Moment existieren kleinere Patches die vielleicht irgendwann mal Basis Funktionalität mit sich bringen könnten. An ein roard für Win32 ist in absehbarer Zeit nicht zu denken.
Im Moment existieren kleinere Patches die vielleicht irgendwann mal Basis Funktionalität mit sich bringen könnten. An ein roard für Win32 ist in absehbarer Zeit nicht zu denken.


Allerdings laufen teile von RoarAudio in Cygwin mehr oder minder gut. Viele Probleme treten hier auf aber es ist Prinzipiell möglich es unter Cygwin zum laufen zu bringen (außerhalb des nahe-realtime Betriebs).
Allerdings laufen Teile von RoarAudio in Cygwin mehr oder minder gut. Viele Probleme treten hier auf aber es ist prinzipiell möglich es unter Cygwin zum Laufen zu bringen (außerhalb des nahe-realtime Betriebs).


Es besteht aber die Möglichkeit einige Win32 Applikationen mittels pseudo Web Radio Streams an zu binden.
Es besteht aber die Möglichkeit einige Win32 Applikationen mittels pseudo Web Radio Streams anzubinden.


==== MP3 ====
==== MP3 ====

Version vom 26. Januar 2009, 22:30 Uhr

Was ist RoarAudio?
Ziel
ein Vortrag über RoarAudio und die Realtime Audio mixing Problematik vor einem Unixpublikum mit keinen oder kaum Vorwissen zum Thema.
RoarAudio Logo

Der Autor

Philipp ph3-der-loewe Schafft, Software Entwickler und Projekt Urheber.

Vortrag

Was ist RoarAudio?

RoarAudio ist ein Soundserver.

Was ist ein Soundserver

Ein Soundserver ist eine Programm das im Hintergrund Audio Daten mischt und das Ergebnis weiter leitet, meist an eine Soundcard.

Soundserver werden benötigt wenn wenn das unterliegende Audio-Ausgabegerät nur einen Datenstrom zu einer Zeit verarbeiten kann (Single Stream Soundcards). Sie stellen eine Art virtuelle Soundcard dar zu der Programme wie Player ihre Daten schicken können um eine simultane Ausgabe mit zum Beispiel Notify-Sounds von Chat Clients oder ähnlichem zu ermöglichen.

Sie bieten meist weitere Funktionen wie das Mischen unter Berücksichtigung von verschiedenen Pegeln. Einige Soundserver ermöglichen auch die Benutzung von Netzwerken zur Übertragung von Audio Daten zur Wiedergabe auf einer anderen Maschine. Dies beides kann auch RoarAudio.

Projekt Ziele

Das Projekt verfolgt im Prinzip das Ziel, eine leistungsfähige Mischsoftware für den Studio Betrieb zur Verfügung zu stellen, aber dennoch ein Produkt zu liefern das auch für den Heim-Anwender angemessen ist.

für Heim-Anwender

Heim-Anwender Teilen sich in zwei Gruppen auf: Die größere Menge interessiert es nicht wieso Musik aus den Lautsprechern kommt, Hauptsache sie tut es. Für diese Gruppe muss RoarAudio einfach out of the box funktionieren. Die andere Gruppe sind Anwender die mehr machen wollen. Hier soll RoarAudio ein leistungsstarkes Backend sein das möglichst Ressourcen schonend alle gewünschten Funktionen anbietet.

Im Studio Betrieb

Wie oben schon angedeutet ist RoarAudio aber im Studio Einsatz wesentlich interessanter: in einem klassischen Studio steht meist ein großes analoges Mischpult. Dies ist eine wundervolle Sache solange man primär analoge Eingänge braucht: beispielsweise von einer Band. In heutigen Radio- und Fernsehstudios kommen aber die meisten Kanäle aus dem Rechner oder anderen digitalen Geräten wie CD Spielern.

Ein analoges Mischen hat hier nun mehre Nachteile, die wichtigsten sind wohl:

  • Analoges Rauschen
  • Verzerrungen im Frequenzgang
  • Klirren
  • Quantisierungsrauchen
  • Effekte durch asynchrone Abtastung

Eine Alternative wäre in einigen Fällen sicherlich ein Digital-Mischpult. Diese sind aber meist sehr teuer.

RoarAudio kommt hier als erst einmal reine Software-basierende Lösung. Natürlich ist es möglich über die Steuerschnittstellen auch externe Hardware anzuschließen. Hier gibt es auch Planungen, ein Hardware Frontend zu entwerfen das dann kostengünstig zu haben ist.

Exkurs: Codecs und Container

Ein Codec ist eine Spezifikation (meist werden auch die Implementierungen Codec genannt) wie Rohdaten, im Falle von Audio meist PCM Daten, als Datenstrom oder -block repräsentiert werden. Hierzu zählt meist als primäres Kriterium die Kompression. Weitere Informationen wie Synchronisationsdaten können ebenfalls durch den Codec spezifiziert sein, werden aber meist im Container abgelegt.

Ein Container ist im Gegensatz zu einem Codec eine Spezifikation wie Daten die mittels Codecs in eine Datei codiert wurden in oder einen Stream verpackt werden. Hierzu zählen Dinge wie globale File-Magic, Angabe des Codecs, Meta Daten, Angaben über rate/bps/channels und Ähnliches.

Verschiedene Arten von Codecs

  • Verlustfreie
  • Verlustbehaftete
  • Musik Codecs
  • Sprach Codecs
  • Niederlatenz Codecs


Was hebt RoarAudio hervor?

Hier Sollen einige der besonderen Fähigkeiten von RoarAudio erläutert werden.

Codecs

RoarAudio zeichnet sich dadurch aus daß er zusätzlich zu PCM Rohdaten auch höher Codecs versteht. Dies hat mehre Vorteile:

  • Der Server kann Streams in höheren Codecs selbstständig verarbeiten. Dies ist zum Beispiel wichtig um Webradio als Background Stream ab zu spielen.
  • Es ist dem Server möglich direkt Streaming-Server wie icecast zu bedienen. Es ist keine weitere lange pipe nötig um Webradio zu senden. Dies verringert die Störanfälligkeit erheblich und verringert die Latenz, da pipe-Puffer entfallen.
  • Auch ist es nur mit stark komprimierenden Codecs möglich über die dem Heim-Anwender zur Verfügung stehenden Schmalband Anschlüsse Audio entweder von Client zu Server oder zwischen zwei Servern auszutauschen. Auch eine Kopplung über ISDN Kanäle ist so möglich.

Netzwerk-Transparenz

RoarAudio ist Netzwerk transparent, das heißt das Applikationen keinen Unterschied sehen zwischen Verbindungen mit einer lokalen Instanz oder einer auf einem anderen Rechner.

Zu diesem Zweck werden mehre Protokolle unterstützt: UNIX Domain Sockets für Lokale Verbindungen sowie TCP/IP und DECnet für Verbindungen mit entfernten Rechnern. Auch existiert Support für verschiedene Proxy Typen.

Background Streams

Background Streams sind Streams die vom Server selbst bearbeitet werden und keinen Player benötigen um abgespielt zu werden. Dies kann zum Beispiel genutzt werden um Hintergrundmusik einzuspielen wie beispielsweise in einem Kaufhaus. Auch Webradio Streams werden hier unterstützt.

Virtual IO

(gestrichen)

Kompatibilitäts Bibliotheken

Viele Programme haben keine Unterstützung für RoarAudio, was nun?

Um dieses Problem zu lösen gibt es diverse Kompatibilitäts-Bibliotheken. Diese stellen Bibliotheken dar welche binär-kompatibel andere Audio Systeme emulieren. Dazu müssen sie schlichtweg einfach anstelle der Bibliothek des entsprechen Systems installiert werden und leiten dann alle Anfragen an RoarAudio weiter. Dies geschieht natürlich nur im Rahmen des Funktionsumfang der entsprechenden Bibliothek.

Die mit Abstand wohl wichtigste ist libroaresd welche das EsounD Interface emuliert. das EsounD Interface wird von den allermeisten Applikationen unterstützt da es das wohl älteste Soundserver Interface ist. Es existiert seit 1998.

Weitere Kompatibilitäts Bibliotheken gibt es für das YIFF Sound System, KDEs aRtsc und PulseAudio. Zusammen mit den existierenden Plugins deckt dies nahezu den vollständigen Player Markt fuer GNU/Linux und BSD ab.

Welche Schnittstelle für was?
Interface Beispiel Applikationen
libroar roaraudio-tools, XMMS, mplayer, (xine)
EsounD GNOME, KDE, XMMS, xine, Amarok, wine,... (177 weitere unter Debian Stable)
libao vorbis-tools, FLAC tools, mpd, mpg321, gnomoradio, somaplayer
aRts(c) (KDE) Player mit aRts support: mplayer, xine; kwave, kaudiocreator,...
PulseAudio Ein paar Programme, die meisten über Plugins. (nicht viel unter Debian Stable)
YIFF y-tools
gstreamer GNOME, Alle GNOME Player. Dieverse andere.

Konzepte und Architektur

RoarAudio ist zwar in C geschrieben aber größtenteils Objekt-orientiert.

Clients und Streams

Vor allem wichtig und nach Außen hin sichtbar sind die Client und Stream Objekte. Ein Client Objekt verkörpert einen (Netzwerk) Client, zum Beispiel einen Player oder ein Steuerprogramm wie roarctl. Es kann auch Stream Objekte assoziiert haben (Beispielsweise im Falle von Abspielen von Musik).

Ein Stream Objekt stellt einen eigentlichen Audio Datenstrom da. Dieses Objekt beinhaltet diverse Informationen über den Datenstrom: Informationen wie der roard ihn auslesen kann, Sample Rate/Bits/Channels, Meta Daten und vieles mehr. Ein Stream gehört immer zu einem Client. Wobei der Client auch der roard selbst sein kann und sich durch attachen wechseln läßt. Dies kommt zum Einsatz um Hintergrund Streams zu ermöglichen.

Bei jedem Audio Datenstrom der in den roard hinein oder heraus fließt handelt es sich um einen Stream. Dies schließt Datenströme zu Geräten wie Soundcards mit ein. Hier durch ist eine maximale Flexibilität gegeben.

Stream Typen

Es gibt diverse Verschiedene Stream typen. Die folgende Tabelle Beschreibt sie kurz:

Typ Richtung Beschreibung
Play zu Server Standard Typ: eingehende Audio Daten.
Monitor von Server Hier werden die aktuellen gemischten Audio Daten vom Server abgefragt.
Filter bidirektional Dieser Stream dient zum zwischenschalten von Filtern im Mixer
Output vom Server Dieser Stream geht an einen Driver Richtung Soundcard oder ähnlichem
Mixing keine Interne Audio Puffer genutzt zum Mischen der Daten
Bidir bidirektional Play und Monitor in einem.
Record vom Server Im Moment nicht Unterstützt.
Meta Flag Abhänig Im Moment nicht Unterstützt.
Internal keine Im Moment nicht Unterstützt.
Stream Flags

Ein Stream kann desweiteren Flags haben die sein Verhalten genauer bestimmen. Die Flags sind hier zusammen gefasst:

Name Beschreibung
Primary Bei Ende des Streams beendet sich roard selbst.
Output Es wird Ein Output Driver für diesen Stream verwendet.
Source Bei diesem Stream handelt es sich um eine Source.
Sync Der Stream ist Synchron (mit Hardware bzw. seinem Ziel)
Meta Ausgehende Streams mit diesem Flag beziehen ihre Meta Daten automatisch von eingehenden Streams mit diesem Flag.

Driver

Ein Driver ist ein Objekt das eine Schnittstelle zur Verfügung stellt um externe Ressourcen anzusprechen, die sich nicht der UNIX IO Philosophie entsprechend verhalten (Erweiterte Handshake zum Beispiel). Dies können Soundcards oder auch Streaming Server sein. Hierzu zählen als Beispiel der OSS (Open Sound System) und der libshout (Icecast) Treiber.

Sources

Eine Source ist an sich ein normaler Stream. Der Unterschied besteht darin das roard selbst den Stream beim Starten initialisiert. Neben Test Szenarien ist dies vor allem hilfreich um sich die Audio Ausgabe eines anderen Rechners lokal zu spiegeln.

Codecfilter

Bei den Codecfiltern handelt es sich um ein Abstraktions Layer welches roard die Möglichkeit gibt höhere Codecs zu sprechen wie etwa Ogg Vorbis. Einige Codecfilter können nur Lesen andere auch Schreiben. Wird ein Stream mit einem unterstützen Codec aufgebaut so wird automatisch eine Instanz eines passenden Codecfilters erzeugt. Sie verhalten sich somit weitgehend transparent. Viele höheren Codec sind allerdings nicht in der Lage alle Stream Typen zu bedienen. Der Streamtype Filter wird am wenigsten unterstützt da er ein exaktes Timing und Blocking Verhalten benötigt.


Probleme des Realtime Audio Mischens

Beim Mischen in Realtime kommen zu den Problemen die beim normalen Mischen von Audio auftreten noch weitere hinzu.

Die wichtigsten Probleme sind:

  • Resampling - Wenn nicht alle Streams dieselbe Abtastfrequens haben müssen die betroffenen Streams auf die Abtastrate des Ausgangs umgerechnet werden. Hierzu gibt es diverse Verfahren. Man kann sich das etwa wie das Skalieren eines Bildes vorstellen: Es gibt Filter die sind schnell und welche die sind gut. Muss man in Realtime resampeln so muss man vor allem schnell sein, will aber auch noch möglichst gut sein. Viele Soundserver behalten schlichtweg die Pegel entsprechend der neuen Abtaste Rate länger oder kürzer bei. Dies erzeugt Rechteck Signale welche wiederum diverse Oberwellen erzeugen. RoarAudio setzt hier Polynomapproximation dritten Grades ein. Dies reduziert die Oberwellen schon deutlich dank leichter Tiefpass Eigenschaft.
  • Da nicht für den gesamten Titel der Amplituden-Gang bestimmt werden kann ist es möglich daß es zu sogenanntem Clipping kommt. Clipping bezeichnet das Problem, daß die Summe der Amplituden aller Eingangssignale größer ist als der zulässige Wertebereich. In diesem Falle wird das Ausgangssignal geclippt, sprich es wird auf den maximalen sich im zulässigen Wertebereich liegenden Wert herunter gesetzt. Dies lässt sich nicht vollkommen vermeiden aber durch geschickte Wahl des Mischverfahrens reduzieren. Es empfiehlt sich dennoch dem einen ReplayGain einzubeziehen. Dieser kann das Clipping zwar auch nicht komplett verhindern aber der Soundserver kann besser abschätzen wie die Gefahr für Clipping ist und rechtzeitig reagieren.
  • Vor Allem beim Pegel umrechnen kommt es selbstverständlich zu Rechenungenauigkeiten. Um diese zu minimieren skaliert RoarAudio die Signale auf bis zu ihrer doppelten Größe auf um Rechenungenauigkeiten zu vermeiden. bei einem 16 Bit Eingangssignal wird als Beispiel auf 32 Bit skaliert was zusätzliche 96dB Rauschabstand während der Umrechnung liefert.
  • Werden Signale mit verschiedenen Pegeln gemischt so kann es sinnvoll sein mit der Breite der Ausgangs-Samples hoch zu gehen. Als Beispiel: wenn zwei Signale mit je 16 Bit mit den Pegeln 1 und 1/4 gemischt werden reduziert der Rauschabstand des zweiten Signals um 12dB. Man sollte überlegen auf 24 Bit am Ausgang zu wechseln. Die Allgemeine Regel lautet: für den Faktor 2 oder 6dB die ein Signal abgeschwächt wird braucht man am Ausgang ein Bit mehr. Wenn mal also eine Hintergrund-Musik mit -48dB auf Sprache mischt (durchaus realistisch) muss man von 16 Bit am Ausgang auf 24 Bit hoch gehen um keinen Qualitäts-Verlust der Musik zu erhalten.
  • Einige Formate sind nicht Frame basierend. Dies sind vor allem MIDI Formate Hier kann es passieren das die Synchronisation zwischen diesen Streams und den anderen sich an Frame-Grenzen treffe. Dies kann zu unschönen Nebeneffekten führen. Manche Codecs sind auch nur in der Lage auf gewisse Zeitraster Ende-Marken zu setzen was in unsauberen Enden mit Artefakten enden kann. Im Realtime Bereich lässt sich dies nicht korrigieren und solche Codecs sollten vermieden werden.


Problem: Lokale Synchronität

Die wichtigsten Störfaktoren sind:

  • Wie jede Hardware besitzen Soundkarten eine Verzögerung. Das heißt daß sie eine gewisse Zeit brauchen zwischen Erhalt von Daten und deren Ausgabe. Diese Zeit liegt im Bereich von wenigen Millisekunden (z.B. Studio Karten) und kann bis in den Bereich von mehren hundert Millisekunden gehen (z.B. 2.5 Euro USB Karten von $SUPERMARKT), je nach Karte. Die meisten Karten bieten aber eine Möglichkeit ab zu fragen wo sie gerade in ihrem Puffer sind. Wie dies genau funktioniert ist von Karte zu Karte unterschiedlich. Der Treiber der Karte ist dafür zuständig diese Funktionen an höhere Interfaces (OSS, alsa, sndio,...) weiterzureichen und den Applikationen zur Verfügung zu stellen.
  • Neben dem Delay in der Hardware erzeugt selbstverständlich auch der Kernel und die Treiber eine weiter Verzögerung. Dies passiert aus vielen Gründen: Der Programmcode muss natürlich erst einmal ausgeführt werden. Auch werden Interupts nicht um bedingt sofort bearbeitet (zum Beispiel weil gerade ein anderer, höherwertiger bearbeitet wird).
  • Die nächste Schicht, die Sound APIs, erzeugen auf ähnliche Weise weitere Delays. Hier kommt dazu das viele mit relativ großen Puffern arbeiten. Die Puffergröße ist in dem meisten Fällen die kleinste Einheit in der Synchronität gewährleistet werden kann.
  • Da die meisten Systeme (alle auf denen RoarAudio läuft) Multitasking betreiben stellt sich ein weiteres Problem: Der entsprechende Prozess muss eine Zeitscheibe bekommen bevor er reagieren kann. Läuft ein anderer Prozess gerade so muss er potentiell warten. Auf den meisten POSIX kompatiblem Systemen basiert das Multitasking zwar auf Ereignissen, sprich ein Prozess läuft so lange bis ein anderer ein Ereignis zu bearbeiten hat (keine feste Zeitscheiben-Länge), was dazu führt das dieses Problem ist nicht all zu groß ist. Aber es kann natürlich gerade ein anderer Prozess mit höherer Priorität laufen der ein anderes Ereignis bearbeitet und somit nicht vom Kernel unterbrochen wird.
  • Unsynchrones clocking

Problem: Netzwerk Synchronität

  • lag
  • jitter
  • Netzwerk Implementierungen
  • QoS

Sonstiges

...

Win32 Port

Ein Win32 Port existiert zum jetzigen Zeitpunkt nicht. Dies liegt an mehren Faktoren: Zum einen ist Win32 nicht was den nahe-realtime Betrieb angeht nicht zuverlässig genug. Zum anderen ist bei Win32 das Networking kein Teil des Kernels wie auf UNIX und POSIX Systemen: Es ist viel mehr teilweise im Userland. Dies hat zur Folge das zu jedem Zeitpunkt eine Applikation wissen muss von welchem Type ein Filehandle ist da man Basis Funktionen wie read(), write(), close() nicht auf alle Filehandles anwenden kann. Vielmehr hat jeder Type von Filehandle seinen eigenen Satz Funtionen. RoarAudio verfolgt die UNIX Philosophie: Alles ist eine Datei. Große Patches wären nötig.

Ein Weiteres ist das ein solcher Port viel Zeit in Anspruch nimmt und weder das Projekt noch die Freie Software Bewegung voranbringt.

Im Moment existieren kleinere Patches die vielleicht irgendwann mal Basis Funktionalität mit sich bringen könnten. An ein roard für Win32 ist in absehbarer Zeit nicht zu denken.

Allerdings laufen Teile von RoarAudio in Cygwin mehr oder minder gut. Viele Probleme treten hier auf aber es ist prinzipiell möglich es unter Cygwin zum Laufen zu bringen (außerhalb des nahe-realtime Betriebs).

Es besteht aber die Möglichkeit einige Win32 Applikationen mittels pseudo Web Radio Streams anzubinden.

MP3

...

Querverweise

  • RAUM
  • Icecast
  • SIP
  • Xiph

Vorführung

  • Allgemeiner Betrieb
    • roard
    • roarvorbis/roarcatplay?
    • xmms
  • Background Streams
    • roarradio
  • Kompatibilitäts Bibliotheken
    • libroaresd:
      • xmms
      • mplayer
      • Amarok

Fragen

  • immer gerne