Subversion Repositories spacemission

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. unit DXWaveEdit;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, SysUtils, Classes, Forms, Dialogs, Controls, StdCtrls, ExtCtrls,
  7.   Buttons, ComCtrls, DXSounds, Wave, Graphics;
  8.  
  9. type
  10.  
  11.   {  TDelphiXWaveEditForm  }
  12.  
  13.   TDelphiXWaveEditForm = class(TForm)
  14.     Bevel2: TBevel;
  15.     OKButton: TButton;
  16.     CancelButton: TButton;
  17.     SaveDialog: TSaveDialog;
  18.     OpenDialog: TOpenDialog;
  19.     PlayImage: TImage;
  20.     StopImage: TImage;
  21.     Timer: TTimer;
  22.     DXSound: TDXSound;
  23.     ClearButton: TButton;
  24.     SaveButton: TButton;
  25.     LoadButton: TButton;
  26.     Panel1: TPanel;
  27.     TrackBar: TTrackBar;
  28.     TestButton: TSpeedButton;
  29.     LengthLabel: TLabel;
  30.     FrequencyLabel: TLabel;
  31.     TypeLabel: TLabel;
  32.     SizeLabel: TLabel;
  33.     LengthValueLabel: TLabel;
  34.     FrequencyValueLabel: TLabel;
  35.     TypeValueLabel: TLabel;
  36.     SizeValueLabel: TLabel;
  37.     procedure OKButtonClick(Sender: TObject);
  38.     procedure CancelButtonClick(Sender: TObject);
  39.     procedure LoadButtonClick(Sender: TObject);
  40.     procedure SaveButtonClick(Sender: TObject);
  41.     procedure ClearButtonClick(Sender: TObject);
  42.     procedure FormShow(Sender: TObject);
  43.     procedure DXSoundInitialize(Sender: TObject);
  44.     procedure DXSoundFinalize(Sender: TObject);
  45.     procedure TestButtonClick(Sender: TObject);
  46.     procedure TimerTimer(Sender: TObject);
  47.     procedure TrackBarChange(Sender: TObject);
  48.     procedure FormDestroy(Sender: TObject);
  49.   private
  50.     FChanged: Boolean;
  51.     FAudio: TAudioStream;
  52.     FPlaying: Boolean;
  53.     FWaveStream: TCustomWaveStream;
  54.     FWaveFileName: string;
  55.     FUpdating: Boolean;
  56.     procedure UpDateData;
  57.     procedure SetPlaying(Value: Boolean);
  58.     property Playing: Boolean read FPlaying write SetPlaying;
  59.   public
  60.     Wave: TWave;
  61.   end;
  62.  
  63. var
  64.   DelphiXWaveEditForm: TDelphiXWaveEditForm;
  65.  
  66. implementation
  67.  
  68. uses DXConsts;
  69.  
  70. {$R *.DFM}
  71.  
  72. procedure TDelphiXWaveEditForm.FormDestroy(Sender: TObject);
  73. begin
  74.   FWaveStream.Free;
  75. end;
  76.  
  77. procedure TDelphiXWaveEditForm.FormShow(Sender: TObject);
  78. begin
  79.   if Wave.Size>0 then
  80.     FWaveStream := TWaveObjectStream.Create(Wave);
  81.  
  82.   TestButton.Glyph := PlayImage.Picture.Bitmap;
  83.   UpDateData;
  84. end;
  85.  
  86. procedure TDelphiXWaveEditForm.OKButtonClick(Sender: TObject);
  87. begin
  88.   Playing := False;
  89.  
  90.   if FChanged then
  91.   begin
  92.     if FWaveStream=nil then
  93.       Wave.Clear
  94.     else
  95.       Wave.LoadFromFile(FWaveFileName);
  96.  
  97.     Tag := 1;
  98.   end;
  99.  
  100.   Close;
  101. end;
  102.  
  103. procedure TDelphiXWaveEditForm.CancelButtonClick(Sender: TObject);
  104. begin
  105.   Close;
  106. end;
  107.  
  108. procedure TDelphiXWaveEditForm.ClearButtonClick(Sender: TObject);
  109. begin
  110.   Playing := False;
  111.  
  112.   FChanged := True;
  113.   FWaveStream.Free; FWaveStream := nil;
  114.   UpdateData;
  115. end;
  116.  
  117. procedure TDelphiXWaveEditForm.LoadButtonClick(Sender: TObject);
  118. var
  119.   Stream: TWaveFileStream;
  120. begin
  121.   if OpenDialog.Execute then
  122.   begin
  123.     Playing := False;
  124.  
  125.     Stream := TWaveFileStream.Create(OpenDialog.FileName, fmOpenRead or fmShareDenyWrite);
  126.     Stream.Open(False);
  127.  
  128.     FWaveStream.Free; FWaveStream := Stream;
  129.     FWaveFileName := OpenDialog.FileName;
  130.     FChanged := True;
  131.     UpdateData;
  132.   end;
  133. end;
  134.  
  135. procedure TDelphiXWaveEditForm.SaveButtonClick(Sender: TObject);
  136. var
  137.   Dest, Source: TStream;
  138. begin
  139.   if SaveDialog.Execute then
  140.   begin
  141.     Playing := False;
  142.  
  143.     if FChanged then
  144.     begin
  145.       if AnsiCompareFileName(FWaveFileName, SaveDialog.FileName)=0 then Exit;
  146.  
  147.       Source := TFileStream.Create(FWaveFileName, fmOpenRead or fmShareDenyWrite);
  148.       try
  149.         Dest := TFileStream.Create(SaveDialog.FileName, fmCreate);
  150.         try
  151.           Dest.CopyFrom(Source, Source.Size);
  152.         finally
  153.           Dest.Free;
  154.         end;
  155.       finally
  156.         Source.Free;
  157.       end;
  158.     end else
  159.     begin
  160.       Wave.SaveToFile(SaveDialog.FileName);
  161.     end;
  162.   end;
  163. end;
  164.  
  165. procedure TDelphiXWaveEditForm.SetPlaying(Value: Boolean);
  166. begin
  167.   if FPlaying<>Value then
  168.   begin
  169.     if FPlaying then
  170.     begin
  171.       Timer.Enabled := False;
  172.       FAudio.Stop;
  173.       TrackBar.Position := FAudio.Position;
  174.       DXSound.Finalize;
  175.     end;
  176.  
  177.     if Value then
  178.     begin
  179.       DXSound.Initialize;
  180.       DXSound.Primary.SetFormat(FAudio.Format^);
  181.  
  182.       FAudio.Position := TrackBar.Position;
  183.       FAudio.Play;
  184.  
  185.       Timer.Enabled := True;
  186.  
  187.       TestButton.Glyph := StopImage.Picture.Bitmap
  188.     end else
  189.       TestButton.Glyph := PlayImage.Picture.Bitmap;
  190.  
  191.     FPlaying := Value;
  192.   end;
  193. end;
  194.  
  195. procedure TDelphiXWaveEditForm.UpDateData;
  196. begin
  197.   TestButton.Enabled := False;
  198.   TrackBar.Enabled := False;
  199.   Timer.Enabled := False;
  200.  
  201.   if FWaveStream<>nil then
  202.   begin
  203.     ClearButton.Enabled := True;
  204.     SaveButton.Enabled := True;
  205.  
  206.     TrackBar.Position := 0;
  207.     TrackBar.Max := FWaveStream.Size;
  208.     TestButton.Enabled := True;
  209.     TrackBar.Enabled := True;
  210.  
  211.     LengthValueLabel.Caption := Format(SWaveLength, [FWaveStream.Size/FWaveStream.Format^.nAvgBytesPerSec]);
  212.  
  213.     FrequencyValueLabel.Caption := Format(SWaveFrequency, [FWaveStream.Format^.nSamplesPerSec]);
  214.  
  215.     TypeValueLabel.Caption := Format(SWaveBitCount, [FWaveStream.Format^.wBitsPerSample]) + ' ';
  216.  
  217.     case FWaveStream.Format^.nChannels of
  218.       1: TypeValueLabel.Caption := TypeValueLabel.Caption + SWaveMono;
  219.       2: TypeValueLabel.Caption := TypeValueLabel.Caption + SWaveStereo;
  220.     end;
  221.  
  222.     SizeValueLabel.Caption := Format(SWaveSize, [FWaveStream.Size]);
  223.   end else
  224.   begin
  225.     LengthValueLabel.Caption := Format(SWaveLength, [0.0]);
  226.     FrequencyValueLabel.Caption := Format(SWaveFrequency, [0]);
  227.     TypeValueLabel.Caption := Format(SWaveBitCount, [0]) + ' ' + SWaveMono;
  228.     SizeValueLabel.Caption := Format(SWaveSize, [0]);
  229.  
  230.     ClearButton.Enabled := False;
  231.     SaveButton.Enabled := False;
  232.     TrackBar.Position := 0;
  233.   end;
  234. end;
  235.  
  236. procedure TDelphiXWaveEditForm.DXSoundInitialize(Sender: TObject);
  237. begin
  238.   FAudio := TAudioStream.Create(DXSound.DSound);
  239.   FAudio.WaveStream := FWaveStream;
  240.   FAudio.BufferLength := 200;
  241. end;
  242.  
  243. procedure TDelphiXWaveEditForm.DXSoundFinalize(Sender: TObject);
  244. begin
  245.   FAudio.Free; FAudio := nil;
  246. end;
  247.  
  248. procedure TDelphiXWaveEditForm.TestButtonClick(Sender: TObject);
  249. begin
  250.   Playing := not Playing;
  251. end;
  252.  
  253. procedure TDelphiXWaveEditForm.TimerTimer(Sender: TObject);
  254. begin
  255.   FAudio.Update;
  256.   if FAudio.Playing then
  257.   begin
  258.     FUpdating := True;
  259.     try
  260.       TrackBar.Position := FAudio.Position;
  261.     finally
  262.       FUpdating := False;
  263.     end;
  264.   end else
  265.   begin
  266.     Playing := False;
  267.     TrackBar.Position := 0;
  268.   end;
  269. end;
  270.  
  271. procedure TDelphiXWaveEditForm.TrackBarChange(Sender: TObject);
  272. begin                      
  273.   if (FAudio<>nil) and (not FUpdating) then
  274.     FAudio.Position := TrackBar.Position;
  275. end;
  276.  
  277.  
  278. end.
  279.