Hallo
Mit dieser Thematik habe ich mich ca. 2 Monate beschäftigt. Ziel war bei mir einen Audioplayer zu programmieren, der an bestimmten Liedpositionen bestimmte Ereignisse ausführt.
Das Ganze habe ich mit der Bass.dll realisiert. Diese spielt die Audiodatei ab, erzeugt die Wellenformanzeige und liefert die genaue aktuelle Abspielposition.
Da meine Software OpenSource ist, kann der Code (Delphi 7) ohne Probleme eingesehen werden:
Sourcecode
Die relevante Funktion zum Scannen der Wavedatei ist
ScanPeaks2 in der Datei pcdimmer.pas. Dabei liefert die Bass.dll FFT-Daten, die in ein kleines Array gespeichert werden. Dieses Array wird zur Zeichnung der Waveform in einer normalen PaintBox verwendet. Das Zeichnen wird über die Funktion
DrawSpectrum ausgeführt.
Das Abspeichern der aktuellen Position ist relativ einfach. Man fragt beim Speichern mit der Bass.dll-Funktion BASS_ChannelGetPosition die aktuelle Position ab und speichert sie. Möchte man beim Abspielen nun wissen, ob dieser Punkt durchlaufen wurde, fragt man zyklisch über einen Timer oder in einem Thread ab, ob die Position +/- eines angemessenen "Safe-Frames" gerade durchlaufen wird. Es empfiehlt sich, ein Array zusätzlich einzubinden, welches speichert, ob das Ereignis schon einmal abgespielt wurde, um Mehrfachausführungen zu vermeiden.
Der Sourcecode ist nicht sonderlich schön strukturiert, aber ich hoffe du kannst dir die relevanten Informationen da herauslesen. Wenn du Teile des Codes in deiner Software verwenden möchtest und diese auch veröffentlichst bitte ich dich,
diese Codezeilen ebenfalls öffentlich zugänglich zu machen und einen kurzen Hinweis auf die Herkunft hinzuzufügen.
Viel Erfolg,
Christian