Die Community zu .NET und Classic VB.
Menü

Einführung in DirectSound

 von 

Einführung in DirectSound  

In diesem Tutorial werden Sie die Grundlagen der DirectSound-Programmierung kennen lernen. DirectSound ist eines der einfachsten Dinge, die mit DirectX zu tun haben.

So jetzt starten Sie als erstes VB und binden unter Projekt -> Verweise "DirectX 7 for Visual Basic Type Library" in Ihr Projekt ein [Dies wird in Einführung in DirectX genauer erläutert]. Ohne diesen Verweis ist es nicht möglich DirectX mit Visual Basic zu programmieren.

Wenn Sie schon mit DirectDraw vertraut sind, wissen Sie, dass es in DirectDraw "Surfaces" gibt, die Grafikinformationen speichern. In DirectSound heißen diese Speicherplätze jedoch "Buffer". In den Buffern werden alle Sound-Informationen gespeichert, sodass Sie den Sound jederzeit verändern, abspielen oder andere Dinge mit ihm machen können.

Jetzt soll es mit der richtigen Programmierung losgehen, jedoch vorweg noch eine Info: Beschreibungen, zu dem was im Code passiert, sind immer im Code vorhanden! So jetzt kopieren Sie folgenden Code in ihr Projekt:

Option Explicit

  'Das DirectX-Objekt (wird immer benötigt!)
  Dim DX As DirectX7
 
  'Das DirectSound-Objekt ist natürlich für den Sound
  'zuständig. Es baut auf das DirectX-Objekt auf.
  Dim DS As DirectSound
 
  'Diese Objekt ist ein Buffer, in dem alle
  'Sound-Daten gespeichert werden. Sie können beliebig viele
  'Buffer erstellen.
  Dim DSBuffer As DirectSoundBuffer
 
  'Diese beiden Objekte speichern die Sound-Einstellungen.
  Dim dsbdBuffer As DSBUFFERDESC
  Dim dswfBuffer As WAVEFORMATEX

DX ist unser DirectX-Objekt, das wir immer benötigen. DS ist unser DirectSound-Objekt, das für die Steuerung des Sounds zuständig ist. DSBuffer ist ein wie oben beschriebener Buffer, in dem die Sound-Datei gespeichert wird. In dsbdBuffer und dswfBuffer werden alle Einstellungen für den Sound festgelegt, wie z.B. die Mono- oder Stereo-Wiedergabe.

Jetzt benötigen Sie eine Form und vier Command-Buttons. Fangen wir mit der Form an, kopieren Sie folgenden Code ins Form_Load-Ereignis.

Private Sub Form_Load()
  'Command2,Command3 und Command4 werden erst "Enabled",
  'wenn DirectSound initialisiert wurde. Wenn man den Sound
  'ohne Initialisieren von DirectSound abspielen würde,
  'würde es natürlich nicht funktionieren.
 
  Command1.Caption = "DirectSound initialisieren"
  Command2.Caption = "Sound abspielen"
  Command2.Enabled = False
 
  Command3.Caption = "Pause"
  Command3.Enabled = False
 
  Command4.Caption = "Stoppen"
  Command4.Enabled = False
End Sub

Dann machen wir mit Command1_Click weiter, dem Initialisieren von DirectSound:

Private Sub Command1_Click()
  'DirectX wird initialisiert
  Set DX = New DirectX7
 
  'DirectSound wird initialisiert
  Set DS = DX.DirectSoundCreate("")
 
  'Hier wird festgelegt, was man mit DirectSound vor hat.
  'DDSCL_NORMAL beschreibt, dass andere Programm außer dem
  'eigenen auch auf die Soundkarte zugreifen können.
  'DDSCL_EXCLUSIVE würde beschreiben, dass nur das eigene
  'Programm auf die Soundkate zugreifen kann.
  DS.SetCooperativeLevel Form1.hWnd, DSSCL_NORMAL
 
  'Hier werden die Sound-Einstellungen festgelegt. Diese
  'Einstellunge sind wichtig, da sie über die Qualität
  'des Sounds entscheiden.
  '8bit + 1 Kanal = Schlechte Qualität, jedoch schnellere
  'Geschwindigkeit und weniger Speichernutzung
  '16bit + 2 Kanäle = Gute Qualität, jedoch langsamere
  'Geschwindigkeit und mehr Speichernutzung
  dsbdBuffer.lFlags = DSBCAPS_CTRLFREQUENCY Or _
                        DSBCAPS_CTRLPAN Or _
                        DSBCAPS_CTRLVOLUME Or _
                        DSBCAPS_STATIC
 
 
 
  'Sound ist immer PCM
  dswfBuffer.nFormatTag = WAVE_FORMAT_PCM
  dswfBuffer.nChannels = 2 '1 = Mono; 2 = Stereo
  dswfBuffer.lSamplesPerSec = 22050 'Frequenz
  dswfBuffer.nBitsPerSample = 16 '16 = 16bit; 8 = 8bit
 
  'Folgendes ist auch immer gleich:
  dswfBuffer.nBlockAlign = dswfBuffer.nBitsPerSample / 8 _
                           * dswfBuffer.nChannels
 
  dswfBuffer.lAvgBytesPerSec = dswfBuffer.lSamplesPerSec _
                               * dswfBuffer.nBlockAlign
 
  'Jetzt wird ein Sound-Buffer erstellt, der auf die grade
  'festgelegten Informationen aufbaut.
  Set DSBuffer = DS.CreateSoundBufferFromFile(App.Path & _
                                              "\sound.Wav", _
                                              dsbdBuffer, _
                                              dswfBuffer)
 
  'Command2, Command3 und Command4 können "Enabled" werden,
  'da DirectSound jetzt initialisiert ist und Sound abge-
  'spielt werden kann.
  Command2.Enabled = True
  Command3.Enabled = True
  Command4.Enabled = True
End Sub

Jetzt geht es mit Command2_Click weiter, dem Abspielen des Sounds:

Private Sub Command2_Click()
  'Sound abspielen. DSBPLAY_DEFAULT legt fest, dass der
  'Sound ein einziges Mal abgespielt wird. Sie können
  'den Sound auch endlos lang abspielen lassen, indem sie
  'statt DSBPLAY_DEFAULT DSBPLAY_LOOPING verwenden.
  DSBuffer.Play DSBPLAY_DEFAULT
End Sub

Danach Command3_Click, hier geht es um das Pausieren des Sounds:

Private Sub Command3_Click()
  'Sound stoppen (jedoch nur für Pause, beim
  'richtigen Stoppen wird die derzeitige Posstion des
  'Sounds auf 0 gesetzt.)
  DSBuffer.Stop
End Sub

Als letztes dann noch das Form_Unload-Ereignis, um die DirectX-Objekte aus dem Speicher zu löschen:

Private Sub Form_Unload(Cancel As Integer)
  'Sound stoppen (falls er noch abgespielt wird)
  Call Command4_Click
 
  'Objekte aus dem Speicher löschen
  Set DSBuffer = Nothing
  Set DS = Nothing
  Set DX = Nothing
End Sub

So, jetzt sind Sie fertig!

Ihre Meinung  

Falls Sie Fragen zu diesem Tutorial haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.