Mikrofoninput erkennen und verarbeiten .. nur wie?

Ich bin ein wenig aus der Übung mit VBasic und brauche jetzt ein kleines Program, mit dem ich noch Schwierigkeiten habe.

Es geht darum, nacheinander mehrere Wörter auf dem Bildschirm zu präsentieren (soweit kein Problem). Danach soll der Benutzer eines der Wörter in ein Mikrofon sprechen. Es geht nun darum die Zeit zwischen der Präsentation und dem Soundinput zu messen.

Die Details sind eigentlich nicht so wichtig. Was mir Probleme bereitet, ist die Erfassung des Soundinputs. Sprich: wie erkenne ich, ob etwas gesagt wird (ob das Wort richtig ist, wird manuell überprüft) und wie rechne ich weiter mit diesen Daten.

Da ich mit Soundinputs noch nie gearbeitet habe, wären kurze Erläuterungen (sofern mir jemand helfen kann) super.

Danke im Vorraus
Markus

Hallo :smile:

Hallo Markus,

also dein Vorhaben ist nicht klein und auch nicht einfach zu realisieren!
Ich selbst bastel ein Chat und habe darin auch eine Voice Uebertragung die ganz gut klappt :smile:
Wie du das Signal vom Mikro abfragen kannst, weiss ich zu bewerkstelligen. Aber dann das gesprochene Auszuwerten, da weiss ich keinen Weg und ich denke mal das man so etwas nicht realieren kann.
Ok du kannst vorher von den betroffenen Nutzern das jeweilige Wort sprechen lassen. Dieses aufzeichnen und dann mit dem im Programm gesprochene Wort vergleichen. Aber das ist ein schweineaufwand und da würde auch das Progg rel. gross werden.
Aber nun gut, zu deinem Problem

Zuerst einmal ein paar deklarationen, die du brauchst.

Modul Declariation

