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.
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 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
 
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 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
 
Der PlayCursor
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
 
Statusabfrage
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
 
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  (117 kB) Downloads bisher: [ 815 ]

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: Sonntag, 13. Februar 2011