Lautstärke,
Balance, Frequenz und Cursorposition |
Ein DirectSoundBuffer kann aber noch mehr als
nur laden und abspielen einer WAV-Datei (siehe Sound
laden und abspielen). Dieser Abschnitt beschäftigt sich mit den Eigenschaften
einer WAV-Datei die über den DirectSoundBuffer
ausgelesen und gesetzt werden können, und
deren wären Lautstärke, Balance,
Frequenz und Cursorposition.
|
Um diese
Eigenschaften auch wirklich auslesen und setzen zu
können muss beim Erstellen des DirectSoundBuffers
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 PrimarySoundBuffer. Wie das
geht wird in einem anderen Abschnitt erklärt.
GetVolume
und SetVolume
|
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 DirectSoundBuffers muss DSBCAPS_CTRLVOLUME
der Flag 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
|
|
|
GetPan
und SetPan
|
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 DirectSoundBuffers 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 DirectSoundBuffer
verändert werden. Die gültigen Werte liegen zwischen
100 und 100.000 (100Hz bis 100kHz). Typische Werte
sind 22.050 und 44.100.
|
Beim
Erstellen des DirectSoundBuffers 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
|
|
|
Der PlayCursor
|
Wird ein Sample geladen steht der Cursor auf 0. Während
des Abspielens kann die aktuelle Cursorposition mit
GetCurrentPosition eingelesen werden. Hiefü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
(siehe Sound
laden und abspielen), 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
|
|
|
Statusabfrage
|
Der
Status vom Lesecursor wird mit der Methode GetStatus
eingelesen. Hiefü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
|
|
|
Ein
Beispiel für Lautstärke, Balance, Frequenz
und Cursorposition des DirectSoundBuffers auslesen und setzen können
Sie hier downloaden, und
den ausführlichen Code finden Sie in unserer Tipp-Rubrik.
|
|
|
Download
tip0202.zip
(126 kB) |
|
Downloads
bisher: [ 78
] |
|