home *** CD-ROM | disk | FTP | other *** search
- {
- > Does anybody know where to get some good source that plays Vocs?
- }
-
- {$A+,B-,D+,E-,F+,G-,I-,L-,N-,O+,R-,S-,V-,X-}
- {$M 1024,0,0 }
- Unit VOCPlay;
-
- Interface
-
- Uses
- Dos;
-
- Var
- VoiceStatusWord : Word;
- VocPaused,VOCDrvInstalled : Boolean;
-
- Procedure AllocateMem(Var P : Pointer;Size : LongInt);
- Function AllocateMemFunc(Var P : Pointer;Size : LongInt) : Boolean;
- Function ReAllocateMem(Var P : Pointer;NewSize : LongInt) : Boolean;
- Procedure DisAllocateMem(Var P : Pointer);
-
- Procedure VocOutPut(AdrtoPlay : Pointer);
- Procedure VocStop;
- Procedure VocPause;
- Procedure VocContinue;
- Procedure VocSetSpeaker(Onoff : Boolean);
- Function VocInitDriver : Byte;
- Function LoadVoctoMem(DateiName : String;Var VocMem : Pointer) : Boolean;
-
- Implementation
- Const
- VocDriverHeader = 12;
- VocFileHeaderLen = $1A;
- Var
- PtrtoDriver,OldExitProc : Pointer;
- Regs : Registers;
- SizeIntern : Word;
-
- Procedure AllocateMem;
- begin
- Inc(Size,15);
- SizeIntern := (Size SHR 4);
- Regs.AH := $48;
- Regs.BX := SizeIntern;
- MsDos(Regs);
- if Regs.Flags and FCarry <> 0 then
- P := NIL
- else
- P := Ptr(Regs.AX,0);
- end;
-
- Function AllocateMemFunc;
- begin
- AllocateMem(P,Size);
- AllocateMemFunc := P <> NIL;
- end;
-
- Function ReAllocateMem;
- begin
- Inc(NewSize,15);
- SizeIntern := (NewSize SHR 4);
- Regs.AH := $4A;
- Regs.BX := SizeIntern;
- Regs.ES := Seg(P^);
- MsDos(Regs);
- ReAllocateMem := (Regs.BX=SizeIntern);
- end;
-
- Procedure DisAllocateMem;
- begin
- Regs.AH := $49;
- Regs.ES := Seg(P^);
- MsDos(Regs);
- end;
-
- Function Exists(FileName : String) : Boolean;
- Var
- S : SearchRec;
- begin
- FindFirst(FileName,AnyFile,S);
- Exists := (DosError=0);
- end;
-
- Function VocInitDriver;
- Const
- DriverName = 'CT-VOICE.DRV';
- Type
- DriverType = Array [0..VocDriverHeader] of Char;
- Var
- Out,S,O : Word;
- F : File;
- begin
- Out := 0;
- if not Exists(DriverName) then
- begin
- VocInitDriver := 4;
- Exit;
- end;
- Assign(F,DriverName);
- Reset(F,1);
- if not AllocateMemFunc(PtrtoDriver,FileSize(F)) then Out := 5;
- if Out=0 then BlockRead(F,PtrtoDriver^,FileSize(F));
- Close(F);
- if Out<>0 then
- begin
- VocInitDriver := Out;
- Exit;
- end;
- if (DriverType(PtrtoDriver^)[3]<>'C') or
- (DriverType(PtrtoDriver^)[4]<>'T') then
- begin
- VocInitDriver := 4;
- Exit;
- end;
- S := Seg(VoiceStatusWord);
- O := ofs(VoiceStatusWord);
- Asm
- mov bx,3
- call PtrtoDriver
- mov Out,ax
- mov bx,5
- mov es,S
- mov di,O
- call PtrtoDriver
- end;
- VocInitDriver := Out;
- end;
-
- Procedure VocUninstallDriver;
- begin
- if VocDrvInstalled then
- Asm
- mov bx,9
- call PtrtoDriver
- end;
- end;
-
- Procedure VocOutPut;
- Var
- S,O : Word;
- begin
- VocSetSpeaker(True);
- S := Seg(AdrtoPlay^);
- O := ofs(AdrtoPlay^)+VocFileHeaderLen;
- Asm
- mov bx,6
- mov es,S
- mov di,O
- call PtrtoDriver
- end;
- end;
-
- Procedure VocStop;
- begin
- Asm
- mov bx,8
- call PtrtoDriver
- end;
- end;
-
- Procedure VocPause;
- begin
- Asm
- mov bx,10
- call PtrtoDriver
- end;
- end;
-
- Procedure VocContinue;
- begin
- Asm
- mov bx,11
- call PtrtoDriver
- end;
- end;
-
- Procedure VocSetSpeaker;
- Var B : Byte;
- begin
- B := ord(Onoff) and $01;
- Asm
- mov bx,4
- mov al,B
- call PtrtoDriver
- end;
- end;
-
- Function LoadVoctoMem;
- Var F : File;
- Out : Boolean;
- Gelesen,Segs : Word;
- begin
- Out := Exists(DateiName);
- if Out then
- begin
- Assign(F,DateiName);Reset(F,1);
- if not AllocateMemFunc(VocMem,FileSize(F)) then
- begin
- Close(F);
- LoadVoctoMem := False;
- Exit;
- end;
- Segs := 0;
- Repeat
- BlockRead(F,Ptr(Seg(VocMem^)+4096*Segs,ofs(VocMem^))^,$FFFF,Gelesen);
- Inc(Segs);
- Until Gelesen=0;
- Close(F);
- end;
- LoadVoctoMem := Out;
- end;
-
- {$F+}
- Procedure VocPlayExitProc;
- begin
- VocUninstallDriver;
- ExitProc := OldExitProc;
- end;
- {$F-}
-
- begin
- OldExitProc := ExitProc;
- ExitProc := @VocPlayExitProc;
- VoiceStatusWord := 0;
- VocPaused := False;
- VocDrvInstalled := (VocInitDriver=0);
- end.
-
-
- {$A+,B-,D+,E-,F-,G-,I-,L-,N-,O-,R-,S-,V-,X-}
- {$M 1024,0,0 }
- Uses Crt,VOCPlay;
- Var VocMem : Pointer;
- FileName : String;
- Ok : Boolean;
- begin
- FileName := ParamStr(1);
- Ok := False;
- if VocDrvInstalled then Ok := LoadVoctoMem(DateiName,VocMem);
- if Ok then
- begin
- Write('Playing VOC-File ...');
- VocOutPut(VocMem);
- Repeat
- Until (VoiceStatusWord=0) or KeyPressed;
- Writeln;
- DisAllocateMem(VocMem);
- end
- else Writeln('Hey, there was something wrong.');
- end.