Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > как работать с waveinopen


Автор: suvorr 24.9.2007, 11:33
Всем здрасте! Работая с WaveIn.... хочу естественно при заполнении буфера вызывать процедуру обработки.
Ну, вроде все сделал как просят. (см.код). И при открытии ввода она действительно вызывается (хотя это никому не надо!)! 
А при заполнении буфера -ни фига!!! В чем дело ...?

Код
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
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


Declare Function waveInGetNumDevs Lib "winmm.dll" () As Long
Public Declare Function waveInAddBuffer Lib "winmm.dll" (ByVal hwavein As Long, lpWaveInHdr As WAVEHDR, ByVal uSize As Long) As Long
Declare Function waveInReset Lib "winmm.dll" (ByVal hwavein As Long) As Long
Declare Function waveInOpen Lib "winmm.dll" (lphWaveIn As Long, ByVal uDeviceID As Long, _
   lpFormat As WAVEFORMATEX, ByVal dwCallback As Long, ByVal dwInstance As Long, ByVal dwFlags As Long) As Long
Declare Function waveInClose Lib "winmm.dll" (ByVal hwavein As Long) As Long
Declare Function waveInPrepareHeader Lib "winmm.dll" (ByVal hwavein As Long, lpWaveInHdr As WAVEHDR, ByVal uSize As Long) As Long
Declare Function waveInUnprepareHeader Lib "winmm.dll" (ByVal hwavein As Long, lpWaveInHdr As WAVEHDR, ByVal uSize As Long) As Long
Declare Function waveInStart Lib "winmm.dll" (ByVal hwavein As Long) As Long
Declare Function waveInStop Lib "winmm.dll" (ByVal hwavein As Long) As Long
Public hwavein&, wdt(10000) As Integer, WH As WAVEHDR, WF As WAVEFORMATEX, FVI As Integer
Public exam(9, 30000) As Integer, exfr(9, 30000) As Integer, ppp As Integer, nmbutton As Integer, nmcall As Integer
Private CALLBACK_NULL
Dim ddd As Integer
Public Const MM_WIM_DATA = &H3C0





Public Sub start():
     If waveInGetNumDevs <= 0 Then MsgBox "Unable to detect any wave input devices": End
        WF.wFormatTag = 1:
        WF.nChannels = 1:
        WF.nBlockAlign = 1:
        WF.nSamplesPerSec = 22050
        WF.wBitsPerSample = 16:
        WF.nAvgBytesPerSec = 44100:
        WF.cbSize = 0
        WH.lpData = VarPtr(wdt(0)):
        WH.dwBufferLength = 20000:
        WH.dwFlags = 0
100:    aa = waveInOpen(hwavein, -1&, WF, cbf, 0, CALLBACK_FUNCTION):
        If aa <> 0 Then MsgBox "Ââîä çàíÿò  ": Exit Sub
        waveInStart hwavein:
        waveInPrepareHeader hwavein, WH, Len(WH):                             'çàïóñê óõà
        DoEvents: DoEvents: DoEvents
        waveInAddBuffer hwavein, WH, Len(WH):
        End Sub
Public Function cbf(): MsgBox ddd: End Function




Автор: suvorr 25.9.2007, 11:14
Похоже дело не в CallBack функции а в том что по завершении буфера вообще никакого события не происходит!
То есть я отслеживаю заполнение буфера вручную, делаю паузу, затем вызываю WaveInAddBuffer и она мне возвращает ошибку 33 = WAVERR_STILLPLAYING ! Причем не всегда, но часто! По описаниям апишек не понять ни хрена. Примерчик бы кода работающего! 

Автор: suvorr 25.9.2007, 23:27
Что то я какой-то бред написал. Снимаю вопрос !

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)