home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 1995 May / pcw-0595.bin / demos / databeck / wsounds / setup.dir / wswsrc.exe / WSW.PAS < prev    next >
Pascal/Delphi Source File  |  1992-12-02  |  21KB  |  833 lines

  1.  
  2. {
  3.                      Wicked Sounds for Windows
  4.              A Wave Database and Event Handler for Windows
  5.              by
  6.              Axel Stolz and Thorsten Petrowski
  7.              Copyright 1992 Abacus | Data Becker GmbH
  8.              
  9.              Internationalized version 1.0     TP 10/92
  10.  
  11.              American version 1.0   12/92
  12. }
  13.  
  14. program WickedSoundsForWindows;
  15.  
  16. uses DataObj,Strings, WinTypes, WinProcs, WObjects, WinDOS, Win31, ShellAPI,
  17.   MMSystem, CommDlg, BWCC,PlayDLG,RecDLG,ScanDLG,TakeDLG,BrwsDLG,PPlayDLG,
  18.   AboutDlg, WaveUtil, DiskDlg, SaveDlg, EventDlg, ScrnsDlg;
  19.  
  20. {!!!}
  21. {$M 16384, 8192}
  22. {$I-,S-}
  23. {$R TAPE}
  24. {$R WswHook}
  25.  
  26. { Resource IDs }
  27. CONST
  28.       DN_DeckDlg = 'TWaveDeckDlg';
  29.       ID_RECORD  = 300;
  30.       ID_REWIND  = 301;
  31.       ID_PLAY    = 302;
  32.       ID_PROGPLAY= 303;
  33.       ID_CUE     = 304;
  34.       ID_STOP    = 305;
  35.       ID_POWER   = 310;
  36.       ID_SWITCH  = 311;
  37.       ID_MESS    = 312;
  38.       ID_TRACK   = 313;
  39.       ID_NAME    = 314;
  40.       ID_Browse  = 315;
  41.       ID_About   = 316;
  42.       ID_Single  = 320;
  43.       ID_Prog    = 321;
  44.       ID_Database= 322;
  45.       ID_FirstOne= 323;
  46.       ID_Last    = 324;
  47.       ID_Repeat  = 327;
  48.       ID_Pause   = 325;
  49.       ID_Events  = 329;
  50.       ID_ScrnSve = 330;
  51.  
  52. const
  53.   DeviceID   : Word    = 0;
  54.   SinglePlay = 0;                        { Represents single file play }
  55.   PListPlay  = 1;                        { Represents playlist play }
  56.   DataPlay   = 2;                        { Represents database play }
  57.  
  58. Var IsRunning  : Boolean;
  59.     Paused     : Boolean;
  60.     TimerGoing : Boolean;
  61.     WaveRatio  : Integer;
  62.     WaveLength : Longint;
  63.  
  64. Type
  65.   TFilename = array[0..255] of Char;
  66.  
  67. type
  68.   PMCI_Open_Parms = ^TMCI_Open_Parms;
  69.   TMCI_Open_Parms = record
  70.     dwCallback: Longint;
  71.     wDeviceID: Word;
  72.     wReserved0: Word;
  73.     lpstrDeviceType: PChar;
  74.     lpstrElementName: PChar;
  75.     lpstrAlias: PChar;
  76.   end;
  77.  
  78. type
  79.   PMCI_Load_Parms = ^TMCI_Load_Parms;
  80.   TMCI_Load_Parms = record
  81.     dwCallback: Longint;
  82.     lpfilename: PChar;
  83.   end;
  84.  
  85. TYPE
  86.   PWaveDeckDlg = ^TWaveDeckDlg;
  87.   TWaveDeckDlg = object(TDlgWindow)
  88.     FileName: ARRAY[0..fsPathName] OF Char;
  89.     PlayMode : Integer;
  90.     Playing,isdd,Virgin,Rep,FirstOne,LastOne : BOOL;
  91.     ActTrack,ddcount,ddmax : Integer;
  92.     ddhandle : THandle;
  93.     RepeatOne : BOOL;
  94.     WDummyRec : WAVEDataType;
  95.     MciOpenParm  : TMCI_Open_Parms;
  96.     MciGenParm   : TMCI_Generic_Parms;
  97.     MciPlayParm  : TMCI_Play_Parms;
  98.     MciStatusParm: TMCI_Status_Parms;
  99.     MciSetParm   : TMCI_Set_Parms;
  100.     AppIcon      : HIcon;
  101.     PowerCheck   : PCheckBox;
  102.     constructor Init (AParent: PWindowsObject; ATitle: PChar);
  103.     procedure SetupWindow; virtual;
  104.     Procedure HandleProgSwitch;
  105.     Procedure HandleRepeat (Var Msg: TMessage); virtual ID_First + ID_Repeat;
  106.     Procedure HandleFirst (Var Msg: TMessage);virtual ID_First + ID_FirstOne;
  107.     Procedure HandleLast (Var Msg:TMEssage);virtual ID_First + ID_Last;
  108.     PROCEDURE HandlePlay(VAR Msg : TMessage);virtual ID_First + ID_Play;
  109.     PROCEDURE HandleStop(Var Msg : TMessage);virtual ID_First + ID_Stop;
  110.     PROCEDURE HandleRecord(VAr Msg: TMessage);virtual ID_First + ID_Record;
  111.     PROCEDURE HandleSearch(VAr Msg: TMessage);virtual ID_First + ID_Progplay;
  112.     PROCEDURE HandlePower (Var Msg: TMessage); virtual ID_First + ID_Power;
  113.     PROCEDURE HandleCue (Var Msg: TMessage); virtual ID_First + ID_Cue;
  114.     PROCEDURE HandleRewind (Var Msg: TMessage);virtual ID_First + ID_Rewind;
  115.     PROCEDURE HandleBrowse (Var Msg: TMessage);virtual ID_First + ID_Browse;
  116.     Procedure HandleSingle (Var Msg: TMessage);virtual ID_First + ID_Single;
  117.     Procedure HandleProg (Var Msg: TMessage);virtual ID_First + ID_Prog;
  118.     Procedure HandleData (Var Msg: TMessage);virtual ID_First + ID_DataBase;
  119.     PROCEDURE DisplayData (Data : WaveDataType);
  120.     procedure StopWave;          virtual;
  121.     procedure GetWindowClass(var AWndClass: TWndClass); virtual;
  122.     function  GetClassName: PChar; virtual;
  123.     procedure MciNotify(var Msg: TMessage);
  124.       virtual wm_First + mm_MCINotify;
  125.     procedure SoundPlay(ElementName: PChar);
  126.     procedure PlayStuff (ElementName:PCHar);
  127.     procedure SoundPause (Var Msg:TMessage); virtual id_first + id_pause;
  128.     procedure GetDeviceInfo;
  129.     procedure Play;
  130.     procedure WMDropFiles(var Msg: TMessage); virtual wm_first + wm_dropfiles;
  131.     Procedure DropNext;
  132.     Procedure HandleAbout (Var Msg : TMessage);virtual id_First + id_About;
  133.     Procedure HandleEvents (Var Msg : TMessage);virtual id_First + id_Events;
  134.     Procedure HandleScrnSve (Var Msg : TMessage);virtual id_First + id_ScrnSve;
  135.     Procedure CloseSound;
  136.     procedure WMQueryDragIcon(var Msg: TMessage);
  137.       virtual wm_First + wm_QueryDragIcon;
  138.   end;
  139.  
  140. { TWaveDeck is Main Object }           
  141.  
  142.   TWaveDeckApp = object(TApplication)
  143.     procedure InitMainWindow; virtual;
  144.     Destructor Done;virtual;
  145.   end;
  146.                         
  147. procedure TWaveDeckDlg.WMDropFiles(var Msg: TMessage);
  148. Var DropPt : TPoint;
  149. begin
  150.   ddhandle := Msg.WParam;
  151.   DragQueryPoint(ddhandle, DropPt);
  152.   ddmax := DragQueryFile(ddhandle, Word(-1), nil, 0);
  153.   ddcount := 0;
  154.   isdd := TRUE;
  155.   MciNotify (Msg);
  156. end;
  157.  
  158. PROCEDURE TWaveDeckDlg.DropNext;
  159. Var
  160.   DroppedName: TFilename;
  161.   DropPt     : TPoint;
  162. Begin
  163. IF ddcount < ddmax then
  164.  Begin
  165.   DragQueryFile (ddhandle,ddcount,DroppedName,SizeOf(DroppedName));
  166.   Inc (ddcount,1);
  167.   SoundPlay (DroppedName);
  168.  End
  169. Else
  170.   Begin
  171.   DragFinish (ddhandle);
  172.   isdd := FALSE;  
  173. End;
  174. End;
  175.  
  176. { TWaveDeckDlg }
  177. constructor TWaveDeckDlg.Init(AParent: PWindowsObject; ATitle: PChar);
  178. begin
  179.   {TDialog.Init(AParent, ATitle);}
  180.   TDlgWindow.Init(AParent, ATitle);
  181.   ActTrack := 0;
  182.   if WaveOutGetNumDevs = 0 then
  183.    begin
  184.     BWCCMessageBox(HWindow, 'No WAV playback device available', 'Error',mb_OK or mb_IconStop);
  185.     PostQuitMessage(0);
  186.    end;
  187.   PowerCheck := New(PCheckBox, InitResource(@self ,ID_Power));
  188.   FirstOne := FALSE;
  189.   LastOne := FALSE;
  190.   RepeatOne := FALSE;
  191.   PlayMode := SinglePlay;
  192.   Rep := FALSE;
  193.   virgin := TRUE;
  194.   DeviceID :=0 ;
  195.   isdd := FALSE;
  196.   Playing := FALSE;
  197.   EventsActive := GetProfileInt ('WSW_Captain_Hooks_Log','EventsActive',bf_Unchecked);
  198.   IF EventsActive = bf_Unchecked THEN HookInstall(FALSE)
  199.    ELse HookInstall(True);
  200. end;
  201.  
  202. { Handle Repeat/Switch }
  203. procedure TWaveDeckDlg.HandleRepeat (Var Msg: TMEssage);
  204. Begin
  205.  IF rep = FALSE Then
  206.   Begin
  207.    rep := TRUE;
  208.   End
  209.  Else
  210.   Begin
  211.    rep := FALSE;
  212.   End;
  213. End;
  214.  
  215. procedure TWaveDeckDlg.HandleSingle (Var Msg: TMessage);
  216. Begin
  217.  HandleStop(Msg);
  218.  CheckRadioButton (HWindow,ID_Single,ID_DataBase,ID_Single);
  219.  PlayMode := SinglePlay;
  220.  HandleProgSwitch;
  221. End;
  222.  
  223. procedure TWaveDeckDlg.HandleProg (Var Msg: TMessage);
  224. Begin
  225.  HandleStop(Msg);
  226.  CheckRadioButton (HWindow,ID_Single,ID_DataBase,ID_Prog);
  227.  PlayMode := PListPlay;
  228.  HandleProgSwitch;
  229. End;
  230.  
  231. procedure TWaveDeckDlg.HandleData (Var Msg: TMessage);
  232. Begin
  233.  HandleStop(Msg);
  234.  CheckRadioButton (HWindow,ID_Single,ID_DataBase,ID_DataBase);
  235.  PlayMode := DataPlay;
  236.  HandleProgSwitch;
  237. End;
  238.  
  239. { Get information about WAV playback device }
  240. procedure TWaveDeckDlg.GetDeviceInfo;
  241. var
  242.   WOutCaps: TWaveOutCaps;
  243. begin
  244.   if WaveOutGetDevCaps(DeviceID, @WOutCaps, SizeOf(WOutCaps)) <> 0 then
  245.     MessageBox(HWindow, 'GetDevCaps error', 'Error', mb_OK);
  246. end;
  247.  
  248. procedure TWaveDeckDlg.HandleStop (var Msg:TMessage);
  249. Begin
  250. IF paused = TRUE Then SoundPause (Msg);
  251.  LastOne := TRUE;
  252.     mciSendCommand(DeviceID, mci_Close,  mci_Wait, Longint(@MciGenParm));
  253. DeviceID := 0;
  254. IsRunning := FALSE;
  255. Playing := FALSE;
  256. END;
  257.  
  258. procedure TWaveDeckDlg.StopWave;
  259. begin
  260.  
  261.   if DeviceID <> 0 then
  262.   begin
  263.     mciSendCommand(DeviceID, mci_Stop,  mci_Wait, Longint(@MciGenParm));
  264.     mciSendCommand(DeviceID, mci_Close,  mci_Wait, Longint(@MciGenParm));
  265.     IsRunning := FALSE;
  266.   end;
  267. end;
  268.  
  269. { Stop waveform output and close device  }
  270.  
  271. procedure TWaveDeckDlg.CloseSound;
  272. Var c: Integer;
  273. begin
  274.   if DeviceID <> 0 then
  275.   begin
  276.     MciGenParm.dwCallback := 0;
  277.     for c:= 0 to 40 do
  278.      Begin
  279.      mciSendCommand(DeviceID, mci_Stop,  mci_Wait, Longint(@MciGenParm));
  280.     End;
  281.     mciSendCommand(DeviceID, mci_Close, mci_Wait, Longint(@MciGenParm));
  282.     IsRunning := FALSE;
  283.     DeviceID  := 0;
  284.   end;
  285. end;
  286.  
  287. { Receives MCI_Notify when MCI_Play is done }
  288.  
  289. procedure TWaveDeckDlg.MciNotify(var Msg: TMessage);
  290. begin
  291. IF isdd = TRUE Then
  292. Begin
  293.  StopWave;
  294.  DropNext;
  295. End
  296. Else
  297.  Begin
  298.  IF Not LastOne then
  299.   Begin
  300.    StopWave;
  301.    IF Not RepeatOne then HandleCue (Msg);
  302.    Play;
  303.   End
  304.  Else
  305.   Begin
  306.    StopWave;
  307.    IF (Playing = TRUE) AND (rep = TRUE) then
  308.     Begin
  309.      actTrack := 0;
  310.      LastOne := FALSE;
  311.      IsRunning := FALSE;
  312.      HandlePlay (Msg);
  313.     End
  314.    Else
  315.     Begin
  316.      IsRunning := FALSE;
  317.      RepeatOne := FALSE;
  318.     DragAcceptFiles(HWindow, True);
  319.     End
  320.  End;
  321. RepeatOne := FALSE;
  322. End
  323. end;
  324.  
  325. Procedure TWaveDeckDlg.HandleFirst (VAr Msg: TMessage);
  326. Begin
  327. ActTrack := 0;
  328. HandleRewind (Msg);
  329. End;
  330.  
  331. Procedure TWaveDeckDlg.HandleLast (Var Msg: TMessage);
  332. Begin
  333. If PlayMode = PListPlay then ActTrack := WavePlayColl^.Count-1;
  334. IF (PlayMode = DataPlay) or (PlayMode=SinglePlay) then ActTrack := WaveCollect^.Count-1;
  335. HandleCue (Msg);
  336. End;
  337.  
  338. { Stop output, or continue }
  339.  
  340. procedure TWaveDeckDlg.SoundPause (Var Msg: Tmessage);
  341. begin
  342. if isrunning then
  343.  Begin
  344.   if not Paused then
  345.   begin       { Pause }
  346.     MciGenParm.dwCallback := 0;
  347.     mciSendCommand(DeviceID, mci_Pause, mci_Wait, Longint(@MciGenParm));
  348.   end
  349.   else
  350.   begin       { Continue }
  351.     MciGenParm.dwCallback := 0;
  352.     mciSendCommand(DeviceID, mci_Resume, mci_Wait, Longint(@MciGenParm));
  353.   end;
  354.   Paused := not Paused;
  355.  end;
  356. end;
  357.  
  358. { Play sound }
  359. procedure TWaveDeckDlg.SoundPlay(ElementName: PChar);
  360. var
  361.   Res    : Longint;
  362.   ErrMsg : array [0..255] of Char;
  363. begin
  364.   if (not IsRunning) then
  365.   begin
  366.  
  367. { MCI APIs to open device and play .WAV file, using notification to close }
  368.     MciOpenParm.dwCallback := 0;
  369.     MciOpenParm.wDeviceID  := DeviceID;
  370.     MciOpenParm.wReserved0 := 0;
  371.     MciOpenParm.lpstrDeviceType  := nil;
  372.     MciOpenParm.lpstrElementName := ElementName;
  373.     MciOpenParm.lpstrAlias       := nil;
  374.  
  375.     if mciSendCommand(DeviceID, mci_Open, (mci_Wait or mci_Open_Element) ,
  376.     Longint(@MciOpenParm)) <> 0 then
  377.  
  378.     else
  379.     begin
  380.  
  381.       DeviceID := MciOpenParm.wDeviceID;
  382.  
  383. { The time format in this demo is in samples }
  384.       MciSetParm.dwCallback   := 0;
  385.       MciSetParm.dwTimeFormat := mci_Format_Samples;
  386.       if mciSendCommand(DeviceID, mci_Set, mci_Set_Time_Format,
  387.       Longint(@MciSetParm)) <> 0 then
  388.       begin
  389.     StopWave;
  390.     MessageBox(HWindow, 'SetTime error', 'Wicked Sounds for Windows', mb_OK)
  391.       end
  392.       else
  393.       begin
  394.     MciPlayParm.dwCallback := HWindow;
  395.     MciPlayParm.dwFrom     := 0;
  396.     MciPlayParm.dwTo       := 0;
  397.  
  398.     Res := mciSendCommand(DeviceID, mci_Play, mci_Notify,
  399.       Longint(@MciPlayParm));
  400.     if Res <> 0 then
  401.     begin
  402.       mciGetErrorString(Res, ErrMsg, SizeOf(ErrMsg));
  403.       MessageBox(HWindow, ErrMsg, 'Wicked Sounds for Windows', mb_OK or mb_IconStop);
  404.       StopWave;
  405.     end
  406.     else
  407.     begin
  408.  
  409.       IsRunning := True;
  410.  
  411.     end;
  412.       end;
  413.     end;
  414.   end
  415.   else
  416.   begin
  417.     StopWave;
  418.   end;
  419. end;
  420.  
  421. { Play }
  422.  
  423. procedure TWaveDeckDlg.PlayStuff(ElementName: PChar);
  424. var
  425.   Res    : Longint;
  426.   ErrMsg : array [0..255] of Char;
  427.   xplay   : TMCI_LOAD_PARMS;
  428. begin
  429.   if (not IsRunning) then
  430.   begin
  431. { MCI APIs open device and play .WAV file, using notification to close }
  432.     xplay.dwCallback := HWindow;
  433.     xplay.lpfilename := ElementName;
  434.  
  435.     if mciSendCommand(DeviceID, mci_Load, (mci_Wait or mci_Load_File),
  436.     Longint(@xplay)) <> 0 then
  437.     Begin
  438.     MessageBox(HWindow, 'Sound could not be played back', 'Wicked Sounds for Windows', mb_OK);
  439.     End
  440.     else
  441.     begin
  442.        if 1=2 then
  443.       begin
  444.     StopWave;
  445.     MessageBox(HWindow, 'SetTime error', 'Wicked Sounds for Windows', mb_OK)
  446.       end
  447.       else
  448.       begin
  449.     MciPlayParm.dwCallback := HWindow;
  450.     MciPlayParm.dwFrom     := 0;
  451.     MciPlayParm.dwTo       := 0;
  452.  
  453.     Res := mciSendCommand(DeviceID, mci_Play, mci_Notify,
  454.       Longint(@MciPlayParm));
  455.     if Res <> 0 then
  456.     begin
  457.       mciGetErrorString(Res, ErrMsg, SizeOf(ErrMsg));
  458.       MessageBox(HWindow, ErrMsg, 'Wicked Sounds for Windows', mb_OK or mb_IconStop);
  459.       StopWave;
  460.     end
  461.     else
  462.     begin
  463.  
  464.       IsRunning := True;
  465.  
  466.     end;
  467.       end;
  468.     end;
  469.   end
  470.   else
  471.   begin
  472.     StopWave;
  473.   end;
  474. end;
  475.  
  476. procedure TWaveDeckDlg.SetupWindow;
  477. Var MSg: TMessage;
  478. begin
  479. TDialog.SetupWindow;
  480. DragAcceptFiles(HWindow, True);
  481. StrCopy(WDummyRec.FileName,' - - - - ');
  482. StrCopy(WDummyRec.FileComment,'           Play single files');
  483. DisPlayData(WDummyRec);
  484. CheckRadioButton (HWindow,ID_Single,ID_DataBase,ID_Single);
  485. PowerCheck^.SetCheck(1);
  486. AppIcon := LoadIcon(Hinstance, 'LogoIcon2');
  487. end;
  488.  
  489. { Return window class name. This name corresponds to the class name
  490.   specified for the Convert dialog in the resource file. }
  491.  
  492. function TWaveDeckDlg.GetClassName: PChar;
  493. begin
  494.   GetClassName := 'TWaveDeckDlg';
  495. end;
  496.  
  497. PROCEDURE TWaveDeckDlg.GetWindowClass (VAR AWndClass : TWndClass);
  498. Var Msg: TMessage;
  499. BEGIN
  500.   TDlgWindow.GetWindowClass(AWndClass);
  501. END;
  502.  
  503. procedure TWaveDeckDlg.WMQueryDragIcon(var Msg: TMessage);
  504. begin
  505.   Msg.Result := AppIcon;
  506. end;
  507.  
  508. PROCEDURE TWaveDeckDlg.HandlePlay (Var MSg:TMessage);
  509. Begin
  510. IF Paused=TRUE then
  511.  Begin
  512.   SoundPause (Msg);
  513.  End
  514. Else
  515.  Begin
  516.  IF isrunning = FALSE THen
  517.   Begin
  518.   DragAcceptFiles(HWindow, False);
  519.   Dec(ActTrack,1);
  520.   LastOne := FALSE;
  521.   FirstOne := FALSE;
  522.   RepeatOne := FALSE;
  523.   MciNotify(Msg);
  524.   Playing := TRUE;
  525.   End;
  526.  End;
  527. End;
  528.  
  529. PROCEDURE TWaveDeckDlg.HandleAbout(VAR Msg : TMessage);
  530. VAR
  531.    LDialog : PAboutDlg;
  532. BEGIN
  533.    LDialog := New(PAboutDlg, Init(@self, DN_AboutDlg));
  534.    IF Application^.ExecDialog(LDialog) = ID_Ok THEN
  535.     BEGIN END;
  536.    END;
  537.  
  538. PROCEDURE TWaveDeckDlg.HandleEvents(VAR Msg : TMessage);
  539. VAR
  540.    LDialog : PEventDlg;
  541. BEGIN
  542.    LDialog := New(PEventDlg, Init(@self, DN_EventDlg));
  543.    IF Application^.ExecDialog(LDialog) = ID_Ok THEN
  544.     BEGIN END;
  545.    END;
  546.  
  547. PROCEDURE TWaveDeckDlg.HandleScrnSve(VAR Msg : TMessage);
  548. VAR
  549.    LDialog  : PScreenDlg;
  550. BEGIN
  551.    LDialog := New(PScreenDlg, Init(@self, DN_ScreenDlg));
  552.    IF Application^.ExecDialog(LDialog) = ID_Ok THEN
  553.     BEGIN END;
  554.    END;
  555.  
  556. { ---- Play on status SINGLEPLAY, PLISTPLAY DATABASEPLAY! ---- }
  557. PROCEDURE TWaveDeckDlg.Play;
  558. VAR
  559.    LDialog : PPlayDialog;
  560.    Puffer  : ARRAY[0..12] OF CHAR;
  561.    Chicken : WaveDataType;
  562.    TPDummy  : Array[0..137] OF CHAR;
  563.  
  564. procedure PlaySub(TempNr : Integer);
  565. VAR
  566.   TDummy : Array[0..255] OF Char;
  567.   MDummy : Array[0..80] OF Char;
  568.   DDummy : Array[0..2] OF Char;
  569.   Sub1,Sub2,Typ,Message : Integer;
  570.  
  571.   DDialog : PDiskDlg;
  572.   TestDlg : Integer;
  573.  
  574. BEGIN
  575.    Message := idOK;
  576.    IF PlayMode = DataPlay then
  577.     Begin
  578.      PWaveData(WaveCollect^.At(TempNr))^.GetData(WaveDummy);
  579.     End;
  580.    IF PlayMode = PListPlay then
  581.     Begin
  582.      PWaveData(WavePlayColl^.At(TempNr))^.GetData(WaveDummy);
  583.     End;
  584.  
  585. {--------------------------------------------------------------------}
  586. {----------------------- Play dialog --------------------------------}
  587.  
  588.    DPlayObj := New(PDiskPlay,Init(@self));
  589.    DPlayObj^.DiskPlayDlg(WaveDummy, Message);
  590.    DPlayObj^.Done;
  591.  
  592.    DiskDummy[0] := WaveDummy.DiskDrive;
  593.    DiskDummy[1] := #0;
  594.    StrCat(DiskDummy, ':');
  595.    StrCat(DiskDummy,WaveDummy.PathName);
  596.    StrCat(DiskDummy,WaveDummy.FileName);
  597.  
  598.    IF (Message = idOK) THEN BEGIN
  599.  
  600.       SoundPlay(DiskDummy);
  601.       END;
  602.    END;
  603.  
  604. BEGIN
  605.  
  606.    IF PlayMode = SinglePlay Then
  607.     Begin
  608.      StrCopy(TPDummy, RootDir);
  609.      StrCat(TPDummy, '*.WAV');
  610.      LDialog := New(PPlayDialog, Init(@self, dn_PlayDlg,TPDummy));
  611.      IF Application^.ExecDialog(LDialog) = ID_Ok THEN
  612.       BEGIN END;
  613.      END
  614.     Else
  615.      Begin
  616.       IF PlayMode = PListPlay Then
  617.        Begin
  618.        IF WavePlayColl^.Count >0 THEN PlaySub(ActTrack);
  619.        End;
  620.      End;
  621.      IF PlayMode = DataPlay Then
  622.       Begin
  623.        If WaveCollect^.Count > 0 Then PlaySub (ActTrack);
  624.       End;
  625. End;
  626.  
  627. PROCEDURE TWaveDeckDlg.HandleCue (Var Msg:TMessage);
  628. Begin
  629. IF Not Paused THen
  630.  Begin
  631. lastOne := FALSE;
  632. RepeatOne := TRUE;
  633.  
  634. If PlayMode = PListPlay Then
  635.  Begin
  636.   IF WavePlayColl^.Count > 0 then
  637.    Begin
  638.     Inc(ActTrack,1);
  639.     IF ActTrack >= (WavePlayColl^.Count)-1 then
  640.      Begin
  641.       LastOne := TRUE;
  642.       ActTrack := WavePlayColl^.Count - 1;
  643.      End;
  644.       PWaveData(WavePlayColl^.At (ActTrack))^.GetData(WDummyRec);
  645.       DisplayData (WDummyRec);
  646.     End
  647.    End
  648. Else
  649.  IF PlayMode = DataPlay THEN
  650.  Begin
  651.   IF WaveCollect^.Count > 0 then
  652.    Begin
  653.     Inc(ActTrack,1);
  654.     IF ActTrack >= (WaveCollect^.Count)-1 then
  655.      Begin
  656.       LastOne := TRUE;
  657.       ActTrack := (WaveCollect^.Count)-1;
  658.      End;
  659.        PWaveData(WaveCollect^.At (ActTrack))^.GetData(WDummyRec);
  660.        DisplayData (WDummyRec);
  661.     End
  662.    End;
  663. StopWave;
  664. End;
  665. END;
  666.  
  667. PROCEDURE TWaveDeckDlg.HandleRewind (Var Msg: TMessage);
  668. Begin
  669. IF Not Paused then
  670.  Begin
  671.  FirstOne := FALSE;
  672.  LastOne := FALSE;
  673.  RepeatOne := TRUE;
  674. IF PlayMode = PListPlay Then
  675.  Begin
  676.   IF WavePlayColl^.Count > 0 then
  677.    Begin
  678.     Dec(ActTrack,1);
  679.     IF ActTrack < 0 then
  680.      Begin
  681.       ActTrack:=0;
  682.       FirstOne := TRUE;
  683.      End;
  684.        PWaveData(WavePlayColl^.At (ActTrack))^.GetData(WDummyRec);
  685.        DisplayData (WDummyRec);
  686.    End
  687.   End
  688. Else
  689.  IF PlayMode = DataPlay THEN
  690.  Begin
  691.   IF WaveCollect^.Count > 0 then
  692.    Begin
  693.     Dec(ActTrack,1);
  694.     IF ActTrack < 0 then
  695.      Begin
  696.       ActTrack:=0;
  697.       FirstOne := TRUE;
  698.      End;
  699.        PWaveData(WaveCollect^.At (ActTrack))^.GetData(WDummyRec);
  700.        DisplayData (WDummyRec);
  701.   End;
  702.  END;
  703. StopWave;
  704. End;
  705. End;
  706.  
  707. PROCEDURE TWaveDeckDlg.HandleProgSwitch;
  708. Begin
  709. ActTrack := 0;
  710.   IF PlayMode = DataPlay then
  711.    Begin
  712.     IF WaveCollect^.Count > 0 then
  713.      Begin
  714.       PWaveData(WaveCollect^.At (ActTrack))^.GetData(WDummyRec);
  715.       DisplayData (WDummyRec);
  716.      End;
  717.    End
  718.   Else
  719.    IF PlayMode = SinglePlay THEN BEGIN
  720.       StrCopy(WDummyRec.FileName,' - - - - ');
  721.       StrCopy(WDummyRec.FileComment,'           Play single files');
  722.       DisPlayData(WDummyRec);
  723.       END
  724.   ELSE
  725.    Begin
  726.     IF WavePlayColl^.Count > 0 then
  727.      Begin
  728.       PWaveData(WavePlayColl^.At (ActTrack))^.GetData(WDummyRec);
  729.       DisplayData (WDummyRec);
  730.      End
  731.     ELSE BEGIN
  732.        StrCopy(WDummyRec.FileName,' - - - - ');
  733.        StrCopy(WDummyRec.FileComment,'       The playlist is empty.');
  734.        DisPlayData(WDummyRec);
  735.        END;
  736.    End;
  737.  
  738. End;
  739.  
  740.  
  741.  
  742. PROCEDURE TWaveDeckDlg.HandlePower (Var Msg: TMessage);
  743. Var
  744.    MDummy : Array[0..100] of Char;
  745.    Message : Integer;
  746.    MDialog : PSaveDlg;
  747. Begin
  748. CloseSound;
  749. IF DBChanged THEN BEGIN
  750.       StrCopy(MDummy, 'Changes made to database since last save.');
  751.       StrCat(MDummy,' Save changes now?');
  752.       Message := BWCCMessageBox(HWindow,MDummy, 'Wicked Sounds for Windows: Note', MB_OkCancel+mb_IconHand);
  753.       IF Message = idOK THEN BEGIN
  754.      MDialog := New(PSaveDlg, Init(@self, DN_SaveDlg,1));
  755.      IF Application^.ExecDialog(MDialog) = ID_Ok THEN BEGIN
  756.          END;
  757.      DBChanged := FALSE;
  758.      END;
  759.       END;
  760. TWaveDeckDlg.Done;
  761. End;
  762.  
  763. (* Display Data  *)
  764.  
  765. PROCEDURE TWaveDeckDlg.DisplayData (Data : WaveDataType);
  766. Var Out : Array[0..5] of char;
  767. Begin
  768.   Str((ActTrack+1):5,Out);
  769.   SetDlgItemText(HWindow, id_track,Out);
  770.   SetDlgItemText(HWindow, id_Name,Data.Filename);
  771.   SetDlgItemText(HWindow, id_Mess,Data.FileComment);
  772. End;
  773.  
  774. PROCEDURE TWaveDeckDlg.HandleRecord(VAR Msg : TMessage);
  775. VAR
  776.    LDialog : PScanDlg;
  777.    TkDialog : PTakeDlg;
  778.    Puffer  : ARRAY[0..12] OF CHAR;
  779. BEGIN
  780.    END;
  781.  
  782. PROCEDURE TWaveDeckDlg.HandleSearch(VAR Msg : TMessage);
  783. VAR
  784.    LDialog : PPPlayDlg;
  785.    Puffer  : ARRAY[0..12] OF CHAR;
  786. BEGIN
  787.    LDialog := New(PPPlayDlg, Init(@self, DN_PPlayDlg, WaveCollect));
  788.    IF Application^.ExecDialog(LDialog) = ID_Ok THEN
  789.     BEGIN
  790.      IF WavePlayColl^.Count >0 THEN BEGIN
  791.     IF PlayMode = PListPlay THEN BEGIN
  792.        ActTrack := 0;
  793.        PWaveData(WavePlayColl^.At (ActTrack))^.GetData(WDummyRec);
  794.        DisplayData (WDummyRec);
  795.        END;
  796.     end;
  797.     END;
  798.    END;
  799.  
  800. PROCEDURE TWaveDeckDlg.HandleBrowse(VAR Msg : TMessage);
  801. VAR
  802.    LDialog : PBrwsDlg;
  803.    Puffer  : ARRAY[0..12] OF CHAR;
  804. BEGIN
  805.     BEGIN
  806.       LDialog := New(PBrwsDlg, Init(@self, DN_BrwsDlg, WaveCollect));
  807.       IF Application^.ExecDialog(LDialog) = ID_Ok THEN
  808.        BEGIN END;
  809.       END;
  810.    END;
  811.  
  812. { TWaveDeckApp }
  813. procedure TWaveDeckApp.InitMainWindow;
  814. begin
  815.   MainWindow := New(PWaveDeckDlg, Init(NIL, DN_DeckDlg));
  816. end;
  817.  
  818. Destructor TWaveDeckApp.Done;
  819. VAR
  820.   f : File;
  821. BEGIN
  822.    TApplication.Done;
  823.    END;
  824.  
  825. var
  826.   WaveDeckApp: TWaveDeckApp;
  827.  
  828. begin
  829.   WaveDeckApp.Init('WaveDeck');
  830.   WaveDeckApp.Run;
  831.   WaveDeckApp.Done;
  832. end.
  833.