VrAudio.pas
上传用户:hbszzs
上传日期:2008-08-20
资源大小:628k
文件大小:6k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. {*****************************************************}
  2. {                                                     }
  3. {     Varian Component Workshop                       }
  4. {                                                     }
  5. {     Varian Software NL (c) 1996-2000                }
  6. {     All Rights Reserved                             }
  7. {                                                     }
  8. {*****************************************************}
  9. unit VrAudio;
  10. {$I VRLIB.INC}
  11. interface
  12. uses
  13.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  14.   VrControls;
  15. type
  16.   TVrAudioData = class(TPersistent)
  17.   private
  18.     FSize: Integer;
  19.     FData: Pointer;
  20.     procedure SetSize(Value: Integer);
  21.     procedure WriteStream(Stream: TStream; WriteSize: Boolean); virtual;
  22.     procedure LoadStream(Stream: TStream; ReadSize: Boolean); virtual;
  23.   protected
  24.     procedure DefineProperties(Filer: TFiler); override;
  25.   public
  26.     destructor Destroy; override;
  27.     procedure Assign(Source: TPersistent); override;
  28.     function Empty: Boolean;
  29.     procedure Clear; virtual;
  30.     procedure LoadFromStream(Stream: TStream); virtual;
  31.     procedure SaveToStream(Stream: TStream); virtual;
  32.     procedure LoadFromFile(const FileName: string); virtual;
  33.     procedure SaveToFile(const FileName: string); virtual;
  34.     property Size: Integer read FSize write SetSize;
  35.     property Data: Pointer read FData;
  36.   end;
  37.   TVrWaveOption = (vwoAsync, vwoNoDefault, vwoLoop, vwoNoStop, vwoNoWait);
  38.   TVrWaveOptions = set of TVrWaveOption;
  39.   TVrWave = class(TVrComponent)
  40.   private
  41.     FSound: TVrAudioData;
  42.     FFlags: Integer;
  43.     FOptions: TVrWaveOptions;
  44.     procedure SetSound(Value: TVrAudioData);
  45.     procedure SetOptions(Value: TVrWaveOptions);
  46.   protected
  47.     procedure UpdatePlayOptions;
  48.   public
  49.     constructor Create(AOwner: TComponent); override;
  50.     destructor Destroy; override;
  51.     procedure Play;
  52.     procedure Stop;
  53.   published
  54.     property Sound: TVrAudioData read FSound write SetSound;
  55.     property Options: TVrWaveOptions read FOptions write SetOptions default [vwoASync, vwoNoDefault];
  56.   end;
  57. implementation
  58. uses
  59.   MMSystem;
  60. const
  61.   AudioId = $99200;
  62.   ufWavePlay: array[TVrWaveOption] of Integer =
  63.     (SND_ASYNC, SND_NODEFAULT, SND_LOOP, SND_NOSTOP, SND_NOWAIT);
  64. { TVrWave }
  65. constructor TVrWave.Create(AOwner: TComponent);
  66. begin
  67.   inherited Create(AOwner);
  68.   FSound := TVrAudioData.Create;
  69.   FOptions := [vwoASync, vwoNoDefault];
  70.   UpdatePlayOptions;
  71. end;
  72. destructor TVrWave.Destroy;
  73. begin
  74.   FSound.Free;
  75.   inherited Destroy;
  76. end;
  77. procedure TVrWave.Play;
  78. var
  79.   OldCursor: TCursor;
  80. begin
  81.   if not Sound.Empty then
  82.   begin
  83.     OldCursor := Screen.Cursor;
  84.     try
  85.       Screen.Cursor := crHourGlass;
  86.       PlaySound(FSound.Data, 0, FFlags);
  87.     finally
  88.       Screen.Cursor := OldCursor;
  89.     end;
  90.   end;
  91. end;
  92. procedure TVrWave.Stop;
  93. begin
  94.   PlaySound(nil, 0, FFlags);
  95. end;
  96. procedure TVrWave.UpdatePlayOptions;
  97. var
  98.   I: TVrWaveOption;
  99. begin
  100.   FFlags := SND_MEMORY;
  101.   for I := Low(TVrWaveOption) to High(TVrWaveOption) do
  102.     if I in Options then FFlags := FFlags or ufWavePlay[I];
  103.   if not (vwoAsync in Options) then
  104.     FFlags := FFlags or SND_SYNC;
  105. end;
  106. procedure TVrWave.SetSound(Value: TVrAudioData);
  107. begin
  108.   FSound.Assign(Value);
  109. end;
  110. procedure TVrWave.SetOptions(Value: TVrWaveOptions);
  111. begin
  112.   if FOptions <> Value then
  113.   begin
  114.     FOptions := Value;
  115.     UpdatePlayOptions;
  116.   end;
  117. end;
  118. { TVrRawData }
  119. destructor TVrAudioData.Destroy;
  120. begin
  121.   SetSize(0);
  122.   inherited Destroy;
  123. end;
  124. function TVrAudioData.Empty: Boolean;
  125. begin
  126.   Result := FSize = 0;
  127. end;
  128. procedure TVrAudioData.Clear;
  129. begin
  130.   SetSize(0);
  131. end;
  132. procedure TVrAudioData.SetSize(Value: Integer);
  133. begin
  134.   if FSize <> Value then
  135.   begin
  136.     Reallocmem(FData, Value);
  137.     FSize := Value;
  138.   end;
  139. end;
  140. procedure TVrAudioData.DefineProperties(Filer: TFiler);
  141. begin
  142.   Filer.DefineBinaryProperty('Audio', LoadFromStream, SaveToStream, not Empty);
  143. end;
  144. procedure TVrAudioData.Assign(Source: TPersistent);
  145. begin
  146.   if (Source is TVrAudioData) then
  147.   begin
  148.     SetSize(TVrAudioData(Source).Size);
  149.     Move(TVrAudioData(Source).Data^, FData^, Size);
  150.     Exit;
  151.   end;
  152.   inherited Assign(Source);
  153. end;
  154. procedure TVrAudioData.WriteStream(Stream: TStream; WriteSize: Boolean);
  155. var
  156.   Id: Integer;
  157. begin
  158.   if not Empty then
  159.   begin
  160.     if WriteSize then
  161.     begin
  162.       Id := AudioId;
  163.       Stream.Write(Id, Sizeof(Integer));
  164.       Stream.Write(FSize, Sizeof(Integer));
  165.     end;
  166.     Stream.Write(FData^, FSize);
  167.   end;
  168. end;
  169. procedure TVrAudioData.LoadStream(Stream: TStream; ReadSize: Boolean);
  170. var
  171.   Id: Integer;
  172.   NewSize: Integer;
  173. begin
  174.   NewSize := Stream.Size;
  175.   if ReadSize then
  176.   begin
  177.     Stream.Read(Id, Sizeof(Integer));
  178.     if AudioId <> Id then
  179.       raise Exception.Create('Unknown audio streaming format.');
  180.     Stream.Read(NewSize, Sizeof(Integer));
  181.   end;
  182.   SetSize(NewSize);
  183.   Stream.Read(FData^, FSize);
  184. end;
  185. procedure TVrAudioData.LoadFromStream(Stream: TStream);
  186. begin
  187.   LoadStream(Stream, True);
  188. end;
  189. procedure TVrAudioData.SaveToStream(Stream: TStream);
  190. begin
  191.   WriteStream(Stream, True);
  192. end;
  193. procedure TVrAudioData.LoadFromFile(const FileName: string);
  194. var
  195.   Stream: TFileStream;
  196. begin
  197.   Stream := TFileStream.Create(FileName, fmOpenRead);
  198.   try
  199.     LoadStream(Stream, false);
  200.   finally
  201.     Stream.Free;
  202.   end;
  203. end;
  204. procedure TVrAudioData.SaveToFile(const FileName: string);
  205. var
  206.   Stream: TFileStream;
  207. begin
  208.   Stream := TFileStream.Create(FileName, fmCreate);
  209.   try
  210.     WriteStream(Stream, false);
  211.   finally
  212.     Stream.Free;
  213.   end;
  214. end;
  215. end.