REM CDVolume.
REM (C) Martin Dann 2002.
ON ERROR:ON ERROR OFF:REPORT:PRINT ERL:OSCLI("SET DIRECTOR$ERROR "+REPORT$+STR$ ERL):END
REM ON ERROR:ONERROROFF:X$=REPORT$:OSCLI("REPORTERROR"):END
DIM block% 255,parm% 15,data% 255,block1% 255
A$="XOS_SWINumberFromString"
SYS A$,,"CDFS_ConvertDriveToDevice" TO ;flags%
IF (flags% AND 1)=1 THEN END:REM quit quietly.
SYS A$,,"CD_GetAudioParms" TO ;flags%
IF (flags% AND 1)=1 THEN END:REM quit quietly.
SYS A$,,"Wimp_ResizeIcon" TO ;flags%
IF (flags% AND 1)=1 THEN resize%=FALSE ELSE resize%=TRUE

task%=0
SYS"OS_GetEnv" TO Env$
SYS"Wimp_Initialise",310,&4B534154,"Director:CDVolume",0 TO ,task%

icon%=FNgetvalue("director$icon")
buttons%=FNgetvalue("director$buttons")
window%=FNgetvalue("director$window")

IF INSTR(Env$,"-param ")>0 THEN
  PROCparameters( MID$(Env$,INSTR(Env$,"-param")) )
ELSE
  PROCdrive(FNgetvalue("director$CDdrive"))
  volume%=FNgeticontext(window%,6)
  IF buttons%<0 THEN PROCcontrol ELSE PROCaction
ENDIF

IF task%<>0 THEN SYS"Wimp_CloseDown",task%,&4B534154
END

DEF PROCparameters(E$)
CASE FNparameter(E$,1) OF
 WHEN "-volume":D%=VAL(FNparameter(E$,2))
   V%=VAL(FNparameter(E$,3))
   PROCdrive(D%)
   PROCaddvolume(2,V%)
ENDCASE
ENDPROC

DEF PROCdrive(D%)
SYS"XCDFS_ConvertDriveToDevice",D% TO R0%,R1%
data%!0=R1% AND &7
data%!4=R1%>>3 AND &3
data%!8=R1%>>5 AND &7
data%!12=R1%>>8 AND &FF
data%!16=R1%>>16 AND &FFFF
ENDPROC

DEF PROCcontrol
CASE buttons% OF
  WHEN -255:PROCaddvolume(0,0):REM Window open (setup icons etc).
  WHEN -254:REM Window close.
  WHEN -253:REM Wimp_Poll_Null
  WHEN -252:REM Drag to
  WHEN -251:REM Drag from.
  WHEN -250:REM Window create.
  WHEN -247:REM Help message
   *set Director$Window$Help "This window controls the CD volume"
ENDCASE
ENDPROC

DEF PROCaction
dir%=0
IF INKEY -1 THEN
 IF buttons%=4 dir%=10
 IF buttons%=1 dir%=-10
ELSE
 IF buttons%=4 dir%=1
 IF buttons%=1 dir%=-1
ENDIF
CASE icon% OF
 WHEN 5:PROCgetmouseXY(5,X%,Y%):PROCaddvolume(1,X%)
 WHEN 3:PROCaddvolume(0,-dir%)
 WHEN 4:PROCaddvolume(0,dir%)
ENDCASE
ENDPROC

DEF PROCaddvolume(W%,D%)
LOCAL V%
SYS"XCD_GetAudioParms",0,block%,0,,,,,data% TO ;flags%
IF (flags% AND 1)=TRUE THEN ENDPROC
V%=(!block%+block%!4)/512
CASE W% OF
 WHEN 0:V%=V%+D%
 WHEN 1,2:V%=D%
ENDCASE
IF V%<0 THEN V%=0
IF V%>255 THEN V%=255
!block%=V%*256:block%!4=V%*256
SYS"XCD_SetAudioParms",0,block%,0,,,,,data% TO ;flags%
IF (flags% AND 1)=TRUE THEN ENDPROC
IF W%=2 THEN ENDPROC
!block%=window%:block%!4=2
SYS"Wimp_GetIconState",,block%
IF resize% THEN SYS"Wimp_ResizeIcon",window%,2,block%!8,block%!12,block%!8+V%,block%!20
$volume%=STR$ V%
PROCselecticon(window%,1,0)
PROCselecticon(window%,2,0)
PROCselecticon(window%,6,0)
ENDPROC

DEF FNgetvalue(V$)
LOCAL ERROR
ON ERROR LOCAL:RESTORE ERROR:=0
SYS"OS_ReadVarVal",V$,block%,256,0,0
REM *report V$ "=" !block%
=!block%

DEF PROCsetvalue(V$,N%)
!block%=N%
SYS"OS_SetVarVal",V$,block%,,0,1
ENDPROC

DEF PROCdeletevariable(V$)
SYS"OS_SetVarVal",V$,,-1,1
ENDPROC

DEF FNgeticontext(handle%,ihan%)
!block%=handle%:block%!4=ihan%
SYS"Wimp_GetIconState",,block%
 =block%!28

DEF PROCselecticon(handle%,ihan%,select%)
sel%=select% AND 1
!block%=handle%:block%!4=ihan%:block%!8=sel%<<21:block%!12=&200000
SYS "Wimp_SetIconState" ,,block%
ENDPROC

DEF PROCgetmouseXY(icon%,RETURN X%,RETURN Y%)
SYS"OS_Mouse" TO X%,Y%
!block%=window%:SYS"Wimp_GetWindowState",,block%
X%=X%-block%!4+block%!20:Y%=Y%-block%!16+block%!24
!block%=window%:block%!4=icon%
SYS"Wimp_GetIconState",,block%
X%=X%-block%!8:Y%=Y%-block%!12
ENDPROC

DEF FNparameter(S$,N%)
LOCAL P$,L%
P$="%"+STR$ N%
$block1%=S$
SYS"OS_SubstituteArgs",block1% OR 1<<31,block%,255,P$,LEN(P$) TO ,,L%
block%?L%=&0D
=$block%

