AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Preview: Audorra Digital Audio Library (23.08.09)

Preview: Audorra Digital Audio Library (23.08.09)

Ein Thema von igel457 · begonnen am 20. Mär 2009 · letzter Beitrag vom 7. Feb 2010
Antwort Antwort
Seite 5 von 6   « Erste     345 6   
Benutzerbild von igel457
igel457
Registriert seit: 31. Aug 2005
Audorra - eine OpenSource Audiobibliothek für Spiele

Was ist das, bzw. was wird es werden?
Audorra ist eine Cross Plattform Audiobibliothek, die es ermöglicht Musik und Soundeffekte in Spielen (oder anderen Audio-Anwendungen) wiederzugeben. Dabei liegt volle Unterstützung für 3D-Surround Sound und Positionierung von Audioquellen im 3D-Raum vor. Audorra ist modular aufgebaut: Sowohl die Ausgabebibliothek ("driver", also z.B. WaveOut, DirectSound oder OpenAL) als auch die Decoder können über ein Pluginsystem statisch oder dynamisch gelinkt werden.

Warum dieses Projekt?
Audorra soll als Ergänzung zu meiner 2D-Grafikbibliothek Andorra und zu meiner Medienbibliothek Acinerella gesehen werden. Außerdem ist für Pascal abgesehen von ACS (welches keinen 3D Sound unterstützt) keine OpenSource Audiobibliothek vorhanden, oftmals wird FMOD oder die BASS verwendet - ein Misstand, der schleunigst behoben werden sollte.

Wie weit ist es?
Tja, da liegt der Haken bei der ganzen Sache: Das Projekt fliegt in seinem jetzigen Status schon seit gut zwei/drei Monaten auf meiner Platte rum. Jedoch habe ich momentan Aufgrund anderer Aktivitäten keine Zeit daran (und auch an Andorra) großartig weiter zu entwickeln. Das wird sich erst in den Sommerferien (hoffentlich) wieder ändern.
Um trotzdem meine bisherige Arbeit zu präsentieren (Wiedergabe von Musik mittels funktionierendem Filtergraphsystem über Waveout unter Verwendung eines nativen WAV-"Decoders" und Acinerella), habe ich mich entschlossen diesen Thread hier zu öffnen und das Projekt mit einem kleinen Demoprogramm hochzuladen.

Unterstützte Audioformate:
  • Nativ:
    • PCM WAVE
    Acinerella:
    • Audio: AIFF, MP3, FLAC, MPC, OGG VORBIS
      Video-Container: AVI, MPEG (VOB), FLV, OGG

Systemanforderungen:
Prozessor: Erfolgreich getestet auf einem 900Mhz Pentium III,
Speicher: braucht ca. 1MB RAM pro Stream.
Betriebsystem: Windows 2000 oder höher, Linux (MacOS sollte auch funktionieren - mangels MacOS aber noch nicht getestet)
IDE: Delphi >=6 oder Lazarus

Lizenz:
Das ganze Projekt ist unter der MPL lizenziert. Die GPL oder die LGPL dürfen aber ebenfalls verwendet werden.


Es wäre schön wenn jemand das angehängte Testprogramm (im Ordner "bin") testen könnte. Wenn ihr irgendwo noch einen uralt PC stehen habt, dann würde mich interessieren, ob es auch darauf läuft, besonders wenn die CPU-Auslastung auf 100% getrieben wird.

Update 1 - 21.03.09: Probleme bei der Wiedergabe unter Windows Vista behoben
Update 2 - 18.04.09: OpenAL und Linux Unterstützung hinzugefügt, neue Version von Acinerella
Update 3 - 26.04.09: Verbesserung der Demo, hinzufügen von "Analyzern" und Events in TAuPlayer
Update 4 - 23.08.09: Viele kleine Verbesserungen

Viel Spaß damit, ich bin auf eure Reaktionen gespannt,
Andreas
Miniaturansicht angehängter Grafiken
simple_demo2_171.png  
Angehängte Dateien
Dateityp: zip audorra_996.zip (2,12 MB, 188x aufgerufen)
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
 
Benutzerbild von mleyen
mleyen

 
FreePascal / Lazarus
 
#41
  Alt 19. Jun 2009, 23:19
Zitat von igel457:
Bekannte "Bugs":
- Memoryleaks in Acinerella (werden beim Beenden angezeigt)
Ich hab mich gerade mal ein bissl im Code umgeschaut.
Der MemLeak entsteht in der Unit "TAuDecoderThread".
Um genau zu sein:
In der Execute-Prozedur der TAuDecoderThread-Klasse.
Dort gibst du den neu allozierten Speicher nur bei einer Exception frei.

Hier die korrigierte Execute-Methode:
Delphi-Quellcode:
procedure TAuDecoderThread.Execute;
var
  pckt: TAuPacket;
  FMem: PByte;
  smpls, bfsize: Integer;
