antidotes | Bonjour,
J'ai un plantage dans mon application au niveau de la fonction GlobalAlloc(), je n'ai aucun message d'erreur mais l'application se ferme brusquement.
Je lance une première fois la fonction StartInput() ça marche correctement en cours d'enregistrement je lance régulièrement la fonction GetVolume() sur un timer d'intervalle 1, lorsque j'ai fini mon enregistrement je déclanche la fonction StopInput(). Jusque là tout va bien mais si je veux relancer la fonction StartInput() directement derrière pour relancer un enregistrement le GlobalAlloc() sur hmem(0) marche mais celui sur hmem(1) fait planter l'application.
Dans le code ci-dessous la valeur de BUFFER_SIZE est 700 et NUM_BUFFERS est 2. buffaddress est une variable globale
Code de StartInput() :
Code :
- Public Function StartInput() As Boolean
- On Error GoTo err
- format.wFormatTag = 1
- format.nChannels = 1
- format.wBitsPerSample = 8
- format.nSamplesPerSec = 12000
- format.nBlockAlign = format.nChannels * format.wBitsPerSample / 8
- format.nAvgBytesPerSec = format.nSamplesPerSec * format.nBlockAlign
- format.cbSize = 0
- For i = 0 To NUM_BUFFERS - 1
- hmem(i) = GlobalAlloc(&H40, BUFFER_SIZE)
- inHdr(i).lpData = GlobalLock(hmem(i))
- inHdr(i).dwBufferLength = BUFFER_SIZE
- inHdr(i).dwFlags = 0
- inHdr(i).dwLoops = 0
- Next
- rc = waveInOpen(hWaveIn, DEVICEID, format, 0, 0, 0)
- If rc <> 0 Then
- waveInGetErrorText rc, msg, Len(msg)
- MsgBox msg
- StartInput = False
- Exit Function
- End If
- For i = 0 To NUM_BUFFERS - 1
- rc = waveInPrepareHeader(hWaveIn, inHdr(i), Len(inHdr(i)))
- If (rc <> 0) Then
- waveInGetErrorText rc, msg, Len(msg)
- MsgBox msg
- End If
- Next
- For i = 0 To NUM_BUFFERS - 1
- rc = waveInAddBuffer(hWaveIn, inHdr(i), Len(inHdr(i)))
- If (rc <> 0) Then
- waveInGetErrorText rc, msg, Len(msg)
- MsgBox msg
- End If
- Next
- fRecording = True
- rc = waveInStart(hWaveIn)
- StartInput = True
- Exit Function
- err:
- StartInput = False
- End Function
|
Code de StopInput() :
Code :
- Public Function StopInput() As Integer
- On Error GoTo err
- fRecording = False
- waveInReset hWaveIn
- waveInStop hWaveIn
- For i = 0 To NUM_BUFFERS - 1
- waveInUnprepareHeader hWaveIn, inHdr(i), Len(inHdr(i))
- GlobalFree hmem(i)
- Next
- waveInClose hWaveIn
- GlobalFree volHmem
- StopInput = 0
- Exit Function
- err:
- StopInput = 1
- End Function
|
Code de getVolume() :
Code :
- Public Function getVolume(pbuff As Long) As Integer
- Dim n As Integer
- On Error Resume Next
- Do While Not inHdr(0).dwFlags And WHDR_DONE
-
- Loop
- iValue.Caption = CStr(0)
- iValue.Refresh
- CopyStructFromPtr audbytearray, inHdr(0).lpData, inHdr(0).dwBufferLength
- rc = waveInAddBuffer(hWaveIn, inHdr(0), Len(inHdr(0)))
- tempval = 0
- posval = 0
- For n = 0 To BUFFER_SIZE - 1
- posval = audbytearray.bytes(n) - 128
- If posval < 0 Then posval = 0 - posval
- If posval > tempval Then tempval = posval
- Next n
- getVolume = tempval
- pbuff = inHdr(0).lpData
- End Function
|
Appel de la fonction StartInput() :
Code :
- SoundMeter.StartInput
- Timer1.Enabled = True
|
Appel de la fonction StopInput() :
Code :
- Dim i As Long
- Timer1.Enabled = False
- For i = 1 To 500000
- Next
- SoundMeter.StopInput
- buffaddress = 0
|
Appel de la fonction getVolume() :
Code :
- Private Sub Timer1_Timer()
- Dim vValeur As Long
- vValeur = SoundMeter.getVolume(buffaddress)
- Select Case vValeur
- ...
- End Select
|
Message édité par antidotes le 18-04-2006 à 15:45:33
|