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.
Hinweis
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).

Windows-Version
95
98/SE
ME
NT
2000
XP
Vista
Win 7
VB-Version
VBA 5
VBA 6
VB 4/16
VB 4/32
VB 5
VB 6


Download  (128 kB) Downloads bisher: [ 542 ]

Vorheriger Tipp Zum Seitenanfang Nächster Tipp

Startseite | Projekte | Tutorials | API-Referenz | VB-/VBA-Tipps | Komponenten | Bücherecke | VB/VBA-Forum | VB.Net-Forum | DirectX-Forum | Foren-Archiv | DirectX | VB.Net-Tipps | Chat | Spielplatz | Links | Suchen | Stichwortverzeichnis | Feedback | Impressum

Seite empfehlen Bug-Report
Letzte Aktualisierung: Dienstag, 17. Mai 2011