Here is a quick and dirty revision of the code.
( you might need to re-write the following code using the chris319 corrections - see previous posts )
Code: Select all
;/
;/ Object     Audio Recorder 1.0 (a)
;/
;/ Date       August 2004
;/ Author     Philippe Carpentier
;/ Contact    flype@altern.org
;/ Info       MS Windows only - winmm.lib - mmsystem.h
;/
;
;- REC GLOBAL
;
Global QuitRec.l
;
;- REC CONSTANTES
;
#MinWidth      = 320
#MinHeight     = 240
;
;- REC INITIALISATION
;
Enumeration 0 ; #CHANNEL
  #CHANNEL_LEFT
  #CHANNEL_RIGHT
EndEnumeration
Enumeration 0 ; #GADGET
  #gadFrame1
  #gadFrame2
  #gadStart
  #gadStop
  #gadSndVol
  #gadFile
  #gadChannel
  #gadResolution
  #gadFrequence
  #gadDevice
EndEnumeration
Enumeration 0 ; #WINDOW
  #Window
EndEnumeration
Enumeration 0 ; #TOOLBAR
  #ToolBar
EndEnumeration
Enumeration 0 ; #STATUSBAR
  #StatusBar
EndEnumeration
Structure WAVEFORMATEX
  wFormatTag.w
  nChannels.w
  nSamplesPerSec.l
  nAvgBytesPerSec.l
  nBlockAlign.w
  wBitsPerSample.w
  cbSize.w
EndStructure
Structure SCOPE
  channel.b
  left.l
  top.l
  width.l
  height.l
  middleY.l
  quarterY.l
