WaveOutOpen

Aus API-Wiki
Version vom 7. Oktober 2016, 21:25 Uhr von Jochen Wierum (Diskussion | Beiträge)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springenZur Suche springen
Die API-Funktion waveOutOpen meldet den Bedarf eines Gerätes zum Abspielen von Audiodaten an.
Beim Aufruf wird die Soundkarte auf der die Ausgabe erfolgen soll angegeben und das Format definiert in dem die abzuspielenden Daten vorliegen. Bei Erfolg erhält man ein Handle auf ein Device (Gerät). In weiterer Folge werden die abzuspielenden Daten dem Gerät mittels Buffer, typischerweise Bytearrays, übergeben. Siehe hierzu waveOutPrepareHeader. Um eine saubere Wiedergabe der Daten ohne Unterbrechungen und Knackser zu erziehlen müssen mindestens zwei Buffer verwendet werden.
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 Any, _
                 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 einer Callback Funktion dürfen innerhalb dieser Funktion nur eingeschränkte Befehle verwendet werden!

dwInstance

Ein beliebiger 32 Bit Wert, welcher der Calback Funktion vom Device übergeben wird.

dwFlags

Flags


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

Verweise

[PFLICHT] Quelle(n)

  • MSDN US-Libary