Option Explicit
'----------------------------------------------------------------------------------------------------
'====================================================================================================
'= WaveIn API's
'====================================================================================================
'----------------------------------------------------------------------------------------------------
Public Declare Sub CopyByPointer Lib "kernel32" Alias "RtlMoveMemory" (ByVal lpDestination As Long, ByVal lpSource As Long, ByVal cbCopy As Long)
Public Declare Sub CopyFromPointer Lib "kernel32" Alias "RtlMoveMemory" (ByRef lpvDestination As Any, ByVal lpSource As Long, ByVal cbCopy As Long)
Public Declare Sub CopyToPointer Lib "kernel32" Alias "RtlMoveMemory" (ByVal lpDestination As Long, ByRef lpvSource As Any, ByVal cbCopy As Long)
'····································································································
Public Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Public Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
Public Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Public Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
'····································································································
Public Declare Function waveInAddBuffer Lib "winmm" (ByVal hwi As Long, ByVal pwh As Long, ByVal cbwh As Long) As Long
Public Declare Function waveInClose Lib "winmm" (ByVal hwi As Long) As Long
Public Declare Function waveInGetErrorText Lib "winmm" Alias "waveInGetErrorTextA" (ByVal mmrError As Long, ByVal pszText As String, ByVal cchText As Long) As Long
Public Declare Function waveInOpen Lib "winmm" (ByRef phwi As Long, ByVal uDeviceID As Long, ByRef pwfx As WAVEFORMATEX\_GSM610, ByVal dwCallback As Long, ByVal dwCallbackInstance As Long, ByVal fdwOpen As Long) As Long
Public Declare Function waveInReset Lib "winmm" (ByVal hwi As Long) As Long
Public Declare Function waveInStart Lib "winmm" (ByVal hwi As Long) As Long
Public Declare Function waveInStop Lib "winmm" (ByVal hwi As Long) As Long
Public Declare Function waveInPrepareHeader Lib "winmm" (ByVal hwi As Long, ByVal pwh As Long, ByVal cbwh As Long) As Long
Public Declare Function waveInUnprepareHeader Lib "winmm" (ByVal hwi As Long, ByVal pwh As Long, ByVal cbwh As Long) As Long
'····································································································
Public Declare Function waveOutClose Lib "winmm" (ByVal hwo As Long) As Long
Public Declare Function waveOutGetErrorText Lib "winmm" Alias "waveOutGetErrorTextA" (ByVal mmrError As Long, ByVal pszText As String, ByVal cchText As Long) As Long
Public Declare Function waveOutOpen Lib "winmm" (ByRef phwo As Long, ByVal uDeviceID As Long, ByRef pwfx As WAVEFORMATEX\_GSM610, ByVal dwCallback As Long, ByVal dwCallbackInstance As Long, ByVal fdwOpen As Long) As Long
Public Declare Function waveOutPrepareHeader Lib "winmm" (ByVal hwo As Long, ByVal pwh As Long, ByVal cbwh As Long) As Long
Public Declare Function waveOutReset Lib "winmm" (ByVal hwo As Long) As Long
Public Declare Function waveOutUnprepareHeader Lib "winmm" (ByVal hwo As Long, ByVal pwh As Long, ByVal cbwh As Long) As Long
Public Declare Function waveOutWrite Lib "winmm" (ByVal hwo As Long, ByVal pwh As Long, ByVal cbwh As Long) As Long
'····································································································
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, ByVal lpParam As Long) As Long
Public Declare Function DestroyWindow Lib "user32" (ByVal hWnd As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
'----------------------------------------------------------------------------------------------------
'====================================================================================================
'= Misc Constants
'====================================================================================================
'-------------------------------------------------------------------|--------------------------------
Public Const BUFFER\_SIZE As Long = 65 ' 0.04 sek.
Public Const GMEM\_FIXED As Long = &H0& '
Public Const GMEM\_ZEROINIT As Long = &H40& '
Public Const GWL\_WNDPROC As Long = &HFFFFFFFC '
Public Const CALLBACK\_WINDOW As Long = &H10000 '
Public Const WAVE\_FORMAT\_GSM610 As Long = &H31& '
Public Const WAVE\_MAPPER As Long = &HFFFFFFFF '
Public Const MMSYSERR\_NOERROR As Long = 0 '
Public Const MM\_WOM\_OPEN As Long = &H3BB& '
Public Const MM\_WOM\_CLOSE As Long = &H3BC& '
Public Const MM\_WOM\_DONE As Long = &H3BD& '
Public Const MM\_WIM\_OPEN As Long = &H3BE& '
Public Const MM\_WIM\_CLOSE As Long = &H3BF& '
Public Const MM\_WIM\_DATA As Long = &H3C0& '
Public Const MAXERRORLENGTH As Long = 256 '
'-------------------------------------------------------------------|--------------------------------
'====================================================================================================
'= Types
'====================================================================================================
'-------------------------------------------------------------------|--------------------------------
Public Type WAVEFORMATEX\_GSM610 '
 wFormatTag As Integer '
 nChannels As Integer '
 nSamplesPerSec As Long '
 nAvgBytesPerSec As Long '
 nBlockAlign As Integer '
 wBitsPerSample As Integer '
 cbSize As Integer '
 wSamplesPerBlock As Integer '
End Type '
'···································································|································
Public Type WAVEHDR '
 lpData As Long '
 dwBufferLength As Long '
 dwBytesRecorded As Long '
 dwUser As Long '
 dwFlags As Long '
 dwLoops As Long '
 lpNext As Long '
 dwReserved As Long '
End Type '
'-------------------------------------------------------------------|--------------------------------
'====================================================================================================
'= Wave
'====================================================================================================
'-------------------------------------------------------------------|--------------------------------
Public objWaveIn As clsWaveIn '
Public objWaveOut As clsWaveOut '
'-------------------------------------------------------------------|--------------------------------
'----------------------------------------------------------------------------------------------------



'####################################################################################################
'#####[WaveIn Callback]############################################################################
'####################################################################################################
Public Function WaveInWindowProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
 WaveInWindowProc = objWaveIn.IncommingMessage(hWnd, uMsg, wParam, lParam)
End Function

'####################################################################################################
'#####[WaveOut Callback]###########################################################################
'####################################################################################################
Public Function WaveOutWindowProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
 WaveOutWindowProc = objWaveOut.IncommingMessage(hWnd, uMsg, wParam, lParam)
End Function

So dann die Routine der Eingabe, geschieht ueber ein Klassenmodul

Klassenmodul clsWaveIn

Option Explicit
'----------------------------------------------------------------------------------------------------
'====================================================================================================
'= Events
'====================================================================================================
'----------------------------------------------------------------------------------------------------
Public Event OnWaveInOpen()
Public Event OnWaveInData(ByRef Data() As Byte, ByVal Length As Long)
Public Event OnWaveInClose()
Public Event OnWaveInError(ByVal Number As Long, ByVal Description As String, ByVal Source As String)
'----------------------------------------------------------------------------------------------------
'====================================================================================================
'= Misc Constants
'====================================================================================================
'-------------------------------------------------------------------|--------------------------------
Private Const CLASS\_NAME As String = "clsWaveIn" '
'-------------------------------------------------------------------|--------------------------------
'====================================================================================================
'= Variables
'====================================================================================================
'-------------------------------------------------------------------|--------------------------------
Private colWaveHdr As New Collection '
Private wpOrigWndProc As Long '
Private hWindow As Long '
Private hWaveIn As Long '
Private blnOpen As Boolean '
'-------------------------------------------------------------------|--------------------------------
'====================================================================================================
'= Properties
'====================================================================================================
'----------------------------------------------------------------------------------------------------
'-----[Property BufferCount]-----------------------------------------------------------------------
Public Property Get BufferCount() As Long
 BufferCount = colWaveHdr.Count
End Property
'----------------------------------------------------------------------------------------------------



'####################################################################################################
'#####[Class]######################################################################################
'####################################################################################################
Private Sub Class\_Initialize()
 hWindow = CreateWindowEx( \_
 0&, \_
 "STATIC", \_
 "WAVE\_IN\_WINDOW", \_
 0&, \_
 0&, \_
 0&, \_
 0&, \_
 0&, \_
 0&, \_
 0&, \_
 App.hInstance, \_
 0& \_
 )
 '
 If hWindow 0 Then
 Set modWave.objWaveIn = Me
 '
 wpOrigWndProc = SetWindowLong(hWindow, GWL\_WNDPROC, AddressOf modWave.WaveInWindowProc)
 '
 If wpOrigWndProc 0 Then
 ' success
 Else
 Err.Raise Err.LastDllError, CLASS\_NAME, "Die Funktion SetWindowLong() ist fehlgeschlagen."
 End If
 Else
 Err.Raise Err.LastDllError, CLASS\_NAME, "Die Funktion CreateWindowEx() ist fehlgeschlagen."
 End If
End Sub

Private Sub Class\_Terminate()
 Dim lResult As Long
 '
 RecordStop
 '
 If hWindow 0 Then
 If wpOrigWndProc 0 Then
 lResult = SetWindowLong(hWindow, GWL\_WNDPROC, wpOrigWndProc)
 '
 If lResult 0 Then
 wpOrigWndProc = 0
 Else
 Err.Raise Err.LastDllError, CLASS\_NAME, "Die Funktion SetWindowLong() ist fehlgeschlagen."
 End If
 End If
 '
 lResult = DestroyWindow(hWindow)
 '
 If lResult 0 Then
 hWindow = 0
 Else
 Err.Raise Err.LastDllError, CLASS\_NAME, "Die Funktion DestroyWindow() ist fehlgeschlagen."
 End If
 End If
 '
 Set modWave.objWaveIn = Nothing
End Sub

'####################################################################################################
'#####[Methods]####################################################################################
'####################################################################################################
Friend Function RecordStart(ByRef Format As WAVEFORMATEX\_GSM610) As Boolean
 Dim lResult As Long
 '
 lResult = waveInOpen( \_
 hWaveIn, \_
 WAVE\_MAPPER, \_
 Format, \_
 hWindow, \_
 0, \_
 CALLBACK\_WINDOW \_
 )
 '
 If lResult = MMSYSERR\_NOERROR Then
 AddBuffer
 AddBuffer
 '
 lResult = waveInStart(hWaveIn)
 '
 If lResult = MMSYSERR\_NOERROR Then
 RecordStart = True
 Else
 RaiseEvent OnWaveInError(lResult, GetErrorString(lResult), CLASS\_NAME)
 End If
 Else
 RaiseEvent OnWaveInError(lResult, GetErrorString(lResult), CLASS\_NAME)
 End If
End Function

Public Function RecordStop() As Boolean
 Dim lResult As Long
 '
 If hWaveIn 0 Then
 blnOpen = False
 '
 lResult = waveInStop(hWaveIn)
 '
 If lResult = MMSYSERR\_NOERROR Then
 ' success
 Else
 RaiseEvent OnWaveInError(lResult, GetErrorString(lResult), CLASS\_NAME)
 End If
 '
 lResult = waveInReset(hWaveIn)
 '
 If lResult = MMSYSERR\_NOERROR Then
 ' success
 Else
 RaiseEvent OnWaveInError(lResult, GetErrorString(lResult), CLASS\_NAME)
 End If
 '
 lResult = waveInClose(hWaveIn)
 '
 If lResult = MMSYSERR\_NOERROR Then
 hWaveIn = 0
 '
 RecordStop = True
 Else
 RaiseEvent OnWaveInError(lResult, GetErrorString(lResult), CLASS\_NAME)
 End If
 End If
End Function

'####################################################################################################
'#####[Callback]###################################################################################
'####################################################################################################
Public Function IncommingMessage(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
 Dim udtWaveHdr As WAVEHDR
 Dim sKey As String
 Dim hHeader As Long
 Dim nHeader As Long
 Dim lResult As Long
 Dim bytData() As Byte
 '
 On Error Resume Next
 '
 Select Case uMsg
 Case MM\_WIM\_OPEN
 blnOpen = True
 RaiseEvent OnWaveInOpen
 Case MM\_WIM\_CLOSE
 blnOpen = False
 RaiseEvent OnWaveInClose
 Case MM\_WIM\_DATA
 nHeader = Len(udtWaveHdr)
 '
 lResult = waveInUnprepareHeader(hWaveIn, lParam, nHeader)
 '
 Call CopyFromPointer(udtWaveHdr, lParam, nHeader)
 '
 If udtWaveHdr.dwBytesRecorded \> 0 Then
 ReDim bytData(0 To udtWaveHdr.dwBytesRecorded - 1)
 '
 Call CopyFromPointer(bytData(0), udtWaveHdr.lpData, udtWaveHdr.dwBytesRecorded)
 '
 RaiseEvent OnWaveInData(bytData(), udtWaveHdr.dwBytesRecorded)
 End If
 '
 GlobalUnlock udtWaveHdr.dwUser
 GlobalFree udtWaveHdr.dwUser
 '
 sKey = "{" & Hex$(lParam) & "}"
 '
 hHeader = CLng(colWaveHdr(sKey))
 '
 GlobalUnlock hHeader
 GlobalFree hHeader
 '
 colWaveHdr.Remove sKey
 '
 If blnOpen = True Then
 AddBuffer
 End If
 Case Else
 IncommingMessage = CallWindowProc(wpOrigWndProc, hWnd, uMsg, wParam, lParam)
 End Select
End Function

'####################################################################################################
'#####[Helper]#####################################################################################
'####################################################################################################
Private Function AddBuffer() As Boolean
 Dim udtWaveHdr As WAVEHDR
 Dim sKey As String
 Dim hHeader As Long
 Dim pHeader As Long
 Dim nHeader As Long
 Dim lResult As Long
 '
 nHeader = Len(udtWaveHdr)
 hHeader = GlobalAlloc(GMEM\_FIXED Or GMEM\_ZEROINIT, nHeader)
 pHeader = GlobalLock(hHeader)
 '
 udtWaveHdr.dwUser = GlobalAlloc(GMEM\_FIXED Or GMEM\_ZEROINIT, BUFFER\_SIZE)
 udtWaveHdr.lpData = GlobalLock(udtWaveHdr.dwUser)
 udtWaveHdr.dwBufferLength = BUFFER\_SIZE
 udtWaveHdr.dwBytesRecorded = 0
 '
 Call CopyToPointer(pHeader, udtWaveHdr, nHeader)
 '
 sKey = "{" & Hex$(pHeader) & "}"
 '
 colWaveHdr.Add CStr(hHeader), sKey
 '
 lResult = waveInPrepareHeader(hWaveIn, pHeader, nHeader)
 If lResult = MMSYSERR\_NOERROR Then
 lResult = waveInAddBuffer(hWaveIn, pHeader, nHeader)
 If lResult = MMSYSERR\_NOERROR Then
 AddBuffer = True
 End If
 End If
End Function

Private Function GetErrorString(lngError As Long) As String
 Dim sBuffer As String
 Dim lResult As Long
 '
 sBuffer = String$(MAXERRORLENGTH, vbNullChar)
 '
 lResult = waveInGetErrorText(lngError, sBuffer, Len(sBuffer))
 '
 If lResult = MMSYSERR\_NOERROR Then
 GetErrorString = StripNull(sBuffer)
 End If
End Function

Private Function StripNull(strData As String) As String
 Dim lPos As Long
 '
 lPos = InStr(strData, vbNullChar)
 '
 If lPos \> 0 Then
 StripNull = Left$(strData, lPos)
 Else
 StripNull = strData
 End If
End Function

dann brauchst du noch die Ausgaberoutine, geschieht auch über ein Klassenmodul

Klassenmodul clsWaveOut

 Option Explicit
'----------------------------------------------------------------------------------------------------
'====================================================================================================
'= Events
'====================================================================================================
'----------------------------------------------------------------------------------------------------
Public Event OnWaveOutOpen()
Public Event OnWaveOutDone(ByVal Length As Long)
Public Event OnWaveOutClose()
Public Event OnWaveOutError(ByVal Number As Long, ByVal Description As String, ByVal Source As String)
'----------------------------------------------------------------------------------------------------
'====================================================================================================
'= Misc Constants
'====================================================================================================
'-------------------------------------------------------------------|--------------------------------
Private Const CLASS\_NAME As String = "clsWaveOut" '
'-------------------------------------------------------------------|--------------------------------
'====================================================================================================
'= Variables
'====================================================================================================
'-------------------------------------------------------------------|--------------------------------
Private colWaveHdr As New Collection '
Private wpOrigWndProc As Long '
Private hWindow As Long '
Private hWaveOut As Long '
Private blnOpen As Boolean '
'-------------------------------------------------------------------|--------------------------------
'====================================================================================================
'= Properties
'====================================================================================================
'----------------------------------------------------------------------------------------------------
'-----[Property BufferCount]-----------------------------------------------------------------------
Public Property Get BufferCount() As Long
 BufferCount = colWaveHdr.Count
End Property
'----------------------------------------------------------------------------------------------------



'####################################################################################################
'#####[Class]######################################################################################
'####################################################################################################
Private Sub Class\_Initialize()
 hWindow = CreateWindowEx( \_
 0&, \_
 "STATIC", \_
 "WAVE\_OUT\_WINDOW", \_
 0&, \_
 0&, \_
 0&, \_
 0&, \_
 0&, \_
 0&, \_
 0&, \_
 App.hInstance, \_
 0& \_
 )
 '
 If hWindow 0 Then
 Set modWave.objWaveOut = Me
 '
 wpOrigWndProc = SetWindowLong(hWindow, GWL\_WNDPROC, AddressOf modWave.WaveOutWindowProc)
 '
 If wpOrigWndProc 0 Then
 ' success
 Else
 Err.Raise Err.LastDllError, CLASS\_NAME, "Die Funktion SetWindowLong() ist fehlgeschlagen."
 End If
 Else
 Err.Raise Err.LastDllError, CLASS\_NAME, "Die Funktion CreateWindowEx() ist fehlgeschlagen."
 End If
End Sub

Private Sub Class\_Terminate()
 Dim lResult As Long
 '
 PlaybackStop
 '
 If hWindow 0 Then
 If wpOrigWndProc 0 Then
 lResult = SetWindowLong(hWindow, GWL\_WNDPROC, wpOrigWndProc)
 '
 If lResult 0 Then
 wpOrigWndProc = 0
 Else
 Err.Raise Err.LastDllError, CLASS\_NAME, "Die Funktion SetWindowLong() ist fehlgeschlagen."
 End If
 End If
 '
 lResult = DestroyWindow(hWindow)
 '
 If lResult 0 Then
 hWindow = 0
 Else
 Err.Raise Err.LastDllError, CLASS\_NAME, "Die Funktion DestroyWindow() ist fehlgeschlagen."
 End If
 End If
 '
 Set modWave.objWaveOut = Nothing
End Sub

'####################################################################################################
'#####[Methods]####################################################################################
'####################################################################################################
Friend Function PlaybackStart(ByRef Format As WAVEFORMATEX\_GSM610) As Boolean
 Dim lResult As Long
 '
 lResult = waveOutOpen( \_
 hWaveOut, \_
 WAVE\_MAPPER, \_
 Format, \_
 hWindow, \_
 0&, \_
 CALLBACK\_WINDOW \_
 )
 '
 If lResult = MMSYSERR\_NOERROR Then
 PlaybackStart = True
 Else
 RaiseEvent OnWaveOutError(lResult, GetErrorString(lResult), CLASS\_NAME)
 End If
End Function

Public Function PlaybackStop() As Boolean
 Dim lResult As Long
 '
 If hWaveOut 0 Then
 lResult = waveOutReset(hWaveOut)
 '
 If lResult = MMSYSERR\_NOERROR Then
 ' success
 Else
 RaiseEvent OnWaveOutError(lResult, GetErrorString(lResult), CLASS\_NAME)
 End If
 '
 lResult = waveOutClose(hWaveOut)
 '
 If lResult = MMSYSERR\_NOERROR Then
 hWaveOut = 0
 '
 PlaybackStop = True
 Else
 RaiseEvent OnWaveOutError(lResult, GetErrorString(lResult), CLASS\_NAME)
 End If
 End If
End Function

'####################################################################################################
'#####[Callback]###################################################################################
'####################################################################################################
Public Function IncommingMessage(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
 Dim udtWaveHdr As WAVEHDR
 Dim sKey As String
 Dim hHeader As Long
 Dim nHeader As Long
 Dim lResult As Long
 '
 On Error Resume Next
 '
 Select Case uMsg
 Case MM\_WOM\_OPEN
 blnOpen = True
 RaiseEvent OnWaveOutOpen
 Case MM\_WOM\_CLOSE
 blnOpen = False
 RaiseEvent OnWaveOutClose
 Case MM\_WOM\_DONE
 nHeader = Len(udtWaveHdr)
 '
 lResult = waveOutUnprepareHeader(hWaveOut, lParam, nHeader)
 '
 Call CopyFromPointer(udtWaveHdr, lParam, nHeader)
 '
 If udtWaveHdr.dwBufferLength \> 0 Then
 RaiseEvent OnWaveOutDone(udtWaveHdr.dwBufferLength)
 End If
 '
 GlobalUnlock udtWaveHdr.dwUser
 GlobalFree udtWaveHdr.dwUser
 '
 sKey = "{" & Hex$(lParam) & "}"
 '
 hHeader = CLng(colWaveHdr(sKey))
 '
 GlobalUnlock hHeader
 GlobalFree hHeader
 '
 colWaveHdr.Remove sKey
 Case Else
 IncommingMessage = CallWindowProc(wpOrigWndProc, hWnd, uMsg, wParam, lParam)
 End Select
End Function

'####################################################################################################
'#####[Helper]#####################################################################################
'####################################################################################################
Public Function PlayBuffer(ByVal Pointer As Long, ByVal Length As Long) As Boolean
 Dim udtWaveHdr As WAVEHDR
 Dim sKey As String
 Dim hHeader As Long
 Dim pHeader As Long
 Dim nHeader As Long
 Dim lResult As Long
 '
 nHeader = Len(udtWaveHdr)
 hHeader = GlobalAlloc(GMEM\_FIXED Or GMEM\_ZEROINIT, nHeader)
 pHeader = GlobalLock(hHeader)
 '
 udtWaveHdr.dwUser = GlobalAlloc(GMEM\_FIXED Or GMEM\_ZEROINIT, Length)
 udtWaveHdr.lpData = GlobalLock(udtWaveHdr.dwUser)
 udtWaveHdr.dwBufferLength = Length
 '
 Call CopyByPointer(udtWaveHdr.lpData, Pointer, Length)
 Call CopyByPointer(pHeader, VarPtr(udtWaveHdr), nHeader)
 '
 sKey = "{" & Hex$(pHeader) & "}"
 '
 colWaveHdr.Add CStr(hHeader), sKey
 '
 lResult = waveOutPrepareHeader(hWaveOut, pHeader, nHeader)
 If lResult = MMSYSERR\_NOERROR Then
 lResult = waveOutWrite(hWaveOut, pHeader, nHeader)
 If lResult = MMSYSERR\_NOERROR Then
 PlayBuffer = True
 End If
 End If
End Function

Private Function GetErrorString(lngError As Long) As String
 Dim sBuffer As String
 Dim lResult As Long
 '
 sBuffer = String$(MAXERRORLENGTH, vbNullChar)
 '
 lResult = waveOutGetErrorText(lngError, sBuffer, Len(sBuffer))
 '
 If lResult = MMSYSERR\_NOERROR Then
 GetErrorString = StripNull(sBuffer)
 End If
End Function

Private Function StripNull(strData As String) As String
 Dim lPos As Long
 '
 lPos = InStr(strData, vbNullChar)
 '
 If lPos \> 0 Then
 StripNull = Left$(strData, lPos)
 Else
 StripNull = strData
 End If
End Function

Soweit solltest du nun alles wichtige haben :smile:

Wenn du dein Programm starten willst, so musst du aber noch, den ganzen Spass Initialisieren, das passiert wiefolgt

In der Form wo du es startest, nennen wir sie frmMain

Form frmMain

 Option Explicit
'----------------------------------------------------------------------------------------------------
'====================================================================================================
'= Wave Stream
'====================================================================================================
'-------------------------------------------------------------------|--------------------------------
Private WithEvents objWaveIn As clsWaveIn '
Private WithEvents objWaveOut As clsWaveOut '
'···································································|································
Private udtWaveFormatExGSM As WAVEFORMATEX\_GSM610 '
Private strBuffer As String '
Private dblWaveIn As Double '
Private dblWaveOut As Double '

Private Sub Form\_Load()
 Set objWaveIn = New clsWaveIn
 Set objWaveOut = New clsWaveOut
 '
 With udtWaveFormatExGSM
 .wFormatTag = WAVE\_FORMAT\_GSM610
 .nChannels = 1
 .nSamplesPerSec = 8000
 .nAvgBytesPerSec = 1625
 .nBlockAlign = 65
 .wBitsPerSample = 0
 .cbSize = 2
 .wSamplesPerBlock = 320
 End With
End Sub

Private Sub Form\_Unload(Cancel As Integer)
 Set objWaveIn = Nothing
 Set objWaveOut = Nothing
End Sub

Private Sub Starte() ' --\> Aufzeichnung wird gestartet
 If objWaveIn.RecordStart(udtWaveFormatExGSM) = True Then
 If objWaveOut.PlaybackStart(udtWaveFormatExGSM) = True Then
 dblWaveIn = 0
 dblWaveOut = 0
 end if
 end if
End Sub

Private Sub Stopp() ' ---\> Aufzeichnung wird beendet
 objWaveOut.PlaybackStop
 objWaveIn.RecordStop
End Sub

Private Sub objWaveIn\_OnWaveInError(ByVal Number As Long, ByVal Description As String, ByVal Source As String)
 MsgBox "Fehler " & CStr(Number) & ": " & Description & vbCrLf & vbCrLf & \_
 "Quelle: " & Source, \_
 vbOKOnly Or vbCritical
End Sub

Ich habe hier nicht alle Ereignisse aufgefuehrt. Aber ich denke mal das sich das alles selbst erklärt :wink:
Diese kannst du dann für diverse Anzeigen nehmen :smile:

MFG Alex

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]