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
 
Hinweis
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: [ 572 ]

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, 21. August 2011