home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 10 / 10.iso / m / m003_1 / sdk_dos.ddi / TPASCAL / EFFECT / DEMOFPV.PAS
Encoding:
Pascal/Delphi Source File  |  1991-10-31  |  13.9 KB  |  368 lines

  1. { ------------------------------------------------------------------------ }
  2. {  @@ Source Documentation                           *** TP6 Version ***   }
  3. {                                                                          }
  4. {  Copyright (c) Creative Technology Pte Ltd, 1991. All rights reserved.   }
  5. {                                                                          }
  6. {   TITLE       : DEMOFPV.PAS                                              }
  7. {                                                                          }
  8. {   DESCRIPTION :                                                          }
  9. {       This program demostrates how to use the AUXDRV.DRV driver to       }
  10. {       perform panning and fading effect on the playing voice.            }
  11. {                                                                          }
  12. {       You need to have a Sound Blaster Pro card to run this program.     }
  13. {                                                                          }
  14. {       Note that the BLASTER environment has to be set before executing   }
  15. {       this program.                                                      }
  16. {                                                                          }
  17. { ------------------------------------------------------------------------ }
  18.  
  19. program demofpv;
  20.  
  21. { Include the SBC Unit, and any other units needed }
  22. uses sbc_tp6, dos, crt;
  23.  
  24. { Include load driver function }
  25. {$I loaddrv.pas  }
  26.  
  27.  
  28. var
  29.     dummy : integer;
  30.  
  31.  
  32. { ------------------------------------------------------------------------ }
  33. {  @@ Usage                                                                }
  34. {                                                                          }
  35. {   function GetFileHandle (szFilename: String;                            }
  36. {                           var Error: Boolean) : integer                  }
  37. {                                                                          }
  38. {   DESCRIPTION:                                                           }
  39. {       Get the handle of a file with the filename specified.              }
  40. {                                                                          }
  41. {   ENTRY:                                                                 }
  42. {       szFilename :- filename to create                                   }
  43. {       Error :- Error flag                                                }
  44. {                                                                          }
  45. {   EXIT:                                                                  }
  46. {       File handle. Error flag set to True if error occurs.               }
  47. {                                                                          }
  48. { ------------------------------------------------------------------------ }
  49.  
  50. function GetFileHandle (szFilename: String; var Error: Boolean) : integer;
  51. var
  52.     Regs : Registers;
  53.  
  54. begin
  55.     szFilename := szFilename + #0;
  56.     FillChar( Regs, SizeOf(Regs), 0 );
  57.     With Regs Do
  58.         begin
  59.             AX := $3d00;
  60.             DS := Seg(szFilename);
  61.             DX := Ofs(szFilename)+1;
  62.         end;
  63.  
  64.     intr($21,Regs);
  65.  
  66.     if (Lo(Regs.Flags) And $01) > 0  then begin
  67.         Error := True;
  68.         GetFileHandle := 0;
  69.     end
  70.     else begin
  71.         GetFileHandle := Regs.AX;
  72.         Error := False;
  73.     end;
  74. end;
  75.  
  76.  
  77. { ------------------------------------------------------------------------ }
  78. {  @@ Usage                                                                }
  79. {                                                                          }
  80. {   procedure CloseFileHandle (Handle: integer)                            }
  81. {                                                                          }
  82. {   DESCRIPTION:                                                           }
  83. {       Close a file with file handle specified.                           }
  84. {                                                                          }
  85. {   ENTRY:                                                                 }
  86. {       Handle :- handle of file to be closed.                             }
  87. {                                                                          }
  88. {   EXIT:                                                                  }
  89. {       None.                                                              }
  90. {                                                                          }
  91. { ------------------------------------------------------------------------ }
  92.  
  93. procedure CloseFileHandle (Handle: integer);
  94. var
  95.     Regs : Registers;
  96.  
  97. begin
  98.     FillChar( Regs, SizeOf(Regs), 0 );
  99.     With Regs Do
  100.         begin
  101.             AX := $3e00;
  102.             BX := Handle;
  103.         end;
  104.  
  105.     intr($21,Regs);
  106.  
  107. end;
  108.  
  109.  
  110. { ------------------------------------------------------------------------ }
  111. {  @@ Usage                                                                }
  112. {                                                                          }
  113. {   procedure ShowError                                                    }
  114. {                                                                          }
  115. {   DESCRIPTION:                                                           }
  116. {       Display error occurred during the process of voice I/O.            }
  117. {                                                                          }
  118. {   ENTRY:                                                                 }
  119. {       None.                                                              }
  120. {                                                                          }
  121. {   EXIT:                                                                  }
  122. {       None.                                                              }
  123. {                                                                          }
  124. { ------------------------------------------------------------------------ }
  125.  
  126. procedure ShowError;
  127. var
  128.     Err : integer;
  129.  
  130. begin
  131.  
  132.     Err := ctvd_drv_error;
  133.  
  134.     writeln('Driver error = ',Err);
  135.  
  136.     Err := ctvd_ext_error;
  137.     if (Err <> 0) then
  138.         writeln('DOS error = ',Err);
  139.  
  140. end;
  141.  
  142.  
  143. { ------------------------------------------------------------------------ }
  144. {  @@ Usage                                                                }
  145. {                                                                          }
  146. {   function OutputVoice (Handle : integer) : Boolean                      }
  147. {                                                                          }
  148. {   DESCRIPTION:                                                           }
  149. {       Output voice with the file handle specified.                       }
  150. {                                                                          }
  151. {   ENTRY:                                                                 }
  152. {       Handle : handle of a file to be outputted.                         }
  153. {                                                                          }
  154. {   EXIT:                                                                  }
  155. {       True if successful, else return False.                             }
  156. {                                                                          }
  157. { ------------------------------------------------------------------------ }
  158.  
  159. function OutputVoice (Handle : integer) : Boolean;
  160. begin
  161.  
  162.     OutputVoice := True;
  163.     ctvd_speaker(1);
  164.  
  165.     if ctvd_output(Handle) <> 0 then begin
  166.         OutputVoice := False;
  167.         ShowError;
  168.     end;
  169.  
  170. end;
  171.  
  172.  
  173. { ------------------------------------------------------------------------ }
  174. {  @@ Usage                                                                }
  175. {                                                                          }
  176. {   procedure WaitEffectEnd                                                }
  177. {                                                                          }
  178. {   DESCRIPTION:                                                           }
  179. {       Control the Fading and Panning effect of the digitized sound.      }
  180. {                                                                          }
  181. {   ENTRY:                                                                 }
  182. {       None                                                               }
  183. {                                                                          }
  184. {   EXIT:                                                                  }
  185. {       None                                                               }
  186. {                                                                          }
  187. { ------------------------------------------------------------------------ }
  188.  
  189. procedure WaitEffectEnd;
  190. const
  191.     ESC     = 27;
  192.     up_P    = 80;
  193.     lo_p    = 112;
  194.     up_C    = 67;
  195.     lo_c    = 99;
  196.     EXT     = 256;
  197.  
  198. var
  199.     key : char;
  200.     keyval : integer;
  201.  
  202. begin
  203.  
  204.     repeat
  205.         { Stop effect if no voice process }
  206.         if _ct_voice_status = 0 then
  207.             dummy := ctadStopCtrl;
  208.  
  209.         if keyPressed then begin
  210.             key := ReadKey;
  211.             keyval := ord(key);
  212.  
  213.             if ((key = #0) and keyPressed) then begin
  214.                 key := ReadKey;
  215.                 keyval := ord(key)+EXT;
  216.             end;
  217.  
  218.             case (keyval) of
  219.                 ESC      :
  220.                     begin
  221.                         dummy := ctadStopCtrl;
  222.                         ctvd_stop;
  223.                     end;
  224.                 up_P,lo_p :
  225.                     begin
  226.                         dummy := ctadPauseCtrl;
  227.                         ctvd_pause;
  228.                     end;
  229.                 up_C,lo_c :
  230.                     begin
  231.                         dummy := ctadStartCtrl;
  232.                         ctvd_continue;
  233.                     end;
  234.             end;
  235.         end;
  236.     until not ( Boolean(_CTFadeStatus) or Boolean(_CTPanStatus) );
  237.  
  238. end;
  239.  
  240.  
  241. { ------------------------------------------------------------------------ }
  242. {  @@ Usage                                                                }
  243. {                                                                          }
  244. {   procedure SoundEffect                                                  }
  245. {                                                                          }
  246. {   DESCRIPTION:                                                           }
  247. {       Add sound effect on the playback digitized sound.                  }
  248. {                                                                          }
  249. {   ENTRY:                                                                 }
  250. {       None                                                               }
  251. {                                                                          }
  252. {   EXIT:                                                                  }
  253. {       None                                                               }
  254. {                                                                          }
  255. { ------------------------------------------------------------------------ }
  256.  
  257. procedure SoundEffect;
  258. const
  259.     VOC_VOL     = 1;
  260.  
  261. var
  262.     wPrevVol : word;
  263.  
  264. begin
  265.  
  266.     ctadInit;
  267.  
  268.     { preserve the previous voice volume settings }
  269.     wPrevVol := ctadGetVolume( VOC_VOL ) ;
  270.  
  271.     { set voice left/right volume to 0 }
  272.     dummy := ctadSetVolume( VOC_VOL, 0 ) ;
  273.  
  274.     { Setup voice volume fading in mode 0 }
  275.     dummy := ctadFade( VOC_VOL, $f0f0, 5000, 0, 0 ) ;
  276.     dummy := ctadStartCtrl;
  277.     WaitEffectEnd;
  278.  
  279.  
  280.     { Setup digitized sound for panning in mode 1  }
  281.     { repeat for 5 counts                          }
  282.     dummy := ctadPan( VOC_VOL, 0, 255, 600, 1, 5 ) ;
  283.     dummy := ctadStartCtrl;
  284.     WaitEffectEnd;
  285.  
  286.  
  287.     { set voice left/right volume to 0xf0f0 }
  288.     dummy := ctadSetVolume( VOC_VOL, $f0f0 ) ;
  289.  
  290.     { Setup voice volume fading in mode 0 }
  291.     dummy := ctadFade( VOC_VOL, 0, 5000, 0, 0 ) ;
  292.     dummy := ctadStartCtrl;
  293.     WaitEffectEnd;
  294.  
  295.  
  296.     { set voice left/right volume back to previous status }
  297.     dummy := ctadSetVolume( VOC_VOL, wPrevVol ) ;
  298.  
  299.     ctadTerminate;
  300.  
  301. end;
  302.  
  303.  
  304.  
  305. { ------------------------------------------------------------------------ }
  306.  
  307. var
  308.     lpDoubleBuf: pointer;
  309.     hHandle : integer;
  310.     Err : Boolean;
  311.  
  312. { main function }
  313. begin  { program body }
  314.  
  315.     if GetEnvSetting = 0 then begin
  316.  
  317.         if boolean( sbc_check_card and $0004 ) then begin
  318.  
  319.             if boolean(sbc_test_int) then begin
  320.  
  321.                 if sbc_test_dma >= 0 then begin
  322.  
  323.                     _ctvdsk_drv := LoadDriver('CTVDSK.DRV');
  324.                     _CTAuxDrv := LoadDriver('AUXDRV.DRV');
  325.  
  326.                     if (_ctvdsk_drv <> nil) and (_CTAuxDrv <> nil) then begin
  327.  
  328.                         { Allocate memory for Disk Double Buffer. }
  329.                         { Note the the program has to allocate 16 }
  330.                         { bytes more for paragraph adjust.        }
  331.  
  332.                         GetMem(lpDoubleBuf,61456);
  333.                         ctvd_buffer_addx(lpDoubleBuf,15);
  334.  
  335.                         if ctvd_init(15) = 0 then begin
  336.  
  337.                             hHandle := GetFileHandle('DEMO1.VOC',Err);
  338.  
  339.                             if not Err then begin
  340.  
  341.                                 if OutputVoice(hHandle) then
  342.                                     SoundEffect;
  343.  
  344.                                 CloseFileHandle(hHandle);
  345.                             end
  346.                             else
  347.                                 writeln('Open DEMO1.VOC error ...');
  348.  
  349.                             ctvd_terminate;
  350.                         end
  351.                         else
  352.                             ShowError;
  353.                     end;
  354.                 end
  355.                 else
  356.                     writeln('Error on DMA channel.');
  357.             end
  358.             else
  359.                 writeln('Error on interrupt.');
  360.         end
  361.         else
  362.             writeln('Sound Blaster card not found or wrong I/O setting.');
  363.     end
  364.     else
  365.         writeln('BLASTER environment variable not set or incomplete or invalid.');
  366.  
  367. end.
  368.