Tipp 0141 Lautstärke, Balance, Frequenz, Cursorposition
Autor/Einsender:
Datum:
  Alexander Csadek
16.10.2006
Entwicklungsumgebung: VB.Net 2003
DirectX-Version:   DirectX 9
DirectSound bietet natürlich noch mehr als nur das Abspielen von Audiodateien (WAV).
Dieser Tipp beschäftigt sich mit den Eigenschaften einer WAV-Datei die über den SecondaryBuffer 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 SecondaryBuffer in dessen Eigenschaften die entsprechenden Flags gesetzt werden. Und es sollte natürlich auch bereits eine WAV-Datei geladen sein.
Volume   (Public Property Volume As Integer)
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 SecondaryBuffer muss der Flag ControlVolume auf True gesetzt werden, um anschließend darauf zugreifen zu können.
 
Dim intVolume As Integer
'einlesen der aktuellen Absenkung in hundertstel Dezibel
intVolume = DSSecondaryBuffer.Volume
'setzen der Absenkung ...
DSSecondaryBuffer.Volume = intVolume
 
Pan   (Public Property Pan As Integer)
Die Balance zwischen zwei Lautsprechern wird mit der Eigenschaft Pan 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, dass der Sound nur noch vom linken Lautsprecher gehört wird, ein großer positiver Wert bewirkt das der Sound nur noch vom rechten Lautsprecher gehört wird.
Bei der Erstellung des SecondaryBuffer muss der Flag ControlPan auf True gesetzt werden.
 
Dim intPan As Integer
'einlesen der aktuellen Balance in hundertstel Dezibel
intPan = DSSecondaryBuffer.Pan
'setzen der Balance
DSSecondaryBuffer.Pan = intPan
 
Frequency   (Public Property Frequency As Integer)
Auch die Abspielgeschwindigkeit und somit die Tonhöhe des Samples kann über den SecondaryBuffer 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 SecondaryBuffer muss der Flag ControlFrequency auf True gesetzt werden.
 
Dim intFrequency As Integer
'einlesen der aktuellen Frequenz
intFrequency = DSSecondaryBuffer.Frequency
'setzen der Frequenz
DSSecondaryBuffer.Frequency = intFrequency
 
Der PlayCursor   (Public ReadOnly Property PlayPosition As Integer)
Wird ein Sample geladen steht der Cursor auf 0. Während des Abspielens kann die aktuelle Cursorposition entweder mit GetCurrentPosition oder PlayPosition eingelesen werden. GetCurrentPosition liefert die Position vom Abspielcursor und vom Aufnahmecursor. Es ist nützlich, beim Erzeugen vom SecondaryBuffer den Flag CanGetCurrentPosition auf True zu setzen, da dadurch die aktuelle Position schneller ausgelesen wird. 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 WaveFormat gespeichert, und wir brauchen die Gesamtgröße der WAV-Datei in Bytes. Das WAV-Format wird mit der Funktion Format vom SecondaryBuffer 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 AverageBytesPerSecond.
 
'einlesen des Wav-Formats der Wav-Datei
Dim myWaveFormat As WaveFormat
myWaveFormat = DSSecondaryBuffer.Format
'Größe der WavDatei in Sekunden
Dim WavLen As Integer
WavLen = (myDSoundBufferDesc.BufferBytes / _
      myWaveFormat.AverageBytesPerSecond)

'aktuelle Cursorposition auslesen (TrackBar1 ist ein Slider)
Dim Pos As Integer
Pos = DSSecondaryBuffer.PlayPosition()
If Pos > 0 Then
    TrackBar1.Value = Int((Pos / AvgBytesPerSec) * 1000)
End If
'Cursorposition setzen
'(HS_Cursor ist ein horizontaler Scrollbalken)
Dim Pos As Integer
If HS_Cursor.Value > 0 Then
    Pos = CInt((HS_Cursor.Value / 1000) * AvgBytesPerSec)
End If
DSSecondaryBuffer.SetCurrentPosition(Pos)
 
Statusabfrage   (Public ReadOnly Property Status As BufferStatus)
Der Status vom Lesecursor wird über die Eigenschaft Status eingelesen, ist vom Typ BufferStatus und über diesen kann festgestellt werden, ob der SecondaryBuffer abgespielt und/oder wiederholt abgespielt wird.
 
If (DSSecondaryBuffer.Status.Playing) Then
	'mach dies
Else
	'mach das
End If
 
Hinweis
Um diesen Tipp ausführen zu können, wird die DirectX 9 for Managed Code Runtime benötigt.
Dieses Beispiel funktioniert mit allen DirectX 9.0 SDK Versionen. Erstellt wurde es mit der folgenden Version:
Update DirectX 9.0 SDK (October 2005)
Pfad: C:\WINDOWS\Microsoft.NET\DirectX for Managed Code\1.0.2902.0\Microsoft.DirectX.dll
Laufzeitversion: v1.1.4322
Assemblyversion: 1.0.2902.0
Pfad: C:\WINDOWS\Microsoft.NET\DirectX for Managed Code\1.0.2902.0\Microsoft.DirectX.Direct3D.dll
Laufzeitversion: v1.1.4322
Assemblyversion: 1.0.2902.0

Windows-Version
98/SE
ME
NT
2000
XP
Vista
Win 7


Download  (123 kB) Downloads bisher: [ 372 ]

Vorheriger Tipp Zum Seitenanfang Nächster Tipp

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

Seite empfehlen Bug-Report
Letzte Aktualisierung: Sonntag, 22. Januar 2012