Plantage GlobalAlloc() dans VB6

Plantage GlobalAlloc() dans VB6 - VB/VBA/VBS - Programmation

Marsh Posté le 18-04-2006 à 15:41:12    

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 :
  1. Public Function StartInput() As Boolean
  2. On Error GoTo err
  3.     format.wFormatTag = 1
  4.     format.nChannels = 1
  5.     format.wBitsPerSample = 8
  6.     format.nSamplesPerSec = 12000
  7.     format.nBlockAlign = format.nChannels * format.wBitsPerSample / 8
  8.     format.nAvgBytesPerSec = format.nSamplesPerSec *   format.nBlockAlign
  9.     format.cbSize = 0
  10.     For i = 0 To NUM_BUFFERS - 1
  11.         hmem(i) = GlobalAlloc(&H40, BUFFER_SIZE)
  12.         inHdr(i).lpData = GlobalLock(hmem(i))
  13.         inHdr(i).dwBufferLength = BUFFER_SIZE
  14.         inHdr(i).dwFlags = 0
  15.         inHdr(i).dwLoops = 0
  16.     Next
  17.     rc = waveInOpen(hWaveIn, DEVICEID, format, 0, 0, 0)
  18.     If rc <> 0 Then
  19.         waveInGetErrorText rc, msg, Len(msg)
  20.         MsgBox msg
  21.         StartInput = False
  22.         Exit Function
  23.     End If
  24.     For i = 0 To NUM_BUFFERS - 1
  25.         rc = waveInPrepareHeader(hWaveIn, inHdr(i), Len(inHdr(i)))
  26.         If (rc <> 0) Then
  27.             waveInGetErrorText rc, msg, Len(msg)
  28.             MsgBox msg
  29.         End If
  30.     Next
  31.     For i = 0 To NUM_BUFFERS - 1
  32.         rc = waveInAddBuffer(hWaveIn, inHdr(i), Len(inHdr(i)))
  33.         If (rc <> 0) Then
  34.             waveInGetErrorText rc, msg, Len(msg)
  35.             MsgBox msg
  36.         End If
  37.     Next
  38.     fRecording = True
  39.     rc = waveInStart(hWaveIn)
  40.     StartInput = True
  41.     Exit Function
  42. err:
  43.     StartInput = False
  44. End Function


 
Code de StopInput() :

Code :
  1. Public Function StopInput() As Integer
  2.     On Error GoTo err
  3.     fRecording = False
  4.     waveInReset hWaveIn
  5.     waveInStop hWaveIn
  6.     For i = 0 To NUM_BUFFERS - 1
  7.         waveInUnprepareHeader hWaveIn, inHdr(i), Len(inHdr(i))
  8.         GlobalFree hmem(i)
  9.     Next
  10.     waveInClose hWaveIn
  11.     GlobalFree volHmem
  12.     StopInput = 0
  13.     Exit Function
  14. err:
  15.     StopInput = 1
  16. End Function


 
Code de getVolume() :

Code :
  1. Public Function getVolume(pbuff As Long) As Integer
  2. Dim n As Integer
  3.    On Error Resume Next
  4.          Do While Not inHdr(0).dwFlags And WHDR_DONE
  5.      
  6.          Loop
  7.             iValue.Caption = CStr(0)
  8.             iValue.Refresh
  9.             CopyStructFromPtr audbytearray, inHdr(0).lpData, inHdr(0).dwBufferLength
  10.             rc = waveInAddBuffer(hWaveIn, inHdr(0), Len(inHdr(0)))
  11.     tempval = 0
  12.     posval = 0
  13.     For n = 0 To BUFFER_SIZE - 1
  14.         posval = audbytearray.bytes(n) - 128
  15.         If posval < 0 Then posval = 0 - posval
  16.         If posval > tempval Then tempval = posval
  17.     Next n
  18.         getVolume = tempval
  19.         pbuff = inHdr(0).lpData
  20. End Function


 
Appel de la fonction StartInput() :

Code :
  1. SoundMeter.StartInput
  2.         Timer1.Enabled = True


 
Appel de la fonction StopInput() :

Code :
  1. Dim i As Long
  2.     Timer1.Enabled = False
  3.     For i = 1 To 500000
  4.     Next
  5.     SoundMeter.StopInput
  6.     buffaddress = 0


 
Appel de la fonction getVolume() :

Code :
  1. Private Sub Timer1_Timer()
  2.     Dim vValeur As Long
  3.     vValeur = SoundMeter.getVolume(buffaddress)
  4.     Select Case vValeur
  5.      ...
  6.     End Select


Message édité par antidotes le 18-04-2006 à 15:45:33
Reply

Marsh Posté le 18-04-2006 à 15:41:12   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed