WaveOutOpen
Die API-Funktion waveOutOpen meldet den Bedarf eines Gerätes zum abspielen von Audiodaten an. Beim Aufruf wird das Format definiert in dem die abzuspielenden Daten vorliegen (im Beispiel 44.1kHz, 16 Bit, mono). Seit Windows 2000(?) können mehrere Geräte gleichzeitig geöffnet werden, alle Ausgaben werden automatisch vom Betriebssystem gemischt.
Declare Function waveOutOpen lib "winmm.dll" _
Alias "waveOutOpen" ( _
ByRef lphWaveOut As Long, _
ByVal uDeviceID As Long, _
ByRef lpFormat As WAVEFORMAT, _
ByVal dwCallback As Long, _
ByVal dwInstance As Long, _
ByVal dwFlags As Long) As Long
Parameter
lphWaveOut
- Variable vom Datentyp Long welche das Device Handle erhält.
uDeviceID
- ID des Devices welches geöffnet werden soll. Siehe auch waveOutGetDevCaps.
lpFormat
- WAVEFORMAT oder WAVEFORMATEX Struktur welche das Format der Daten definiert die dem Device zum Abspielen übergeben werden sollen.
dwCallback
- Zeiger auf eine Callback Funktion. Vorsicht, bei Verwendung dürfen innerhalb dieser Funktion nur eingeschränkte Befehle verwendet werden!
dwInstance
- Beschreibung
dwFlags
- Beschreibung
Rückgabe(n)
Die Funktion gibt einen Wert des Types Long zurück. 0 bei Erfolg ansonsten Fehlercode.
[OPTIONAL] Beispiel
'Module1
Option Explicit
Private Declare Function waveOutOpen Lib "winmm.dll" (hWaveOut As Long, _
ByVal uDeviceID As Long, Format As Any, ByVal dwCallback As Long, _
ByVal dwInstance As Long, ByVal dwFlags As Long) As Long
Private Declare Function waveOutPrepareHeader Lib "winmm.dll" ( _
ByVal hWaveOut As Long, lpWaveInHdr As Any, ByVal uSize As Long) As Long
Private Declare Function waveOutUnprepareHeader Lib "winmm.dll" ( _
ByVal hWaveOut As Long, lpWaveInHdr As Any, ByVal uSize As Long) As Long
Private Declare Function waveOutClose Lib "winmm.dll" (ByVal hWaveOut As Long) As Long
Private Type WAVEFORMATEX
wFormatTag As Integer
nChannels As Integer
nSamplesPerSec As Long
nAvgBytesPerSec As Long
nBlockAlign As Integer
wBitsPerSample As Integer
cbSize As Integer
End Type
Private Type WAVEHDR
lpData As Long
dwBufferLength As Long
dwBytesRecorded As Long
dwUser As Long
dwFlags As Long
dwLoops As Long
lpNext As Long
Reserved As Long
End Type
Private Const WAVE_FORMAT_PCM As Long = 1
Private Const CALLBACK_FUNCTION As Long = &H30000
Private Const INVALID_HANDLE_VALUE As Long = -1
Private Const WOM_DONE As Long = &H3BD
Private hDevice As Long
Private udtBuffer1Hdr As WAVEHDR
Private btWaveOutBuffer1() As Byte
Private udtBuffer2Hdr As WAVEHDR
Private btWaveOutBuffer2() As Byte
Private lBufferFinished As Long
Public Function OpenOutputDevice(DevID As Long) As Boolean
Dim udtWaveFormat As WAVEFORMATEX
'Definition des abzuspielenden Formats:
With udtWaveFormat
.cbSize = 0
.wFormatTag = WAVE_FORMAT_PCM 'wave format
.nChannels = 1 'mono
.nSamplesPerSec = 44100 '44.1 kHz
.wBitsPerSample = 16 '16 Bits pro Sample
.nBlockAlign = .nChannels * .wBitsPerSample / 8
.nAvgBytesPerSec = .nSamplesPerSec * .nBlockAlign
End With
If waveOutOpen(hDevice, DevID, udtWaveFormat, AddressOf CallBack, 0, CALLBACK_FUNCTION) <> 0 Then
'Failed
hDevice = INVALID_HANDLE_VALUE
Else
'Device erfolgreich geöffnet, jetzt zwei buffer, jeweils 1/4 sekunde
'16 bit audio reservieren:
ReDim btWaveOutBuffer1(udtWaveFormat.nSamplesPerSec * udtWaveFormat.nBlockAlign * 0.25 - 1)
ReDim btWaveOutBuffer2(udtWaveFormat.nSamplesPerSec * udtWaveFormat.nBlockAlign * 0.25 - 1)
With udtBuffer1Hdr
.lpData = VarPtr(btWaveOutBuffer1(0))
.dwBufferLength = UBound(btWaveOutBuffer1) + 1
.dwUser = 1
End With
With udtBuffer2Hdr
.lpData = VarPtr(btWaveOutBuffer2(0))
.dwBufferLength = UBound(btWaveOutBuffer2) + 1
.dwUser = 2
End With
If waveOutPrepareHeader(hDevice, udtBuffer1Hdr, LenB(udtBuffer1Hdr)) Or _
waveOutPrepareHeader(hDevice, udtBuffer2Hdr, LenB(udtBuffer2Hdr)) > 0 Then
waveOutUnprepareHeader hDevice, udtBuffer1Hdr, LenB(udtBuffer1Hdr)
waveOutUnprepareHeader hDevice, udtBuffer2Hdr, LenB(udtBuffer2Hdr)
waveOutClose hDevice
hDevice = INVALID_HANDLE_VALUE
Else
OpenOutputDevice = True
End If
End If
End Function
Private Sub CallBack(ByVal hDev As Long, ByVal uMsg As Long, dwInstance As Long, _
dwParam1 As WAVEHDR, dwParam2 As Long)
If uMsg = WOM_DONE Then
lBufferFinished = lBufferFinished And (Not dwParam1.dwUser)
End If
End Sub
[PFLICHT] Quelle(n)
- MSDN US-Libary