RoarAudio/Vortrag/Programmieren mit RoarAudio VS

Aus UUGRN
Was ist RoarAudio?
Ziel
ein Vortrag über RoarAudios VS API vor einem Unixpublikum mit geringem Vorwissen zum Thema. Nach ende des Vortags sollen die Hörer in der Lage sein einfache Programme mit der VS API zu schreiben.
RoarAudio Logo

Abstrakt

Der Vortrag soll eine Einführung in die Programmierung mit der VS API aus libroar liefern. Im laufe des Vortrags werden die grundlegenden API Funktionen vorgestellt und mit Code Beispielen erläutert. Am Ende des Vortrags sollten die Zuhörer in der Lage sein einfache Programme mit der VS API zu schreiben.

Als Vorwissen empfiehlt es sich einen der Einführenden Vorträge besucht zu haben.

Über den Referent

Philipp 'ph3-der-loewe' Schafft schreibt seit etwa 10 Jahren Software (primär in C und Perl). Im Moment studiert er Elektrotechnik/Automatisierungstechnik.

Besondere Interessen liegen in dem Bereich der Netzwerke und Bus Systeme, Mikrocontrollern, Kryptographie und Digitaler Audio Verarbeitung sowie Entwicklung kreativer Lösungen für Mathematik und Logik Rätseln und Übungen.

In seiner Freizeit beschäftigt er sich außerdem intensiv mit Großkatzen.

Vortrag

Theorie

Schichten

Die VS API ist die im Moment höchste Schicht in libroar. Sie Abstrahiert mehre darunter liegenden Schichten wie die Simple API und VIO/DSTR.

OOP

Die VS API ist wie fast alles rund um RoarAudio Objekt Orientiert. Sie verwendet primär das so genannte VSS (von engl. "VS State") Objekt das sowohl Steuer-, Daten-, Datei-Verbindung Objekte sowie alle Puffer und Speicher Objekte die intern verwendet werden enthält.

Streaming Modus

...

Fehler Behandlung

  • Die meisten Aufraufe werfen -1 zurück im Fehlerfall. Ausnahmen sind beispielsweise Funktionen welche einen Pointer zurückgeben. Diese werfen NULL.
  • IO Funktionen können "short reads" bzw. "short writes" erzeugen.
  • Die Fehlervariable (&err) beinhaltet im Fehlerfall einen Fehler Code. Dieser kann mittels roar_vs_strerr(err) in eine Zeichenkette gewandelt werden.
int err;
ssize_t ret = roar_vs_write(vss, buf, len, &err);
if ( ret == -1 ) {
 fprintf(stderr, "Fehler beim schreiben: %s\n", roar_vs_strerr(err));
} else if ( ret < (ssize_t)len) {
 fprintf(stderr, "\"Short write\", nur %zi von %zu Bytes geschieben\n", ret, len);
}

Datei Modus

Die VS API besitzt einen Datei Modus (engl. "file mode") in dem sie direkt Dateien aber auch Streams abspielen kann. Dazu wird die Verbindung mittels roar_vs_new_from_file() geöffnet. Anschließend wird mittels roar_vs_run() oder roar_vs_iterate() der Datenstrom zum Server geschrieben. Am Schluss wird das Objekt normal mittels roar_vs_close() geschlossen.

Sollten Meta Daten, Lautstärke oder ähnliches gesetzt werden so sollte dies vor dem Aufruf von roar_vs_run() beziehungsweise vor dem ersten Aufruf von roar_vs_iterate() gesehen.

Beispiel:

roar_vs_t * vss = roar_vs_new_from_file(server, "MyApp", filename, &err);
ret = roar_vs_run(vss, &err);
ret = roar_vs_close(vss, ROAR_VS_FALSE, &err);

Im obigen Beispiel wird zum Server server (sollte normalerweise NULL sein) verbunden. Der Klient Name ist "MyApp". Als Dateiname wird filename verwendet. Danach wird roar_vs_run() aufgerufen was bis zum Dateiende (EOF) die Datei abspielt. Am ende wird ganz normal mittels roar_vs_close() die Verbindung geschlossen.

