Einführung in DirectSound
von GiZmO
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.