begin
  FMem := nil;
  FLastFrame := false;
  
  try
    while not Terminated do
    begin
      //Check whether the target buffer is filled
      if (FBuffer.Filled < FBufSize) then
      begin
        //Tell the decoder to go on decoding
        case FDecoder.Decode of
          audsHasFrame:
          begin
            //Get the packet from the decoder
            FDecoder.GetPacket(pckt);

            //Recode the buffer to float values
            smpls := pckt.BufferSize div Integer(AuBytesPerSample(FDecoder.Info));
            bfsize := Integer(AuBytesPerSample(FDecoder.Info.Parameters)) * smpls;
            ReallocMem(FMem, bfsize);

            AuPCMIntToFloat(FDecoder.Info, pckt.Buffer, FMem, smpls);

            //Write the packet content into the buffer
            FCritSect.Enter;
            try
              FBuffer.Write(FMem, bfsize, pckt.Timecode);
            finally
              FCritSect.Leave;
            end;
          end;
          //Terminate the thread if the decoder is at the end
          audsEnd:
            FLastFrame := true;
        end;
        if FLastFrame then
          Sleep(1);
      end else
        Sleep(1);
    end;
  finally // In einen finally-Block umgewandelt ;)
    if FMem <> nil then
      FreeMem(FMem);
  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

 
FreePascal / Lazarus
 
#42
  Alt 19. Jun 2009, 23:24
Tatsächlich - danke, das war der Fehler, ich vermutete die ganze Zeit, das sei ein Bug in Acinerella. Und ich hatte keine Lust meinen C-Code mit gdb durch zu debuggen.

Eine neue Version (1.0) wird es vermutlich während den Sommerferien geben.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

 
Delphi 2009 Professional
 
#43
  Alt 20. Jun 2009, 12:46
Also ich habe gerade Simple.exe unter Windows 7 RC x64 getestet.

Und wenn ich den Lautstärkeschieberegler bewege, verbreitert sich das entsprechende "Panel" oder was das da

Und irgendwann bekomme ich dann:
Zitat:
---------------------------
Simple
---------------------------
Ungültige Gleitkommaoperation.
---------------------------
OK
---------------------------
MfG
xZise
Fabian
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

 
FreePascal / Lazarus
 
#44
  Alt 20. Jun 2009, 17:06
Ja, das Problem habe ich unter Windows 7 auch - scheint ein Bug in der VCL zu sein.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

 
FreePascal / Lazarus
 
#45
  Alt 12. Jul 2009, 12:35
Hallo.

Als kleine Aktualisierung (ich habe trotz Sommerferien leider nicht allzuviel Zeit) eine kleine Übersicht über die neusten Entwicklungen:

Ich habe nun ein dynamisches Pluginsystem implementiert, welches ich in dieser Weise auch in Andorra einbinden werden. Dieses Pluginsystem erlaubt es, Module sowohl statisch (durch einfaches aufnehmen in die Uses-Klausel) als auch dynamish (aus einer DLL) zu linken - der Anwendung ist das egal.

Es existiert ein so genannter Registrationsserver (AcRegSrv, das Ac steht für "Andorra Commons"), der alle Module verwaltet:
Code:
AcRegSrv DbgDump
----------------

                          Name |                                           IdentStr | SrcID |    @Create
                               |                                                    |       |
                  TAcStoreNode |                         TAcPersistent.TAcStoreNode |     0 |    4217572
                TAcIntegerNode |          TAcPersistent.TAcStoreNode.TAcIntegerNode |     0 |    4217608
                  TAcFloatNode |            TAcPersistent.TAcStoreNode.TAcFloatNode |     0 |    4217644
                 TAcStringNode |           TAcPersistent.TAcStoreNode.TAcStringNode |     0 |    4217680
                   TAcBoolNode |             TAcPersistent.TAcStoreNode.TAcBoolNode |     0 |    4217716
                 TAcStreamNode |           TAcPersistent.TAcStoreNode.TAcStreamNode |     0 |    4217752
               TAuOpenALDriver |            TAcPersistent.TAuDriver.TAuOpenALDriver |     1 |   14695264
              TAuWaveOutDriver |           TAcPersistent.TAuDriver.TAuWaveOutDriver |     1 |   14696360
                 TAuWAVDecoder |             TAcPersistent.TAuDecoder.TAuWAVDecoder |     1 |   14699972
          TAuAcinerellaDecoder |      TAcPersistent.TAuDecoder.TAuAcinerellaDecoder |     1 |   14700932

Classes registered:    10
Current source id:     1
Von einem Modul werden Klassenname, Klassenhierarchie, Quellenidentifikationsnummer (also aus welchem Programmmodul (0 = lokal, >0 = aus einem anderen Plugin) das Plugin ist) und ein Pointer zum Konstruktor der Klasse gespeichert.

Eine DLL mit Zusatzmodulen ist sehr einfach zu erstellen. Die im oben gezeigten Beispiel gezeigte DLL sieht folgendermaßen aus:
Delphi-Quellcode:
library AudorraFoo;

