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 BitmapBlt.zip Download
tip0202.zip
(126 kB)
Downloads bisher: [ 78 ]

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

Seite empfehlen Bug-Report

Letzte Aktualisierung, Sonntag, 20. November 2002