WaveOutOpen

Aus API-Wiki
Zur Navigation springenZur Suche springen
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, bei Erfolg erhält man ein Handle auf ein Device (Gerät) zurück. In weiterer Folge werden die abzuspielenden Daten dem Gerät mittels Buffern, typischerweise Bytearrays, übergeben. Siehe hierzu waveOutPrepareHeader.
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