www.pudn.com > DelphiX_for7.zip > DXWaveEdit.pas


unit DXWaveEdit; 
 
interface 
 
uses 
  Windows, SysUtils, Classes, Forms, Dialogs, Controls, StdCtrls, ExtCtrls, 
  Buttons, ComCtrls, DXSounds, Wave, Graphics; 
 
type 
 
  {  TDelphiXWaveEditForm  } 
 
  TDelphiXWaveEditForm = class(TForm) 
    Bevel2: TBevel; 
    OKButton: TButton; 
    CancelButton: TButton; 
    SaveDialog: TSaveDialog; 
    OpenDialog: TOpenDialog; 
    PlayImage: TImage; 
    StopImage: TImage; 
    Timer: TTimer; 
    DXSound: TDXSound; 
    ClearButton: TButton; 
    SaveButton: TButton; 
    LoadButton: TButton; 
    Panel1: TPanel; 
    TrackBar: TTrackBar; 
    TestButton: TSpeedButton; 
    LengthLabel: TLabel; 
    FrequencyLabel: TLabel; 
    TypeLabel: TLabel; 
    SizeLabel: TLabel; 
    LengthValueLabel: TLabel; 
    FrequencyValueLabel: TLabel; 
    TypeValueLabel: TLabel; 
    SizeValueLabel: TLabel; 
    procedure OKButtonClick(Sender: TObject); 
    procedure CancelButtonClick(Sender: TObject); 
    procedure LoadButtonClick(Sender: TObject); 
    procedure SaveButtonClick(Sender: TObject); 
    procedure ClearButtonClick(Sender: TObject); 
    procedure FormShow(Sender: TObject); 
    procedure DXSoundInitialize(Sender: TObject); 
    procedure DXSoundFinalize(Sender: TObject); 
    procedure TestButtonClick(Sender: TObject); 
    procedure TimerTimer(Sender: TObject); 
    procedure TrackBarChange(Sender: TObject); 
    procedure FormDestroy(Sender: TObject); 
  private 
    FChanged: Boolean; 
    FAudio: TAudioStream; 
    FPlaying: Boolean; 
    FWaveStream: TCustomWaveStream; 
    FWaveFileName: string; 
    FUpdating: Boolean; 
    procedure UpDateData; 
    procedure SetPlaying(Value: Boolean); 
    property Playing: Boolean read FPlaying write SetPlaying; 
  public 
    Wave: TWave; 
  end; 
 
var 
  DelphiXWaveEditForm: TDelphiXWaveEditForm; 
 
implementation 
 
uses DXConsts; 
 
{$R *.DFM} 
 
procedure TDelphiXWaveEditForm.FormDestroy(Sender: TObject); 
begin 
  FWaveStream.Free; 
end; 
 
procedure TDelphiXWaveEditForm.FormShow(Sender: TObject); 
begin 
  if Wave.Size>0 then 
    FWaveStream := TWaveObjectStream.Create(Wave); 
 
  TestButton.Glyph := PlayImage.Picture.Bitmap; 
  UpDateData; 
end; 
 
procedure TDelphiXWaveEditForm.OKButtonClick(Sender: TObject); 
begin 
  Playing := False; 
 
  if FChanged then 
  begin 
    if FWaveStream=nil then 
      Wave.Clear 
    else 
      Wave.LoadFromFile(FWaveFileName); 
 
    Tag := 1; 
  end; 
 
  Close; 
end; 
 
procedure TDelphiXWaveEditForm.CancelButtonClick(Sender: TObject); 
begin 
  Close; 
end; 
 
procedure TDelphiXWaveEditForm.ClearButtonClick(Sender: TObject); 
begin 
  Playing := False; 
 
  FChanged := True; 
  FWaveStream.Free; FWaveStream := nil; 
  UpdateData; 
end; 
 
procedure TDelphiXWaveEditForm.LoadButtonClick(Sender: TObject); 
var 
  Stream: TWaveFileStream; 
begin 
  if OpenDialog.Execute then 
  begin 
    Playing := False; 
 
    Stream := TWaveFileStream.Create(OpenDialog.FileName, fmOpenRead or fmShareDenyWrite); 
    Stream.Open(False); 
 
    FWaveStream.Free; FWaveStream := Stream; 
    FWaveFileName := OpenDialog.FileName; 
    FChanged := True; 
    UpdateData; 
  end; 
end; 
 
procedure TDelphiXWaveEditForm.SaveButtonClick(Sender: TObject); 
var 
  Dest, Source: TStream; 
