Tipp 0431
|
Lautstärke, Balance, Frequenz & Cursorposition
|
 |
|
Autor/Einsender: Datum: |
|
Alexander Csadek 12.01.2005 |
|
Entwicklungsumgebung:
DirectX-Version: |
|
VB 6
DirectX 8 |
|
|
DirectSound bietet natürlich noch mehr als nur das Abspielen von Audiodateien (WAV).
|
Dieser Tipp beschäftigt sich mit den Eigenschaften einer WAV-Datei, Lautstärke, Balance, Frequenz
und Cursorposition, die über den DirectSoundSecondaryBuffer8 ausgelesen und gesetzt
werden können.
|
Um diese Eigenschaften auch wirklich auslesen und setzen zu können, muss beim Erstellen des
DirectSoundSecondaryBuffer8 in dessen Eigenschaften die entsprechenden Flags gesetzt werden.
Und es sollte natürlich auch bereits eine WAV-Datei geladen sein.
|
Natürlich können auch die Mastereinstellungen der Soundkarte eingelesen und verändert werden.
Hiefür braucht man einen DirectSoundPrimaryBuffer8. Wie das geht wird in einem anderen
Abschnitt erklärt.
|
|
|
Auslesen und Setzen der Lautstärke. Der Wert ist in hundertstel Dezibel (dB) und hat einen
gültigen Bereich von -10.000 bis 0, wobei 0 die größte Lautstärke ist. Gesetzt werden kann
daher eine Abschwächung von 0 - 100 dB. Der Sound wird immer mit der
Lautstärke 0 geladen. Lauter als die Mastereinstellung der Soundkarte geht es nicht.
|
Beim Anlegen des DirectSoundSecondaryBuffer8 muss der Flag
DSBCAPS_CTRLVOLUME in den Eigenschaften gesetzt werden, um anschließend
darauf zugreifen zu können.
|
|
|
Dim lngVolume As Long
'Einlesen der aktuellen Absenkung in hundertstel Dezibel
lngVolume = dsWavDatei.GetVolume
'Setzen der Absenkung ...
dsWavDatei.SetVolume lngVolume
|
|
|
|
Die Balance zwischen zwei Lautsprechern wird mit der Methode SetPan
verändert. Der Wert ist wieder in hundertstel Dezibel und hat einen gültigen Bereich von
-10.000 bis 10.000. Der Wert Null bedeutet das Verhältnis zwischen Links und Rechts ist 1:1.
Ein großer negativer Wert bewirkt das der Sound nur noch vom linken Lautsprecher gehört wird.
Umgekehrt ein großer positiver Wert bewirkt das der Sound nur noch vom rechten Lautsprecher
gehört wird.
|
Bei der Erstellung des DirectSoundSecondaryBuffer8 muss der Flag
DSBCAPS_CTRLPAN in den Eigenschaften gesetzt werden.
|
|
|
Dim lngPan As Long
'Einlesen der aktuellen Balance in hundertstel Dezibel
lngPan = dsWavDatei.GetPan
'Setzen der Balance
dsWavDatei.SetPan lngPan
|
|
|
GetFrequency und SetFrequency |
|
Auch die Abspielgeschwindigkeit und somit die Tonhöhe des Samples kann über den
DirectSoundSecondaryBuffer8 verändert werden. Die gültigen Werte liegen zwischen 100 und 100.000
(100 Hz bis 100 kHz). Typische Werte sind 22.050 und 44.100.
|
Beim Erstellen des DirectSoundSecondaryBuffer8 muss der Flag
DSBCAPS_CTRLFREQUENCY in den Eigenschaften gesetzt werden.
|
|
|
Dim lngFrequency As Long
'Einlesen der aktuellen Frequenz
lngFrequency = dsWavDatei.GetFrequency
'Setzen der Frequenz
dsWavDatei.SetFrequency lngFrequency
|
|
|
|
Wird ein Sample geladen, steht der Cursor auf 0. Während des Abspielens kann die aktuelle
Cursorposition mit GetCurrentPosition eingelesen werden.
Hierfür braucht man auch den Datentyp DSCURSOR, denn es wird nicht nur
die aktuelle Leseposition, sondern auch die aktuelle Aufnahmeposition eingelesen. Gesetzt wird die
Leseposition mit SetCurrentPosition. Bei beiden Methoden ist zu beachten,
dass der Wert in Bytes ist. Um den Wert auf Sekunden umrechnen zu können, werden Informationen
über das Waveformat benötigt.
|
Das Waveformat wird im Datentyp WAVEFORMATEX gespeichert, und wir brauchen
die Gesamtgröße der WAV-Datei in Bytes. Das WAV-Format wird mit der Funktion
GetFormat eingelesen. Dateigröße in Sekunden = Dateigröße in Bytes/Anzahl
Bytes pro Sekunde. Die Anzahl der Bytes pro Sekunde stehen in der WAV-Format-Eigenschaft
lAvgBytesPerSec.
|
|
|
Dim s As WAVEFORMATEX
Dim dsBDesc As DSBUFFERDESC
'Die SoundBuffer-Eigenschaften vom DSoundCreate
Dim WavLen As Single
'Einlesen des Wav-Formats der Wav-Datei
dsWavDatei.GetFormat s
'Größe der WavDatei in Sekunden
WavLen = (dsBDesc.lBufferBytes / s.lAvgBytesPerSec)
Dim dsc As DSCURSORS
Dim PosInSec As Single
'Aktuelle Cursorposition auslesen
dsWavDatei.GetCurrentPosition dsc
If dsc.lPlay > 0 Then
PosInSec = (dsc.lPlay / s.lAvgBytesPerSec)
End If
'Setzen der Cursorposition
Dim Pos As Long
Pos = CLng(PosInSec * s.lAvgBytesPerSec)
dsWavDatei.SetCurrentPosition Pos
|
|
|
|
Der Status vom Lesecursor wird mit der Methode GetStatus eingelesen.
Hierfür wird die Konstantenauflistung CONST_DSBSTATUSFLAGS benötigt.
Wird das Sample nur einmalig abgespielt, erhält man den Status DSBSTATUS_PLAYING.
Wird das Sample wiederholt abgespielt (looping), dann erhält man den Status
DSBSTATUS_PLAYING und den Status DSBSTATUS_LOOPING.
|
|
|
Dim dsstat As CONST_DSBSTATUSFLAGS
'Aktuellen Abspiel-Status einlesen
dsstat = dsWavDatei.GetStatus
If dsstat = DSBSTATUS_PLAYING Or _
dsstat = (DSBSTATUS_PLAYING + DSBSTATUS_LOOPING) Then
'mach dies...
Else
'mach das...
End If
|
|
|
|
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).
|
|