EndStructure
Structure CONFIG
  
  hWindow.l           ; Window handle
  hToolBar.l          ; ToolBar handle
  hfont.l             ; Font handle
  
  Date.l              ; Start date
  size.l              ; Wave buffer size
  buffer.l            ; Wave buffer pointer
  output.l            ; WindowOutput()
  wave.l              ; Address of waveform-audio input device
  recorded.l          ; Number of bytes recorded
  recording.b         ; Record is running...
  
  File.s              ; Recording FileName (c:\unnamed.raw)
  FileId.l            ; Recording FileId (#PB_Any)
  SndVol.s            ; Microsoft Volume Control (sndvol32.exe)
  format.WAVEFORMATEX ; Capturing WaveFormatEx
  lBuf.l              ; Capturing Buffer size
  nBuf.l              ; Capturing Buffer number
  nDev.l              ; Capturing Device identifier
  nBit.l              ; Capturing Resolution (8/16)
  nHertz.l            ; Capturing Frequency  (Hertz)
  nChannel.l          ; Capturing Channels number (Mono/Stereo)
  
  LScope.SCOPE        ; Wave form display
  RScope.SCOPE        ; Wave form display
  ScopeTimer.l        ; Scope Timer (redraw every n times)
  cback.l             ; Back color
  cline.l             ; Line color
  cwave.l             ; Wave color
  ColRecWave.l        ; Scope Record Wave Color
  ColRecBack.l        ; Scope Record Back Color
  ColRecLine.l        ; Scope Record Line Color
  ColCapWave.l        ; Scope Capture Wave Color
  ColCapBack.l        ; Scope Capture Back Color
  ColCapLine.l        ; Scope Capture Line Color
  
EndStructure
Global Config.CONFIG
Global Dim inHdr.WAVEHDR(16)
Config\hfont             = LoadFont(0,"Arial",7)
Config\format\cbSize     = 0 
Config\format\wFormatTag = #WAVE_FORMAT_PCM
Config\LScope\channel    = #CHANNEL_LEFT
Config\RScope\channel    = #CHANNEL_RIGHT
;
;- REC DECLARATIONS
;
Declare Clamp(value.l,min.l,max.l)
Declare CONFIG_Load()
Declare CONFIG_Save()
Declare CAPTURE_Stop()
Declare CAPTURE_Start()
Declare CAPTURE_Error(err.l)
Declare CAPTURE_GetDevices(gadId.l)
Declare CAPTURE_Read(hWaveIn.l,lpWaveHdr.l)
Declare DRAW_Scope()
Declare DRAW_Wave(*scope.SCOPE)
Declare DRAW_Wave8M(*scope.SCOPE)
Declare DRAW_Wave8S(*scope.SCOPE)
Declare DRAW_Wave16M(*scope.SCOPE)
Declare DRAW_Wave16S(*scope.SCOPE)
Declare DRAW_LCD(*scope.SCOPE,lcd$)
Declare DRAW_Background(*scope.SCOPE)
Declare FILE_Close()
Declare FILE_Append()
Declare FILE_Create()
Declare FILE_Select()
Declare FILE_Recording(state.b)
Declare FILE_raw2wav(File.s)
Declare GUI_Init()
Declare GUI_Resize()
Declare GUI_TBCombo(Id,x,y,w,h)
Declare GUI_CallBack(hWnd.l,Msg.l,wParam.l,lParam.l)
;
;- REC PROCEDURES
;
;
Procedure Clamp(value.l,min.l,max.l)
  If value<min : ProcedureReturn min : EndIf
  If value>max : ProcedureReturn max : EndIf  
  ProcedureReturn value
EndProcedure
;
Procedure CONFIG_Load()
  
  OpenPreferences("Recorder.ini")
  
  PreferenceGroup("Files")
  Config\File   = ReadPreferenceString("FileName","c:\unnamed.raw")
  Config\SndVol = ReadPreferenceString("SndVol","sndvol32")
  
  PreferenceGroup("Capture")
  Config\nDev     = ReadPreferenceLong("Device",0)
  Config\nChannel = ReadPreferenceLong("Channel",1)
  Config\nHertz   = ReadPreferenceLong("Frequency",7)
  Config\nBit     = ReadPreferenceLong("Resolution",1)
  Config\nBuf     = ReadPreferenceLong("BufferNum",8)
  Config\lBuf     = ReadPreferenceLong("BufferLen",512)
  
  PreferenceGroup("Scope")
  Config\ScopeTimer   = ReadPreferenceLong("ScopeTimer",25)
  Config\ColRecLine   = ReadPreferenceLong("ColRecLine",  $000035)
  Config\ColRecWave   = ReadPreferenceLong("ColRecWave",  $1010E0)
  Config\ColRecBack   = ReadPreferenceLong("ColRecBack",  $000050)
  Config\ColCapLine   = ReadPreferenceLong("ColCapLine",  $004000)
  Config\ColCapWave   = ReadPreferenceLong("ColCapWave",  $20E020)
  Config\ColCapBack   = ReadPreferenceLong("ColCapBack",  $004900)
  
  PreferenceGroup("Window")
  pos.WINDOWPLACEMENT
  pos\length=SizeOf(WINDOWPLACEMENT)
  pos\ptMinPosition\x         = ReadPreferenceLong("MinPosX",0)
  pos\ptMinPosition\y         = ReadPreferenceLong("MinPoxY",0)
  pos\ptMaxPosition\x         = ReadPreferenceLong("MaxPosX",-1)
  pos\ptMaxPosition\y         = ReadPreferenceLong("MaxPosY",-1)
  pos\rcNormalPosition\left   = ReadPreferenceLong("PosX1",100)
  pos\rcNormalPosition\top    = ReadPreferenceLong("PosY1",100)
  pos\rcNormalPosition\right  = ReadPreferenceLong("PosX2",#MinWidth)
  pos\rcNormalPosition\bottom = ReadPreferenceLong("PosY2",#MinHeight)
  
  ClosePreferences()
  
  Config\cback   = Config\ColCapBack
  Config\cline   = Config\ColCapLine
  Config\cwave   = Config\ColCapWave
  
  StatusBarText(0,2,Config\File)
  SetGadgetState(#gadDevice,Config\nDev)
  SetGadgetState(#gadChannel,Config\nChannel)
  SetGadgetState(#gadFrequence,Config\nHertz)
  SetGadgetState(#gadResolution,Config\nBit)
  SetWindowPlacement_(Config\hWindow,@pos)
  ShowWindow_(Config\hWindow,#True)
  
EndProcedure
;
Procedure CONFIG_Save()
  
  pos.WINDOWPLACEMENT
  pos\length = SizeOf(WINDOWPLACEMENT)
  GetWindowPlacement_(Config\hWindow,@pos)
  
  If CreatePreferences("Recorder.ini")
    
    PreferenceGroup("Files")
    WritePreferenceString("FileName",Config\File)
    WritePreferenceString("SndVol",Config\SndVol)
    
    PreferenceGroup("Capture")
    WritePreferenceLong("Device",Config\nDev)
    WritePreferenceLong("Channel",Config\nChannel)
    WritePreferenceLong("Frequency",Config\nHertz)
    WritePreferenceLong("Resolution",Config\nBit)
    WritePreferenceLong("BufferNum",Config\nBuf)
    WritePreferenceLong("BufferLen",Config\lBuf)
    
    PreferenceGroup("Scope")
    WritePreferenceLong("ScopeTimer",Config\ScopeTimer)
    WritePreferenceLong("ColRecLine",Config\ColRecLine)
    WritePreferenceLong("ColRecWave",Config\ColRecWave)
    WritePreferenceLong("ColRecBack",Config\ColRecBack)
    WritePreferenceLong("ColCapLine",Config\ColCapLine)
    WritePreferenceLong("ColCapWave",Config\ColCapWave)
    WritePreferenceLong("ColCapBack",Config\ColCapBack)
    
    PreferenceGroup("Window")
    WritePreferenceLong("MinPosX",pos\ptMinPosition\x)
    WritePreferenceLong("MinPoxY",pos\ptMinPosition\y)
    WritePreferenceLong("MaxPosX",pos\ptMaxPosition\x)
    WritePreferenceLong("MaxPosY",pos\ptMaxPosition\y)
    WritePreferenceLong("PosX1",pos\rcNormalPosition\left)
    WritePreferenceLong("PosY1",pos\rcNormalPosition\top)
    WritePreferenceLong("PosX2",pos\rcNormalPosition\right)
    WritePreferenceLong("PosY2",pos\rcNormalPosition\bottom)
    
    ClosePreferences()
    ProcedureReturn #True
    
  EndIf
  
EndProcedure
;
Procedure CAPTURE_Error(err.l)
  If err
    text.s=Space(#MAXERRORLENGTH)
    waveInGetErrorText_(err,text,#MAXERRORLENGTH)
    MessageRequester("Error",text,#MB_ICONERROR)
    CAPTURE_Stop()
    End
  EndIf
EndProcedure
;
Procedure CAPTURE_Start()
  
  CAPTURE_Stop()
  
  Config\nDev = GetGadgetState(#gadDevice)
  
  Config\nChannel = GetGadgetState(#gadChannel)
  Select Config\nChannel
    Case 0 : Config\format\nChannels = 1
    Case 1 : Config\format\nChannels = 2
  EndSelect
  
  Config\nBit = GetGadgetState(#gadResolution)
  Select Config\nBit
    Case 0 : Config\format\wBitsPerSample = 8
    Case 1 : Config\format\wBitsPerSample = 16
  EndSelect
  
  Config\nHertz = GetGadgetState(#gadFrequence)
  Select Config\nHertz
    Case 0 : Config\format\nSamplesPerSec =  8000
    Case 1 : Config\format\nSamplesPerSec = 11025
    Case 2 : Config\format\nSamplesPerSec = 12000
    Case 3 : Config\format\nSamplesPerSec = 16000
    Case 4 : Config\format\nSamplesPerSec = 22050
    Case 5 : Config\format\nSamplesPerSec = 24000
    Case 6 : Config\format\nSamplesPerSec = 32000
    Case 7 : Config\format\nSamplesPerSec = 44100
    Case 8 : Config\format\nSamplesPerSec = 48000
  EndSelect
  
  Config\format\nBlockAlign     = (Config\format\nChannels*Config\format\wBitsPerSample)/8
  Config\format\nAvgBytesPerSec = Config\format\nSamplesPerSec*Config\format\nBlockAlign
  
  If #MMSYSERR_NOERROR = waveInOpen_(@Config\wave,#WAVE_MAPPER+Config\nDev,@Config\format,Config\hWindow,#Null,#CALLBACK_WINDOW|#WAVE_FORMAT_DIRECT)
    
    For i=0 To Config\nBuf-1
      inHdr(i)\lpData=AllocateMemory(Config\lBuf)
      inHdr(i)\dwBufferLength=Config\lBuf
      waveInPrepareHeader_(Config\wave,inHdr(i),SizeOf(WAVEHDR))
      waveInAddBuffer_(Config\wave,inHdr(i),SizeOf(WAVEHDR))
    Next
    
    If #MMSYSERR_NOERROR = waveInStart_(Config\wave)
      SetTimer_(Config\hWindow,0,Config\ScopeTimer,0)
    EndIf
    
  EndIf
  
EndProcedure
;
Procedure CAPTURE_Stop()
  If Config\wave
    waveInReset_(Config\wave)
    waveInStop_(Config\wave)
    For i=0 To Config\nBuf-1
      If inHdr(i)
        waveInUnprepareHeader_(Config\wave,inHdr(i),SizeOf(WAVEHDR))
      EndIf
    Next
    waveInClose_(Config\wave)
  EndIf
  
  KillTimer_(Config\hWindow,0)
  
EndProcedure
;
Procedure CAPTURE_Read(hWaveIn.l,lpWaveHdr.l)
  
  waveInAddBuffer_(hWaveIn,lpWaveHdr,SizeOf(WAVEHDR))
  
  *hWave.WAVEHDR=lpWaveHdr
  Config\buffer=*hWave\lpData
  Config\size=*hWave\dwBytesRecorded
  
  FILE_Append()
  
EndProcedure
;
Procedure CAPTURE_GetDevices(gadId.l)
  MMNumDevice.l = waveInGetNumDevs_()
  If MMNumDevice
    For MMDeviceId=#WAVE_MAPPER To MMNumDevice-1
      MMResult.l = waveInGetDevCaps_(MMDeviceId,@Caps.WAVEINCAPS,SizeOf(WAVEINCAPS))
      If MMResult = #MMSYSERR_NOERROR
        AddGadgetItem(gadId,-1,PeekS(@Caps\szPname,#MAXPNAMELEN))
      EndIf
    Next
  EndIf
EndProcedure
;
Procedure DRAW_Scope()
  If Config\buffer
    StartDrawing(Config\output)
      DRAW_Background(Config\LScope)
      DRAW_Background(Config\RScope)
      DRAW_Wave(Config\LScope)
      If Config\nChannel
        DRAW_Wave(Config\RScope)
      EndIf
    StopDrawing()
  EndIf
EndProcedure
;
Procedure DRAW_Background(*scope.SCOPE)
  
  Box (*scope\left,*scope\top,*scope\width,*scope\height,Config\cback)
  Line(*scope\left,*scope\middleY-*scope\quarterY,*scope\width,0,Config\cline)
  Line(*scope\left,*scope\middleY+*scope\quarterY,*scope\width,0,Config\cline)
  
EndProcedure
;
Procedure DRAW_LCD(*scope.SCOPE,lcd$)
  
  DrawingMode(1)
  FrontColor($00FFFF)
  DrawingFont(Config\hfont)
  Select *scope\channel
    Case #CHANNEL_LEFT  : DrawText(*scope\left+1, *scope\top, "[L] "+lcd$)
    Case #CHANNEL_RIGHT : DrawText(*scope\left+1, *scope\top, "[R] "+lcd$)
  EndSelect
  DrawingMode(0)
  
EndProcedure
;
Procedure DRAW_Wave(*scope.SCOPE)
  Select Config\nBit
    Case 0
      DRAW_LCD(*scope.SCOPE,"8 bits")
      Select Config\nChannel
        Case 0 : DRAW_Wave8M(*scope.SCOPE)
        Case 1 : DRAW_Wave8S(*scope.SCOPE)
      EndSelect
    Case 1
      DRAW_LCD(*scope.SCOPE,"16 bits")
      Select Config\nChannel
        Case 0 : DRAW_Wave16M(*scope.SCOPE)
        Case 1 : DRAW_Wave16S(*scope.SCOPE)
      EndSelect
  EndSelect
EndProcedure
;
Procedure DRAW_Wave8M(*scope.SCOPE)
  
  oldx.l=*scope\left
  For i=0 To Config\size
    value.b=PeekB(Config\buffer+i)+$7F
    xx=Clamp(*scope\left+(i**scope\width)/(Config\size+1),*scope\left,*scope\width)
    yy=(value**scope\height)/$FF
    LineXY(oldx,*scope\middleY+oldy,xx,*scope\middleY+yy,Config\cwave)
    oldx=xx:oldy=yy
  Next
  
EndProcedure
;
Procedure DRAW_Wave8S(*scope.SCOPE)
  
  oldx.l=*scope\left
  For i=0 To Config\size Step 2
    value.b=PeekB(Config\buffer+i+*scope\channel*2)+$7F
    xx=Clamp(*scope\left+(i**scope\width)/(Config\size+1),*scope\left,*scope\width)
    yy=(value**scope\height)/$FF
    LineXY(oldx,*scope\middleY+oldy,xx,*scope\middleY+yy,Config\cwave)
    oldx=xx:oldy=yy
  Next
  
EndProcedure
;
Procedure DRAW_Wave16M(*scope.SCOPE)
  
  oldx.l=*scope\left
  For i=0 To Config\size Step 2
    value.w=PeekW(Config\buffer+i)
    xx=Clamp(*scope\left+(i**scope\width)/(Config\size+1),*scope\left,*scope\width)
    yy=(value**scope\height)/$FFFF
    LineXY(oldx,*scope\middleY+oldy,xx,*scope\middleY+yy,Config\cwave)
    oldx=xx:oldy=yy
  Next
  
EndProcedure
;
Procedure DRAW_Wave16S(*scope.SCOPE)
  
  oldx.l=*scope\left
  For i=0 To Config\size Step 2
    value.w=PeekW(Config\buffer+i+*scope\channel*2)
    xx=Clamp(*scope\left+(i**scope\width)/(Config\size+1),*scope\left,*scope\width)
    yy=(value**scope\height)/$FFFF
    ayy=Abs(yy)
    If ayy>vmax:vmax=ayy:EndIf
    LineXY(oldx,*scope\middleY+oldy,xx,*scope\middleY+yy,Config\cwave)
    oldx=xx:oldy=yy
  Next
  
EndProcedure
;
Procedure FILE_Create()
  
  If Config\File
    Config\FileId = CreateFile(#PB_Any,Config\File)
    If Config\FileId
      DisableToolBarButton(#ToolBar, #gadStart,#True)
      DisableToolBarButton(#ToolBar, #gadFile,#True)
      DisableGadget(#gadChannel,#True)
      DisableGadget(#gadFrequence,#True)
      DisableGadget(#gadResolution,#True)
      DisableGadget(#gadDevice,#True)
      Config\Date = GetTickCount_()
      FILE_Recording(#True)
    Else
      MessageRequester("Error","Can't create file",#MB_ICONERROR)
    EndIf
  EndIf
  
EndProcedure
;
Procedure FILE_Append()
  
  If Config\recording = #True
    Config\recorded + Config\size
    WriteData(Config\FileId, Config\buffer,Config\size)
    StatusBarText(#StatusBar, 0,Str(Config\recorded)+" bytes",#PB_StatusBar_Center)
    StatusBarText(#StatusBar, 1,StrF((GetTickCount_()-Config\Date)/1000,3)+" secs",#PB_StatusBar_Center)
  EndIf
  
EndProcedure
;
Procedure FILE_Recording(state.b)
  
  If state
    Config\cback   = Config\ColRecBack
    Config\cline   = Config\ColRecLine
    Config\cwave   = Config\ColRecWave
  Else
    Config\cback   = Config\ColCapBack
    Config\cline   = Config\ColCapLine
    Config\cwave   = Config\ColCapWave
  EndIf
  
  Config\recording = state
  Config\recorded  = #Null
EndProcedure
;
Procedure FILE_Close()
  If Config\recording
    Config\Date = #Null
    FILE_Recording(#False)
    CloseFile(Config\FileId)
    Delay(1000)
    FILE_raw2wav(Config\File)    
    DisableToolBarButton(#ToolBar, #gadStart,#False)
    DisableToolBarButton(#ToolBar, #gadFile,#False)
    DisableGadget(#gadChannel,#False)
    DisableGadget(#gadFrequence,#False)
    DisableGadget(#gadResolution,#False)
    DisableGadget(#gadDevice,#False)
  EndIf
EndProcedure
;
Procedure FILE_Select()
  
  File.s = SaveFileRequester("Select a file",Config\File,"Raw Sound|(*.raw)",0)
  
  If File
    Config\File = File
  EndIf
  
  StatusBarText(0,2,Config\File)
  
EndProcedure
;
Procedure FILE_raw2wav(File.s)
  
  inId.l = ReadFile(#PB_Any,File)
  
  If inId = #Null
    ProcedureReturn #False
  EndIf
  
  lBuf.l = Lof(inId)
  pBuf.l = AllocateMemory(lBuf)
  
  If pBuf = #Null
    ProcedureReturn #False
  EndIf
  
  ReadData(inId, pBuf,lBuf)
  CloseFile(inId)
  
  f$ = GetFilePart(File)
  x$ = GetPathPart(File)+Left(f$,Len(f$)-Len(GetExtensionPart(File))-1)+".wav"
  
  outId.l = CreateFile(#PB_Any,x$)
  
  If outId = #Null
    ProcedureReturn #False
  EndIf
  
  b.w = Config\format\wBitsPerSample
  c.w = Config\format\nChannels
  h.l = Config\format\nSamplesPerSec
  
  WriteString(outId, "RIFF")
  WriteLong(outId, lBuf+44)
  WriteString(outId, "WAVE")
  WriteString(outId, "fmt ")
  WriteLong(outId, 16)
  WriteWord(outId, 1)
  WriteWord(outId, c)
  WriteLong(outId, h)
  WriteLong(outId, c*h*(b/8))
  WriteWord(outId, c*(h/8))
  WriteWord(outId, b)
  WriteString(outId, "data")
  WriteLong(outId, lBuf)
  WriteData(outId, pBuf,lBuf)
  
  CloseFile(outId)
  
  ProcedureReturn #True
  
EndProcedure
;
Procedure GUI_Init()
  QuitRec = 0
  WndId.l = OpenWindow(0,0,0,500,400,"Recorder",#PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_Invisible)
  If WndId=#Null : ProcedureReturn #False : EndIf
  
  Config\hWindow=WindowID(0)
  Config\output=WindowOutput(0)
  
  Config\hToolBar=CreateToolBar(#ToolBar,Config\hWindow)
  If Config\hToolBar=#Null : ProcedureReturn #False : EndIf
  
  If CreateGadgetList(Config\hWindow)=#Null
    ProcedureReturn #False
  EndIf
  
  If CreateStatusBar(#StatusBar,Config\hWindow)=#Null
    ProcedureReturn #False
  EndIf
  
  ToolBarStandardButton(#gadStart,#PB_ToolBarIcon_Open)
  ToolBarStandardButton(#gadStop,#PB_ToolBarIcon_Delete)
  
  ToolBarStandardButton(#gadFile,#PB_ToolBarIcon_Save)
  ToolBarSeparator()
  ToolBarStandardButton(#gadSndVol,#PB_ToolBarIcon_Properties)
  ToolBarSeparator()
  
  ToolBarToolTip(#ToolBar, #gadStart,"Record")
  ToolBarToolTip(#ToolBar, #gadStop,"Stop")
  ToolBarToolTip(#ToolBar, #gadFile,"Create a file")
  ToolBarToolTip(#ToolBar, #gadSndVol,"Volume")
  
  GUI_TBCombo(#gadChannel,0,1,58,200) 
  AddGadgetItem(#gadChannel,-1,"Mono")
  AddGadgetItem(#gadChannel,-1,"Stereo")
  SetGadgetState(#gadChannel,0)
  
  GUI_TBCombo(#gadResolution,2,1,55,200)
  AddGadgetItem(#gadResolution,-1,"8 bits")
  AddGadgetItem(#gadResolution,-1,"16 bits")
  
  GUI_TBCombo(#gadFrequence,2,1,80,200)
  AddGadgetItem(#gadFrequence,-1,"8000 khz")
  AddGadgetItem(#gadFrequence,-1,"11025 khz")
  AddGadgetItem(#gadFrequence,-1,"12000 khz")
  AddGadgetItem(#gadFrequence,-1,"16000 khz")
  AddGadgetItem(#gadFrequence,-1,"22050 khz")
  AddGadgetItem(#gadFrequence,-1,"24000 khz")
  AddGadgetItem(#gadFrequence,-1,"32000 khz")
  AddGadgetItem(#gadFrequence,-1,"44100 khz")
  AddGadgetItem(#gadFrequence,-1,"48000 khz")
  
  GUI_TBCombo(#gadDevice,2,1,160,200)
  CAPTURE_GetDevices(#gadDevice)
  SetGadgetState(#gadDevice,0)
  
  Frame3DGadget(#gadFrame1,0,0,0,0,"",#PB_Frame3D_Double)
  Frame3DGadget(#gadFrame2,0,0,0,0,"",#PB_Frame3D_Double)
  
  AddStatusBarField( 100)
  AddStatusBarField(  80)
  AddStatusBarField(1000)
  StatusBarText(0,0,"0 "+"bytes",#PB_StatusBar_Center)
  StatusBarText(0,1,"0.000 "+"secs",#PB_StatusBar_Center)
  
  SetWindowCallback(@GUI_CallBack())
  FILE_Recording(#False)
  GUI_Resize()
  
  ProcedureReturn #True
  
EndProcedure
;
Procedure GUI_Resize()
  
  WndW.l = ( WindowWidth(0)  -  4 )
  WndH.l = ( WindowHeight(0) - 60 ) >> 1
  Config\LScope\left     = 2
  Config\LScope\top      = 30
  Config\LScope\width    = WndW
  Config\LScope\height   = WndH
  Config\LScope\quarterY = Config\LScope\height >> 2
  Config\LScope\middleY  = Config\LScope\top + Config\LScope\height >> 1
  ResizeGadget(#gadFrame1,Config\LScope\left-2,Config\LScope\top-2,Config\LScope\width+4,Config\LScope\height+4)
  
  Config\RScope\left     = 2
  Config\RScope\top      = Config\LScope\top + Config\LScope\height + 6
  Config\RScope\width    = WndW
  Config\RScope\height   = WndH
  Config\RScope\quarterY = Config\RScope\height >> 2
  Config\RScope\middleY  = Config\RScope\top + Config\RScope\height >> 1
  ResizeGadget(#gadFrame2,Config\RScope\left-2,Config\RScope\top-2,Config\RScope\width+4,Config\RScope\height+4)
  
EndProcedure
;
Procedure GUI_TBCombo(Id,x,y,w,h)
  
  pos=SendMessage_(Config\hToolBar,#TB_BUTTONCOUNT,0,0) 
  ToolBarSeparator()        
  SendMessage_(Config\hToolBar,#TB_GETBUTTON,pos,@separator.TBBUTTON)
  separator\iBitmap=x+w
  SendMessage_(Config\hToolBar,#TB_DELETEBUTTON,pos,0) 
  SendMessage_(Config\hToolBar,#TB_INSERTBUTTON,pos,separator) 
  SendMessage_(Config\hToolBar,#TB_GETITEMRECT,pos,@rc.RECT)    
  UseGadgetList(Config\hToolBar)
  ComboBoxGadget(Id,x+rc\left,y,w,h)
  UseGadgetList(Config\hWindow)
  
EndProcedure
;
Procedure GUI_CallBack(hWnd.l,Msg.l,wParam.l,lParam.l)
  
  Result.l=#PB_ProcessPureBasicEvents
  
  Select Msg
    Case #WM_KEYDOWN
      If GetAsyncKeyState_(#VK_ESCAPE)
        QuitRec = 1
      EndIf 
    Case #WM_SIZE     : GUI_Resize()
    Case #WM_TIMER    : DRAW_Scope()
    Case #MM_WIM_DATA : CAPTURE_Read(wParam,lParam)
    Case #WM_COMMAND
      Select wParam & $FFFF
        Case #gadStart      : FILE_Create()
        Case #gadStop       : FILE_Close()
        Case #gadFile       : FILE_Select()
        Case #gadSndVol     : RunProgram(Config\SndVol,"","")
        Case #gadFrequence  : If EventType()=9 : CAPTURE_Start() : EndIf
        Case #gadResolution : If EventType()=9 : CAPTURE_Start() : EndIf
        Case #gadChannel    : If EventType()=9 : CAPTURE_Start() : EndIf
        Case #gadDevice     : If EventType()=9 : CAPTURE_Start() : EndIf
      EndSelect
    Case #WM_GETMINMAXINFO 
      *mmi.MINMAXINFO=lParam 
      *mmi\ptMinTrackSize\x=#MinWidth
      *mmi\ptMinTrackSize\y=#MinHeight
  EndSelect
  
  ProcedureReturn Result
  
EndProcedure
;
;- REC MAIN
;
Procedure StartRecorder()
  
  If GUI_Init()
    CONFIG_Load()
    CAPTURE_Start()
    Repeat
    Until WaitWindowEvent()=#WM_CLOSE Or QuitRec 
    CAPTURE_Stop()
    CONFIG_Save()
  EndIf
  
EndProcedure
StartRecorder()