Registriert: Do Jun 28, 2007 17:58 Beiträge: 193
Programmiersprache: Pascal, C
In den letzten beiden Tagen habe ich ein wenig an Audorra herumgebastelt. Nun ist ein System hinzugekommen, mit dem Hindernisse im Raum verteilt werden können. Audorra berechnet mittels Raytracing, inwiefern Objekte zwischen Hörer und Tonquelle liegen und schwächt die Verstärkung der Tonquelle entsprechend ab.
Momentan wird dabei leider noch nicht die Abschwächung einzelner Frequenzen der Tonquelle durch die Materialien berücksichtigt, was dem Ganzen jedoch zu weitaus realistischerem Klang verhelfen sollte. Dies einzubauen ist mein nächster Schritt.
Der Plan für die Zukunft sieht folgendes vor: Mein momentaner Algorithmus ist (bezogen auf Grafik) mit Raytracing mit hartem Schattenwurf zu vergleichen (stellt man sich jede Tonquelle als Licht vor). Um eine realistische Tonumgebung zu schaffen möchte ich "Reflektionen/Streung" an den Wänden der Räume simulieren und somit (mehr oder weniger) "Global Illumination" realisieren. Meine aktuelle Idee sieht vor, für jeden Emitter rekursiv einige Teststrahlen auszusenden (16, bei jedem Kind entsprechend weniger) und an jedem Kollisionspunkt einen "Kindemitter" zu setzen. Solange die Szene statisch bleibt (d.h. die Raumgeometrie verändert sich nicht, keine Emitter werden verschoben), können alle Kindemitter im Speicher behalten werden. Da sich jedoch pro Emitter ca. 40 oder mehr Kindemitter bilden werden, muss ich mir noch einiges an Optimierung für meinen Renderer einfallen lassen.
Im Anhang ist ein aktuellen Bildschirmfoto meiner "Soundscape" Demo-Anwendung.
Registriert: Do Jun 28, 2007 17:58 Beiträge: 193
Programmiersprache: Pascal, C
Hallo,
mein Plan bezüglich Audorra hat sich in den letzten Wochen etwas geändert: Nachdem einige Tests unter Linux gezeigt haben, dass mein Filtergraphsystem alles andere als stabil läuft (sporadische Abstürze bei State-Changes etc.), vermutlich durch einige kleinere Unsauberheiten bei der Synchronisation zwischen den Threads, habe ich mich entschieden das Filtergraphsystem (welches auch vergleichsweise limitiert war) neu zu schreiben (wer sich unter dem Begriff Filtergraph nichts vorstellen kann, der sei erstmal auf Wikipedia verwiesen: http://en.wikipedia.org/wiki/Filter_graph).
Neue Struktur des Filtergraphs Das Neuschreiben ist nun in den Grundzügen geschehen. Im Gegensatz zum alten Filtergraphsytem kennen nun beide Filter einer Verbindung ihre Partner und können beim Freigeben eines Filters entsprechend notwendige Aktionen durchführen. Vorher war die einzige Verbindung zwischen den Filtern eine Callback-Funktion, eine Objektreferenz wurde nie ausgetauscht und die Filter mussten somit in einer festen Reihenfolge freigegeben werden. Die Basisfilterklasse verfügt (ähnlich wie die TAdSprite-Klasse von Andorra 2D) über mehrere protected "Do"-Methoden, die von den Kindern überschrieben werden müssen. Hierdurch kann ich die gesammte Thread-Synchronisation etc. zum großen Teil in dieser Klasse durchführen und habe somit einen Single Point of Failure, bzw. spare mir einigen Code der vorher Redundant war.
Dynamisches Austauschen von Filtern Zudem unterstützt mein Filtergraphsystem nun das dynamische austauschen von beliebigen Filtern während des Betriebs. Somit kann sogar der Ausgabetreiber (sprich das Audiobackend (Libao, DirectSound, WASPI) und/oder das Ausgabegerät (sprich die Soundkarte oder Verbindung)) dynamisch zur Laufzeit des Filtergraphs ausgetauscht werden.
Der Filtergraph wird während der Wiedergabe in einen festen zustand gebracht (mittels der neuen Initialize Funktion) und kann mit einem einfachen Finalize komplett beendet werden. Um Filter dynamisch zu entfernen, muss der Filtergraph angehalten (Suspend) und nach den Änderungen wieder aufgenommen werden (Resume). Folgender, kurzer Code, zeigt das austauschen des Audio-Backends (der jeweils letzte Filter des Filtergraphs muss bei den Aufrufen von Suspend und Resume verwendet werden):
Code:
flt_drv2 := TAuDriverOutputFilter.Create(strdrv2, 16); //Erzeuge einen neuen Ausgabetreiberfilter mit 16 Bit Bittiefe
flt_drv1.SuspendFiltergraph; //Halte den Filtergraph an try flt_dec.Target := flt_drv2; //Verbinde den Dekoderfilter mit dem neuen Ausgabefilter FreeAndNil(flt_drv1); //Gebe den alten Filter frei finally flt_drv2.ResumeFiltergraph; //Lasse den Filtergraph weiterlaufen end; flt_drv2.Play; //Starte die Wiedergabe des neuen Ausgabefilters
Pull statt Push Zudem habe ich die Audiobackends umstrukturiert: Sie warten nun nicht mehr darauf, dass ihnen freiwillig Daten gegeben werden (Push), sondern ziehen (Pull) die Daten über ein Callback direkt. Ich hoffe, dass dies mir Hilft die Latenzzeit mit einigen Audiobackends zu verbessern.
Puh, ich hoffe das hier ließt irgendjemand, ich lade die Änderungen ins SVN sobald alles wieder stabil läuft (kann noch ein paar Wochen dauern). Dann wird es auch Audorra Version 0.6 geben.
Registriert: Do Jun 28, 2007 17:58 Beiträge: 193
Programmiersprache: Pascal, C
Hallo,
ich bin nun recht weit mit der Umgestaltung fortgeschritten, lediglich der AuLibao und der AuWASPI-Audio-Treiber müssen noch (wie oben beschrieben) umgeschrieben werden. Bis jetzt macht das ganze System unter Linux einen recht stabilen Eindruck, einige Probleme konnte ich mit der Hilfe von valgrind's memcheck und helgrind aufspüren und beheben.
Aktuelle Versionen gibt es im SVN-Archiv.
Andreas
Edit: Meine Simple-Player-Demo läuft jetzt schon für eine Woche als ständiger Begleiter unter Linux ohne abzustürzen. Lediglich zwei Bugs stören mich noch: 1. Die Längenberechnung für MP3s funktioniert seit irgendeiner Version von FFMpeg nicht mehr richtig; 2. Das Seeken in einer Datei funktioniert nicht mehr, sobald diese komplett abgespielt worden ist. Diese Fehler muss ich unbedingt noch beheben...
Registriert: Do Jun 28, 2007 17:58 Beiträge: 193
Programmiersprache: Pascal, C
Hallo,
nachdem ich nach dem umbauen meines Libao-Drivers trotz aktualisieren auf die neuste Version auf ein paar Probleme gestoßen bin, habe ich mich zu dem gewagten Schritt entschieden noch einen Treiber für ALSA zu entwickeln. Meine Wahl viel auf ALSA, da dies die native Kernel-Schnittstelle ist und auf so gut wie allen Linux-Systemen verfügbar ist. Außerdem ist die ALSA-Schnittstelle meiner Meinung nach einiges einfacher zu implementieren gewesen.
PulseAudio ist meinen Recherchen nach immer noch unter anderem nur bei Ubuntu/Gnome als Default installiert. Dort ist zwar die Client-ALSA-Schnittstelle nur über PulseAudio emuliert. Der Audio Pfad sieht mit PA also folgendermaßen aus:
Der neue Audorra ALSA-Treiber ist nun der erste, der das neue Audorra-Audio-Treiber Interfacedesign voll ausnutzt. Latenzzeiten von 5-10ms sind gut damit (inklusive PA ALSA Emulation) machbar.
Der verwendete ALSA Header und Treiber (AuALSA) ist im SVN-Repository.
Registriert: Do Jun 28, 2007 17:58 Beiträge: 193
Programmiersprache: Pascal, C
Dokumentation und Website
In der letzten Zeit habe ich mich recht wenig zu Wort gemeldet und auch keinen Fortschritt an meinen Projekten gezeigt. Dies liegt zum einen daran, dass ich in der letzten Zeit einiges um die Ohren hatte/habe und zum anderen, dass ich vor einem neuen Release eines meiner Projekte a) das neue Dokumentationssystem fertig haben wollte (was hier zu besichtigen ist) und ich b) die Websites aller meiner Projekte vereinheitlichen will.
Momentan habe ich folgende Websites:
Andorra 2D - Verwendet ein Eigenbau-CMS welches ich mal für die Homepage meiner Schule geschrieben hatte
Audorra - Verwendet XML-Dateien auf dem Server die via PHP transformiert werden
Acinerella - Eine einzelne HTML-Datei auf dem Server
Ein Mediawiki im Andorracommons Projekt von SF, welches aber unverwendbar langsam ist.
Ich war lange auf der Suche nach einem entsprechendem fertig-System und habe mich mit allerlei Wiki-Software rumgeschlagen. Doch leider war ich mit keiner so richtig zufrieden und/oder sie lief nicht richtig auf dem SF-Server. Also habe ich mich auch hier an eine selbst-bastel-Lösung gemacht.
Folgende Punkte waren mir wichtig:
Verwaltung mehrere Projekte
Inline-Editing von Beiträgen
Wiki und Website in einem
Versionierung aller Beiträge
BB-Code Unterstüzung
Geschwindigkeit und geringe Größe
Rechtemanagement
Unterstützung für mehrere Sprachen und Unicode
Ich habe schon fast alle Punkte umgesetzt und auch ein relativ lesbares und übersichtliches Design gebastelt. Für die Verwaltung der Benutzer/Gruppen/Kategorien habe ich mich entschieden keine Oberfläche zu schrieben sondern das direkt in PHPMyAdmin zu machen - die Gruppen stehen alle schon fest und ein neuer Benutzer ist mit einem Insert hinzugefügt.
Auch wird man nicht in der Lage sein, sich über ein Web-Frontend zu registrieren, ich denke, dass die Methode eine persönliche E-Mail an mich zu schreiben eine recht hohe Schwelle für Bots oder mutwillige Zerstörung bietet (funktioniert hier im Wiki ja auch recht gut).
Mir fehlen nur noch einige "Kleinigkeiten" wie die Verlinkung zwischen Artikeln, Caching, funktionierende Links im Layout und jede Menge Testen.
Leider habe ich das ganze Projekt in PHP geschrieben und ich bin mir ziemlich sicher, dass das das letzte war, was ich freiwillig in PHP gemacht habe. Mich nervt die fehlende Typisierung, inkonsitente Funktionsaufrufe, quasi nicht existente Callbackfunktionen und die Tatsache, dass das Ganze nicht in Byte-/Maschinencode kompiliert wird und einem dabei aussagekräftige Fehlermeldungen/Warnungen liefert. Werde in Zukunft entweder auf CGI-Programme in FreePascal oder Python umsteigen.
Da ich in den nächsten Tage keinen PC habe wird es aber wohl trotzdem noch ein paar Wochen dauern bis das Ganze fertig ist. Außerdem muss ich noch alle Artikel von allen Websites dort einstellen und in der Datenbank entsprechend datieren.
Audorra an sich sollte einsatzbereit sein und ich werde bis zum Release (welches ich zusammen mit Acinerella erst dann mache, wenn der andere Kram fertig ist) nichts mehr verändern. Das SVN-Archiv ist also ohne Probleme zu verwenden.
Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.