In einem Beispiel vom FMOD.org wird der aktuelle Sound
statt Spectrum mit einer Wellenform (Sinus oder sowas) angezeigt.
Geht das problemlos oder muss man dazu mehr programmieren?
FSOUND_DSP_GetSpectrum() ... als Wellenform anzeigen
- Froggerprogger
- Badmin
- Beiträge: 855
- Registriert: 08.09.2004 20:02
Hi! Dafür musst Du einen eigenen DSP-Effekt in die DSP-Queue setzen. Schau mal nach diesen Begriffen im Forum, da müssten ein paar gute Infos zu finden sein.
Dieser "DSP-Effekt" ist für dich quasi eine Procedure, die von fmod immer wiederkehrend aufgerufen wird und die einen pointer auf den Buffer übergeben bekommt, der als nächstes gespielt wird. Die Sounddaten darin (16 Bit Stereo, RAW-format, normalerweise 44100 Hz und 1024 Samples Bufferlänge) kannst Du dann einfach als Linie malen ausgeben. (plus/minus um die Nullinie)
Dieser "DSP-Effekt" ist für dich quasi eine Procedure, die von fmod immer wiederkehrend aufgerufen wird und die einen pointer auf den Buffer übergeben bekommt, der als nächstes gespielt wird. Die Sounddaten darin (16 Bit Stereo, RAW-format, normalerweise 44100 Hz und 1024 Samples Bufferlänge) kannst Du dann einfach als Linie malen ausgeben. (plus/minus um die Nullinie)
!UD2
- Froggerprogger
- Badmin
- Beiträge: 855
- Registriert: 08.09.2004 20:02
Hab hierwas gefunden:
Um mit fmod anzufangen sollte man sich kurz durch die (wenn auch englischsprachigen) Tutorial-Kapitel der fmod.chm-Hilfe durcharbeiten (sind nicht viele Seiten).
Darin werden die Basics erklärt, also der Unterschied zwischen Samples, Streams und Music, was die DSP-chain ist, DirectX-FX, etc.pp. Für Dich wären jetzt auf jeden Fall die Kapitel Samples/Streams und DSP-chain interessant.
Hier aber nochmal eine Kurzvorstellung der DSP-chain:
Eine neue Ebene tut sich über die Funktionen einer 'normalen' Audioengine (wie auf zig Channels verschiedenste Files abzuspielen) mit der DSP-chain auf. Die DSP-chain ist eine logische Kette für den Audiosignalfluß mit 1000 addressierbaren Positionen. Diese Kette wird von jedem AudioBuffer komplett durchlaufen, bevor er an die Soundkarte geschickt wird.
Einige Positionen sind dabei fest belegt:
Z.B. in der Clear-Unit (Pos. 0) werden alle vorherigen Daten des Buffers gelöscht.
In der MixSFX-Unit (Pos. 100) wird der aktuelle Output des Fmod-Mixers eingespeist.
In der FFT-Unit (Pos. 900) wird auf den dort anliegenden Buffer eine FFT angewandt und die Ergebnisse in ein Array geschrieben, das Audiomaterial wird dabei nicht verändert.
In der Clip&Copy-Unit (Pos. 1000) wird der endgültige Buffer ggf. noch vom ggf. internen 32-Bit-FPU in 32-Bit-Int gewandelt und dann an die Soundkarte geschickt.
So, der CLOU an der Sache ist:
1) Jede der voreingestellten Units läßt sich an- und ausschalten (die FFT-unit ist z.B. standardmäßig ausgeschaltet) oder sogar mit eigenen DSP-Units ersetzen
2) An jedem Punkt der Kette lassen sich eigene DSP-Units einsetzen!
Eigene DSP-Units sind kleine Callback-Routinen, die für jeden Buffer, der die DSP-Chain durchläuft einmal automatisch von fmod aufgerufen wird. Dabei wird an sie u.a. ein Pointer auf den aktuellen (von der vorherigen DSP-Chain-Position überlieferten) Buffer übergeben. Auf diesen Speicherbereich kann sie nun beliebiges anstellen (z.B. einfach schlicht alle Werte gleich Null setzen, oder mit Random-Werten füllen) und übergibt als Rückgabewert einen Pointer auf das veränderte Bufferdaten-Array (meistens dasselbe, wie zuvor, bloß halt mit veränderten Daten)
So hangelt sich der Buffer Position um Position durch die Kette und wird am Ende an die Soundkarte übergeben.
!UD2
