Sound laden und abspielen  

In den Grundlagen ist schon erklärt wie DirectSound aufgebaut ist und wie es im Grunde funktioniert. Nun soll aber endlich ein Sound geladen und abgespielt werden. Hierbei gibt es zwei Möglichkeiten wie ein Sound abgespielt werden kann. Ein einmaliger Durchlauf bis zum Ende des Sounds oder ein wiederholtes Abspielen (loop).

Doch zunächst braucht man ein paar Objekte und einen Datentyp.
 
Wichtig !
Um mit DirectSound arbeiten zu können braucht man ein gültiges DirectX-Objekt.
 

DirectSound

Dieses Objekt repräsentiert eigentlich die Soundkarte. Man braucht es um überhaupt einen Zugriff auf die Soundkarte zu bekommen. Mit der Funktion DirectSoundCreate vom DirectX-Objekt wird das DirectSound-Objekt generiert. Danach muss ähnlich wie bei DirectDraw der cooperative Level gesetzt werden, damit Windows weiß wie auf die Soundkarte zugegriffen werden soll.

Dim DX As New DirectX7
Dim DS As DirectSound

  'Initialisieren von DirectSound
Set
DS = DX.DirectSoundCreate("")
  'Cooperative Level setzen für unser Fenster
  'und normalen Modus verwenden
DS.SetCooperativeLevel Me.hWnd, DSSCL_NORMAL

Es gibt vier verschiedene cooperative Level.
 
Normal Cooperative Level
DDSCL_NORMAL ; In diesem Level ist es nicht möglich das Format des PrimarySoundBuffers zu ändern oder direkt mit Daten zu befüllen.
 
Priority Cooperative Level
DDSCL_PRIORITY ; Ihre Anwendung hat das erste Recht auf die SoundKarte. Das Format des PrimarySoundBuffers kann verändert werden.
 
Exclusive Cooperative Level

DDSCL_EXCLUSIVE ; Die Soundkarte gehört ihrer Anwendung exklusiv. Andere laufende Anwendungen haben keinen Zugriff auf die Soundkarte.
 
Write-primary Cooperative Level

DSSCL_WRITEPRIMARY ; Das ist der höchste cooperative Level. Ihre Anwendung hat direkten Zugriff auf den PrimarySoundBuffer. Direktes schreiben (WriteBuffer) und lesen (ReadBuffer) auf dem PrimarySurface ist möglich.

 

Datenformat

Bevor es weitergeht sei noch das Datenformat mit dem DirectSound arbeitet erwähnt. Es arbeitet mit Wellenform-Audiodaten die als Digital-Samples eines Sounds vorliegen. Das Format eines Samples wird mit dem Datentyp WAVEFORMATEX beschrieben.

Type WAVEFORMATEX
 lAvgBytesPerSec As Long
 lExtra As Long
 lSamplesPerSec As Long
 nBitsPerSample As Integer
 nBlockAlign As Integer
 nChannels As Integer
 nFormatTag As Integer
 nSize As Integer
End Type

nChannels

lSamplesPerSec

nBitsPerSample

nBlockAlign
 

lAvgBytesPerSec

nSize
 

die Anzahl der Kanäle (Normal 1 = Mono oder 2 = Stereo)

die Samplingrate in Hertz (Hz) zB. 22.050 oder 44.100

die Bitbreite des Samples 8 oder 16 Bit

Anzahl der Bytes, die für einen kompletten Sample benötigt werden (nBitsPerSample * nChannels / 8)

ist das Produkt aus nBlockAlign * lSamplesPerSec

die Größe der Felder die für spezielle Sampleinformationen benötigt werden
 

DirectSoundBuffer

Um einen Sound in den Speicher der Soundkarte laden zu können braucht man noch einen DirectSoundBuffer. Möchte man den PrimarySoundBuffer ansprechen und verändern, so muss auch für diesen ein DirectSoundBuffer angelegt werden. In unserem Beispiel ist dies nicht nötig da nur eine Wave-Datei geladen und abgespielt wird.

Aber auch bei einem secondary SoundBuffer muß beachtet werden das es zwei verschiedene gibt. Einen statischen (Static) und einen dynamischen (streaming). Der Streaming-Buffer wird verwendet wenn Audiodaten direkt in den SoundBuffer geschrieben oder von ihm gelesen werden sollen. Wird beim anlegen des SoundBuffers nichts angegeben, so geht DirectSound davon aus das ein Streaming-Buffer angelegt werden soll.

 'Variable für DirectSoundBuffer-Eigenschaften
Dim dsBDesc As DSBUFFERDESC

  'setzen der Eigenschaften
With dsBDesc
  .lFlags = DSBCAPS_STATIC
End With

Dim
s As WAVEFORMATEX
  'laden der Wav-Datei
Set dsWavDatei = DS.CreateSoundBufferFromFile(App.Path & _
    "\Sound.wav", dsBDesc, s)

Bleibt nur noch die Methode mit der das Abspielen des Sounds gestartet und beendet wird.

Mit der Methode Play vom DirectSoundBuffer-Objekt wird das Abspielen gestartet. Hierbei gibt es zwei verschiedene Möglichkeiten wie eingangs vom Tutorial erwähnt. Ein einmaliges Abspielen bis zum Ende des Sounds erfolgt mit dem Parameter DSBPLAY_DEFAULT. Und ein wiederholtes Abspielen (looping) erfolgt mit dem Parameter DSBPLAY_LOOPING.

Und angehalten wird der Sound mit der Methode Stop vom DirectSoundBuffer-Objekt.

 'einmaliges abspielen
dsWavDatei.Play DSBPLAY_DEFAULT
  'automatisch wiederholtes abspielen
dsWavDatei.Play DSBPLAY_LOOPING
  'abspielen der Wav-Datei beenden
dsWavDatei.Stop
Beim Beenden von DirectSound sollte genau wie bei DirectDraw beachtet werden, dass alle Objekte wieder freigegeben werden.

Ein Beispiel zum Laden und Abspielen einer Wav-Datei mit DirectSound können Sie hier downloaden, und den ausführlichen Tipp finden Sie in unserer Tipp-Rubrik.

  Download BitmapBlt.zip Download
tip0193.zip
 (41,3 kB)
Downloadzeit: <1 Min. - 28.8k / <1 Min. - ISDN Downloads bisher: [ 4180 ]

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

Seite empfehlen Bug-Report

Letzte Aktualisierung, Donnerstag, 24. Januar 2002