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()