WaveOutOpen

Aus API-Wiki
Zur Navigation springenZur Suche springen

Die API-Funktion waveOutOpen gibt Auskunft über XYZ.

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

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

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 Sub OpenOutputDevice(DevID As Long, Samplerate As Long)

   Dim udtWaveFormat As WAVEFORMATEX
   
   With udtWaveFormat
       .cbSize = 0
       .wFormatTag = WAVE_FORMAT_PCM
       .nChannels = 1
       .nSamplesPerSec = Samplerate
       .wBitsPerSample = 16
       .nBlockAlign = .wBitsPerSample / 8
       .nAvgBytesPerSec = Samplerate * .nBlockAlign
   End With
   
   If waveOutOpen(hDevice, DevID, udtWaveFormat, AddressOf CallBack, 0, CALLBACK_FUNCTION) <> 0 Then
       'Failed
       hDevice = INVALID_HANDLE_VALUE
   Else
       'Success
       ReDim btWaveOutBuffer1(Samplerate * 2 * 0.25 - 1) 'zwei buffer, jeweils 1/4 sekunde 16 bit audio
       ReDim btWaveOutBuffer2(Samplerate * 2 * 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
       End If
   End If

End Sub

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