begin 
  if SaveDialog.Execute then 
  begin 
    Playing := False; 
 
    if FChanged then 
    begin 
      if AnsiCompareFileName(FWaveFileName, SaveDialog.FileName)=0 then Exit; 
 
      Source := TFileStream.Create(FWaveFileName, fmOpenRead or fmShareDenyWrite); 
      try 
        Dest := TFileStream.Create(SaveDialog.FileName, fmCreate); 
        try 
          Dest.CopyFrom(Source, Source.Size); 
        finally 
          Dest.Free; 
        end; 
      finally 
        Source.Free; 
      end; 
    end else 
    begin 
      Wave.SaveToFile(SaveDialog.FileName); 
    end; 
  end; 
end; 
 
procedure TDelphiXWaveEditForm.SetPlaying(Value: Boolean); 
begin 
  if FPlaying<>Value then 
  begin 
    if FPlaying then 
    begin 
      Timer.Enabled := False; 
      FAudio.Stop; 
      TrackBar.Position := FAudio.Position; 
      DXSound.Finalize; 
    end; 
 
    if Value then 
    begin 
      DXSound.Initialize; 
      DXSound.Primary.SetFormat(FAudio.Format^); 
 
      FAudio.Position := TrackBar.Position; 
      FAudio.Play; 
 
      Timer.Enabled := True; 
 
      TestButton.Glyph := StopImage.Picture.Bitmap 
    end else 
      TestButton.Glyph := PlayImage.Picture.Bitmap; 
 
    FPlaying := Value; 
  end; 
end; 
 
procedure TDelphiXWaveEditForm.UpDateData; 
begin 
  TestButton.Enabled := False; 
  TrackBar.Enabled := False; 
  Timer.Enabled := False; 
 
  if FWaveStream<>nil then 
  begin 
    ClearButton.Enabled := True; 
    SaveButton.Enabled := True; 
 
    TrackBar.Position := 0; 
    TrackBar.Max := FWaveStream.Size; 
    TestButton.Enabled := True; 
    TrackBar.Enabled := True; 
 
    LengthValueLabel.Caption := Format(SWaveLength, [FWaveStream.Size/FWaveStream.Format^.nAvgBytesPerSec]); 
 
    FrequencyValueLabel.Caption := Format(SWaveFrequency, [FWaveStream.Format^.nSamplesPerSec]); 
 
    TypeValueLabel.Caption := Format(SWaveBitCount, [FWaveStream.Format^.wBitsPerSample]) + ' '; 
 
    case FWaveStream.Format^.nChannels of 
      1: TypeValueLabel.Caption := TypeValueLabel.Caption + SWaveMono; 
      2: TypeValueLabel.Caption := TypeValueLabel.Caption + SWaveStereo; 
    end; 
 
    SizeValueLabel.Caption := Format(SWaveSize, [FWaveStream.Size]); 
  end else 
  begin 
    LengthValueLabel.Caption := Format(SWaveLength, [0.0]); 
    FrequencyValueLabel.Caption := Format(SWaveFrequency, [0]); 
    TypeValueLabel.Caption := Format(SWaveBitCount, [0]) + ' ' + SWaveMono; 
    SizeValueLabel.Caption := Format(SWaveSize, [0]); 
 
    ClearButton.Enabled := False; 
    SaveButton.Enabled := False; 
    TrackBar.Position := 0; 
  end; 
end; 
 
procedure TDelphiXWaveEditForm.DXSoundInitialize(Sender: TObject); 
begin 
  FAudio := TAudioStream.Create(DXSound.DSound); 
  FAudio.WaveStream := FWaveStream; 
  FAudio.BufferLength := 200; 
end; 
 
procedure TDelphiXWaveEditForm.DXSoundFinalize(Sender: TObject); 
begin 
  FAudio.Free; FAudio := nil; 
end; 
 
procedure TDelphiXWaveEditForm.TestButtonClick(Sender: TObject); 
begin 
  Playing := not Playing; 
end; 
 
procedure TDelphiXWaveEditForm.TimerTimer(Sender: TObject); 
begin 
  FAudio.Update; 
  if FAudio.Playing then 
  begin 
    FUpdating := True; 
    try 
      TrackBar.Position := FAudio.Position; 
    finally 
      FUpdating := False; 
    end; 
  end else 
  begin 
    Playing := False; 
    TrackBar.Position := 0; 
  end; 
end; 
 
procedure TDelphiXWaveEditForm.TrackBarChange(Sender: TObject); 
begin                        
  if (FAudio<>nil) and (not FUpdating) then 
    FAudio.Position := TrackBar.Position; 
end; 
 
 
end.