|
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
tip0193.zip
(41,3 kB) |
|
Downloads
bisher: [ 4180
] |
|