Da roar_vs_run() so lange läuft bis es das Dateiende erreicht oder ein Fehler auftritt ist blockt ist es nicht (trivial) möglich im selben Kontext weitere Dinge parallel aus zu führen. Da viele Programme aber ohne hin einen eigenen Thread für die Tonausgabe verwenden ist dies eine geringe Einschränkung. Für alle anderen Felle gibt es roar_vs_iterate() wie das folgende Beispiel zeigt:

roar_vs_t * vss = roar_vs_new_from_file(server, "MyApp", filename, &err);

while (alive) { /* main loop */
 // ...
 ret = roar_vs_iterate(vss, ROAR_VS_WAIT, &err);
}

ret = roar_vs_close(vss, ROAR_VS_FALSE, &err);

Gepufferter Modus

...

Meta Daten

Derzeit stellt die VS API zwei Meta Daten Schnittstellen zur Verfügung: Titel Meta Daten und Stream Rolle.

Titel Meta Daten

Die Titel Meta Daten (Normalerweise nur "Meta Daten) sind Informationen über den Aktuellen Titel: Künstler, Titel, Album, Genre, Version, Titelnummer, RPG, und viele mehr.

Diese werden mit der Funktion roar_vs_meta() gesetzt

struct roar_keyval kv[3] = {
 {"TITEL", "Test Titel"},
 {"ARTIST", "Irgendwer"},
 {"VERSION", "Vortrags Remix"}
};
ret = roar_vs_meta(vss, kv, 3 /* Anzahl der Datensätze */, &err);

Stream Rolle

Die Stream Rolle (engl. "stream role") gibt die Funktion des Streams an: Musik, Video, Ereignisse (z.B. Fehlermeldungs Töne), Spiel, Hintergrund Musik, Telephon,...

Diese wird mit der Funktion roar_vs_role() gesetzt:

ret = roar_vs_role(vss, ROAR_ROLE_MUSIC, &err);

Lautstärkesteuerung

Zur Lautstärkesteuerung stehen in der VS API drei Funktionen zur Verfügung: roar_vs_volume_mono(), roar_vs_volume_stereo() und roar_vs_volume_get().

Die beiden Ersetzen setzen die Lautstärke, jeweils im Mono oder im Stereo Modus. Das heißt sollte eine Datenstrom eine andere Anzahl von Kanälen haben so rechnen diese Funktionen automatisch um.

Die Lautstärke Skala geht vom 0 bis 1 (inklusive).

Im folgenden Beispiel wird die Lautstärke auf 50% (-6dB) eingestellt:

float c = 0.5; /* 50% */
ret = roar_vs_volume_mono(vss, c, &err);

Im zweiten Beispiel wird der Linke Kanal auf 50% (-6dB) und der Rechte Kanal auf 25% (-12dB) eingestellt:

float l = 0.5, r = 0.25;
ret = roar_vs_volume_stereo(vss, l, r, &err);

Die Lautstärke lässt sich mittels roar_vs_volume_get() wie folgt auslesen:

float l, r;
ret = roar_vs_volume_get(vss, &l, &r, &err);

Sollte die Mono-Lautstärke und nicht die L/R-Lautstärke gewünscht sein:

float c = (l + r)/2.0;

Zum Stumm schalten sollte die Lautstärke nicht geändert werden sondern das Mute-Flag verwendet werden (Nächste Folie).

Flags

Aktuell unterstützt die VS die beiden Flags "Mute" und "Pause".

Das Mute Flag schaltet die Ausgabe des Tons ab, der Stream läuft aber weiterhin. Das Flag Pause hält den Stream an so das er später fortgesetzt werden kann.

Die Flags werden mit den Funktionen roar_vs_pause() und roar_vs_mute() gesetzt:

ret = roar_vs_mute(vss, ROAR_VS_TRUE, &err);

Beziehungsweise:

ret = roar_vs_pause(vss, ROAR_VS_TRUE, &err);

Anstatt ROAR_VS_TRUE (zum setzen) kann natuerlich auch ROAR_VS_FALSE (zum rücksetzen) und ROAR_VS_TOGGLE (zum kippen) verwendet werden.

Mittels ROAR_VS_ASK kann der zustand angefragt werden.

Optionales

Interface zur Haupt API

...