|
Tipp 0315
|
DirectSound - Read- und WriteBuffer
|
|
|
Autor/Einsender: Datum: |
|
Alexander Csadek 01.03.2003 |
|
Entwicklungsumgebung:
DirectX-Version: |
|
VB 6
DirectX 7 |
|
|
Für die Erstellung von Sound-Programmen können die DirectSound-Funktionen Read- und WriteBuffer interessant
sein.
|
Zu Beginn des Tipps werden zunächst 10 verschiedene Sounds geladen, die auch durch Anklicken der Buttons einzeln abgespielt werden. Die Ziffern der Buttons entsprechen den 10 verschiedenen Sounds. Um die durch das Anklicken entstandene Ziffernfolge nacheinander abspielen zu können, muss man keine Routine schreiben, die prüft, ob nun einer der Sounds aus der Ziffernfolge schon abgespielt wurde oder nicht und darauf wartet bis der nächste abgespielt werden kann. Natürlich könnte man auch gleich direkt die entsprechenden Sounds abspielen lassen, aber das hätte zur Folge das alle Sounds gleichzeitig abgespielt werden - sie sollen aber nacheinander abgespielt werden.
|
Es geht also auch anders. Man liest die Audio-Daten der entsprechenden Sounds aus und schreibt sie nacheinander in einen anderen
SoundBuffer. Hierfür wird ein neuer DirectSoundBuffer erstellt und ein ByteArray angelegt, mit der Größe aller abzuspielender Sounds. Danach werden die Audio-Daten mit der Funktion
ReadBuffer ausgelesen und nacheinander in das ByteArray geschrieben. Wichtig ist das nacheinander, denn sonst würde der
neue Sound den vorhergehenden überschreiben.
|
Sind alle Sounds ausgelesen, wird das ByteArray in den neuerstellten SoundBuffer geschrieben. Dies geschieht mit der DirectSound-Funktion
WriteBuffer, anschließend wird der SoundBuffer abgespielt.
|
Zu guter Letzt kann die Ziffernfolge auch als WAV-Datei abgespeichert werden. DirectSound bietet hierfür die Funktion
SaveToFile an.
|
Im Gegensatz zu DirectDraw braucht man bei DirectSound die Objekte nicht zu sperren bevor man direkt auf die Daten zugreifen
kann, auch das Entsperren entfällt bei DirectSound.
|
Im folgenden Code-Ausschnitt wird nur die Routine für das Abspielen der Ziffernfolge dargestellt.
|
|
|
Private Sub cmd_Play_Click()
Dim dsBDesc As DSBUFFERDESC
Dim wfx As WAVEFORMATEX
Dim GesamtByteBlock() As Byte
Dim myDSBCAPS As DSBCAPS
Dim lngGesamtBytes As Long
Dim lngLastAdress As Long
Dim i As Integer
If Len(Trim(txt_Zahl.Text)) > 0 Then
If Not IsNumeric(txt_Zahl.Text) Then Exit Sub
For i = 1 To Len(txt_Zahl.Text)
dsSounds(CInt(Mid(txt_Zahl.Text, i, 1))).GetCaps myDSBCAPS
lngGesamtBytes = lngGesamtBytes + myDSBCAPS.lBufferBytes
Next
dsBDesc.lBufferBytes = lngGesamtBytes
dsBDesc.lFlags = myDSBCAPS.lFlags
dsSounds(0).GetFormat wfx
Set dsAll = Nothing
Set dsAll = DS7.CreateSoundBuffer(dsBDesc, wfx)
ReDim GesamtByteBlock(lngGesamtBytes)
For i = 1 To Len(txt_Zahl.Text)
dsSounds(CInt(Mid(txt_Zahl.Text, i, 1))).GetCaps myDSBCAPS
dsSounds(CInt(Mid(txt_Zahl.Text, i, 1))).ReadBuffer 0, _
myDSBCAPS.lBufferBytes, GesamtByteBlock(lngLastAdress), _
DSBLOCK_DEFAULT
lngLastAdress = lngLastAdress + myDSBCAPS.lBufferBytes
Next
dsAll.WriteBuffer 0, lngGesamtBytes, GesamtByteBlock(0), _
DSBLOCK_DEFAULT
If chk_Save.Value = 1 Then
dsAll.SaveToFile App.Path & "\DTMFTon.wav"
End If
dsAll.Play DSBPLAY_DEFAULT
End If
End Sub
|
|
|
|
Um dieses Beispiel ausführen zu können, wird die DirectX 7
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 (43,5
kB)
|
Downloads bisher: [ 639 ]
|
|
|