[Back to SOUND SWAG index]  [Back to Main SWAG index]  [Original]

{
> 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.

[Back to SOUND SWAG index]  [Back to Main SWAG index]  [Original]