Tipp 0435
|
DirectSound - Effekte
|
|
|
Autor/Einsender: Datum: |
|
Alexander Csadek 01.02.2005 |
|
Entwicklungsumgebung:
DirectX-Version: |
|
VB 6
DirectX 8 |
|
|
In DirectX 8 stehen durch
DirectAudio standardmäßig ein paar interessante Effekte als
DirectX Media Object's (DMO) zur Verfügung. Mehr Informationen über DMO's findet
ihr in der Direct Show-Dokumentation des DirectX
8 SDK (Software
Development Kit).
Jede DirectX 8-Anwendung kann auf diese Standardeffekte zugreifen.
|
Folgende Effekte stehen zur Auswahl:
|
- Chorus
- Compression
- Distortion
- Echo
- Environmental Reverberation
- Flange
- Gargle
- Parametric Equalizer
- Waves Reverberation
|
Dieser Tipp beschäftigt sich nur mit dem Einsatz der Effekte mittels DirectSound. Eine Beschreibung,
wie ihr zu den Parametern der einzelnen Effekte kommt, findet ihr im Tipp
DirectSound - Effekte (erweitert)
|
Jeder Effekt, außer Waves Reverberation, verarbeitet 8- oder 16-bit PCM Wave Format mit einem
oder zwei Kanälen und jeder Sample Rate. Waves Reverberation kann keine 8-bit Wave's verarbeiten.
|
Die Effekte arbeiten nicht ganz sauber bei sehr kleinen SoundBuffern und bei weniger als 150 Millisekunden
kann kein Effekt auf dem SoundBuffer erzeugt werden.
|
In einer DirectSound-Anwendung wird immer direkt mit dem SoundBuffer gearbeitet. Das bedeutet, wir
können nicht auf den Effekt zugreifen solange er nicht auf einen SoundBuffer gesetzt wurde.
|
Um einen SoundBuffer zu erzeugen, der einen Effekt akzeptiert, muss beim Erstellen des
DirectSoundSecondaryBuffer8 der Flag DSBCAPS_CTRLFX gesetzt werden.
Mit dem Flag DSBCAPS_LOCDEFER teilen wir DirectSound mit, dass es den
SoundBuffer nicht sofort der Hardware (Soundkarte) oder Software (Speicher) zuordnen soll, sondern
erst beim Abspielen.
|
|
|
Dim dsWavDatei As DirectSoundSecondaryBuffer8
Dim dsBDesc As DSBUFFERDESC
With dsBDesc
.lFlags = DSBCAPS_CTRLFX Or DSBCAPS_LOCDEFER Or DSBCAPS_GLOBALFOCUS
End With
Set dsWavDatei = DS.CreateSoundBufferFromFile( _
App.Path & "\vbfun.wav", dsBDesc)
|
|
|
Der Effekt selbst wird über die Methode SetFX vom DirectSoundSecondaryBuffer8 gesetzt
und erwartet folgende Parameter:
|
|
EffectsCount
|
Die Anzahl der Effekte im Array Buffers und lResultIDs.
Der Wert 0 entfernt alle Effekte vom SoundBuffer.
|
Buffers()
|
Ein Array vom Typ DSEFFECTDESC in der Größe
der Anzahl der Effekte.
|
lResultIDs()
|
Ein Array vom Typ Long mit dem Retourwert eines jeden Effektes.
|
Ein einfaches Beispiel für einen Chorus-Effekt.
|
|
|
Dim myEffekt(0) As DSEFFECTDESC
Dim lngResultID(0) As Long
myEffekt(0).guidDSFXClass = DSFX_STANDARD_CHORUS
dsWavDatei.SetFX 1, myEffekt, lngResultID
If lngResultID(0) = DSFXR_FAILED Then Exit Sub
|
|
|
Das sieht verwirrend aus, ist es aber nicht. Der Datentyp DSEFFECTDESC
besitzt zwei Eigenschaften; guidDSFXClass und lFlags.
Bei der Eigenschaft guidDSFXClass können folgende Konstanten verwendet
werden, die den Standardeffekten entsprechen:
|
DSFX_STANDARD_CHORUS
DSFX_STANDARD_COMPRESSOR
DSFX_STANDARD_DISTORTION
DSFX_STANDARD_ECHO
DSFX_STANDARD_FLANGER
DSFX_STANDARD_GARGLE
DSFX_STANDARD_I3DL2REVERB
DSFX_STANDARD_PARAMEQ
DSFX_STANDARD_WAVES_REVERB
|
Mit der Eigenschaft lFlags kann die Platzierung des SoundBuffers
gesetzt werden. Folgende Werte sind möglich:
|
DSFX_LOCHARDWARE
DSFX_LOCSOFTWARE
|
|
Bei 0 versucht DirectSound den Buffer zuerst in der Soundkarte anzulegen und wenn das nicht geht,
dann im Speicher. Geht beides nicht, wird ein Fehler ausgegeben.
|
Die Methode SetFX liefert für jeden Effekt, der gesetzt werden soll, einen Retourwert. Dieser
Wert entspricht den folgenden Konstanten:
|
|
DSFXR_LOCHARDWARE |
Der Effekt arbeitet in der Soundkarte. |
DSFXR_LOCSOFTWARE |
Der Effekt arbeitet im Speicher. |
DSFXR_UNALLOCATED |
Der Effekt wurde noch nicht platziert. |
DSFXR_FAILED |
Der Effekt wurde nicht erstellt weil die Ressource nicht zur Verfügung steht. |
DSFXR_PRESENT |
Der Effekt ist verfügbar, aber aus einem anderem Grund nicht erstellt. |
DSFXR_UNKNOWN |
Der Effekt wurde nicht erstellt, da er dem System nicht bekannt ist. |
Ein Effekt kann mehrmals gesetzt werden. |
Eigentlich müssten wir jetzt den Sound abspielen, um zu wissen wo DirectSound den Effekt
platziert hat. Damit wir aber schon vor dem Abspielen schauen können, gibt es die Methode
AcquireResources vom Objekt DirectSoundSecondaryBuffer8.
|
|
|
dsWavDatei.AcquireResources 0, lngResultID
|
|
|
lngResultID entspricht dem Array vom setzen der Effekte mittels SetFX.
In dem Array erhalten wir pro Effekt einen Wert mit folgender Bedeutung:
|
|
DSFXR_LOCHARDWARE |
Der Effekt arbeitet in der Soundkarte. |
DSFXR_LOCSOFTWARE |
Der Effekt arbeitet im Speicher. |
DSFXR_FAILED |
Der Effekt wurde nicht erstellt weil die Ressource nicht zur Verfügung steht. |
DSFXR_PRESENT |
Der Effekt ist verfügbar, aber aus einem anderem Grund nicht erstellt. |
DSFXR_UNKNOWN |
Der Effekt wurde nicht erstellt, da er dem System nicht bekannt ist. |
|
|
Um dieses Beispiel ausführen zu können, wird die DirectX 8 for Visual Basic Type Library
benötigt (siehe dazu die Erläuterungen in der DirectX-Rubrik).
|
|