uses
  AcPersistent,
  AuOpenAL, AuWaveOut32Driver, AuWav, AuAcinerella;

exports
  AcDLLInit,
  AcDLLFinalize,
  AcDLLExportClasses;

begin
end.
Möchte man die in der Uses-Klausel aufgeführten Module statisch verwenden, so sind sie einfach im Hauptprogramm einzubinden.

Ein Plugin kann ganz einfach geladen werden:
Delphi-Quellcode:
var
  plg: TAcPluginDLL;
begin
  plg := TAcPluginDLL.Create;
  plg.LoadPlugin('AudorraFoo.dll');
  plg.RegisterClasses(TAcPersistent);

  [...]

  plg.Free;
end;
Ich freue mich über eure Kommentare,
Andreas
Andreas
  Mit Zitat antworten Zitat
Ruio

 
Delphi 2005 Personal
 
#46
  Alt 12. Jul 2009, 14:41
Zitat von xZise:
Also ich habe gerade Simple.exe unter Windows 7 RC x64 getestet.

Und wenn ich den Lautstärkeschieberegler bewege, verbreitert sich das entsprechende "Panel" oder was das da

Und irgendwann bekomme ich dann:
Zitat:
---------------------------
Simple
---------------------------
Ungültige Gleitkommaoperation.
---------------------------
OK
---------------------------
MfG
xZise
Das passiert mir auch unter Windows Vista. Das Programm hört ja gar nicht auf den Fehler-Ton abzuspielen, obwohl ichs mitm Taskmanager abgeschossen hab.
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

 
FreePascal / Lazarus
 
#47
  Alt 12. Jul 2009, 14:46
Wie gesagt - ein Bug in der VCL. Ich habe in meiner aktuellen Version schon die Fehlermeldung entschärft - aber dafür, dass das Panel kleiner wird kann ich nichts.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

 
FreePascal / Lazarus
 
#48
  Alt 23. Aug 2009, 16:01
Ich habe mal eine neue Version hoch geladen.

Die wichtigesten Änderungen:[*] Verbesserte Visualisierungen
[+] FFT Analyse
[+] Support von HTTP-Streams (Achtung: Das Öffnen dieser kann seine Zeit (bis zu 30 Sekunden) dauern!), basiert auf einer modifizierten Version von Synapse (im lib Ordner)[*] Jede Menge Bugs behoben[*] Suchen in Acinerella-Strömen eingefügt
[+] Vollständige Unterstützung des Andorra Common Plugin Systems: Jedes Protokollformat/Dekoder kann einfach in eine DLL ausgelagert werden.[*] TAuStaticSoundList basiert nun auf dem Andorra Common Store.[*] Probleme mit WaveOut unter Windows 7 behoben

Bekannte Bugs:
- Lange Ladezeiten von HTTP-Streams (besonders bei MP3)
- Hohe CPU-Auslastung der Visualisierungen in der Delphi Simple Demo (liegt nur an den Zeichenoperationen, nicht direkt an Audorra)
- Nicht unter Linux lauffähig (mir fehlt eine GetCurrentThreadID o.ä Funktion)

Das Ganze ist jedoch immer noch nicht als "stabil" oder "fertig" zu bezeichnen, sondern immer noch im Alpha-Status!


Die aktualisierte Version gibt es im ersten Beitrag.

Viel Spaß, ich warte gespannt auf eure Kommentare,
Andreas
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

 
Delphi 2009 Professional
 
#49
  Alt 23. Aug 2009, 18:26
Hallo,
bei mir streikt Audorra bei einigen Liedern o.O Zur Zeit an urheberrechtlichen Kram getestet. Ich teste gleich mal bei OS Musik ^^ dann kann ich wenigstens genauere Aussagen machen!

Übrigens:
Zitat:
---------------------------
Unexpected Memory Leak
---------------------------
An unexpected memory leak has occurred. The unexpected small block leaks are:



13 - 20 bytes: TChangeLink x 20

21 - 28 bytes: String x 20

157 - 172 bytes: TMenuItem x 20


---------------------------
OK
---------------------------
Noch was anderes: Und zwar ändert sich beim Label die Schrift erst, sobald man den Schieberegler bewegt. Außerdem ist es total unhandlich die ProgressBar zu "bewegen" Besonders weil unter Vista (und 7) der Balken nicht sofort auf die Position kommt, sofern Pos > AltePos. Nimm doch stattdessen eine Trackbar. Außerdem bietest du bei Open zwar "File" und "URL" an, aber warum dann unten "Directory" verstecken?

Wenn du nichts dagegen hast, dann veröffentliche ich meine "modifizierte" Version Du kannst dir das ja angucken und Änderungen (nicht) übernehmen

MfG
xZise
Fabian
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

 
FreePascal / Lazarus
 
#50
  Alt 23. Aug 2009, 20:29
Hi,

der Memoryleak ist so gewollt . Die Anwendung soll sowieso nur eine kleine Demo sein - wenn du damit einen gescheiten Audiospieler bauen willst - nur zu!
Andreas
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz