MMWPlay.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:16k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. {========================================================================}
  2. {=                (c) 1995-98 SwiftSoft Ronald Dittrich                 =}
  3. {========================================================================}
  4. {=                          All Rights Reserved                         =}
  5. {========================================================================}
  6. {=  D 01099 Dresden             = Fax.: +49(0)351-8037944               =}
  7. {=  Loewenstr.7a                = info@swiftsoft.de                     =}
  8. {========================================================================}
  9. {=  Actual versions on http://www.swiftsoft.de/index.html               =}
  10. {========================================================================}
  11. {=  This code is for reference purposes only and may not be copied or   =}
  12. {=  distributed in any format electronic or otherwise except one copy   =}
  13. {=  for backup purposes.                                                =}
  14. {=                                                                      =}
  15. {=  No Delphi Component Kit or Component individually or in a collection=}
  16. {=  subclassed or otherwise from the code in this unit, or associated   =}
  17. {=  .pas, .dfm, .dcu, .asm or .obj files may be sold or distributed     =}
  18. {=  without express permission from SwiftSoft.                          =}
  19. {=                                                                      =}
  20. {=  For more licence informations please refer to the associated        =}
  21. {=  HelpFile.                                                           =}
  22. {========================================================================}
  23. {=  $Date: 09.10.98 - 17:23:11 $                                        =}
  24. {========================================================================}
  25. unit MMWPlay;
  26. {$I COMPILER.INC}
  27. interface
  28. uses
  29. {$IFDEF WIN32}
  30.   Windows,
  31. {$ELSE}
  32.   WinTypes,
  33.   WinProcs,
  34. {$ENDIF}
  35.   SysUtils,
  36.   Classes,
  37.   Controls,
  38.   Dialogs,
  39.   MMSystem,
  40.   MMObj,
  41.   MMDSPobj,
  42.   MMRegs,
  43.   MMUtils,
  44.   MMWave,
  45.   MMACMCvt,
  46.   MMWavOut,
  47.   MMCstDlg,
  48.   MMADCvt;
  49. type
  50.     {-- TMMWavePlayer ---------------------------------------------------------}
  51.     TMMWavePlayer = class(TMMDSPComponent)
  52.     private
  53.        FStartPos   : Longint;
  54.        FStopPos    : Longint;
  55.        FSeeking    : Boolean;
  56.        FResetPos   : Boolean;
  57.        FAutoConvert: Boolean;
  58.        FOnStart    : TNotifyEvent;
  59.        FOnStop     : TNotifyEvent;
  60.        FOnPause    : TNotifyEvent;
  61.        FOnRestart  : TNotifyEvent;
  62.        FOnChange   : TNotifyEvent;
  63.        FOnData     : TMMBufferEvent;
  64.        procedure SetWave(aValue: TMMWave);
  65.        function  GetWave: TMMWave;
  66.        procedure SetNumBuffers(aValue: integer);
  67.        function  GetNumBuffers: integer;
  68.        procedure SetDeviceID(aValue: TMMDeviceID);
  69.        function  GetDeviceID: TMMDeviceID;
  70.        procedure SetProductName(aValue: string);
  71.        function  GetProductName: string;
  72.        procedure SetTimeFormat(aValue: TMMTimeFormats);
  73.        function  GetTimeFormat: TMMTimeFormats;
  74.        procedure SetCallBackMode(aValue: TMMCBMode);
  75.        function  GetCallBackMode: TMMCBMode;
  76.        procedure SetPosition(aValue: Longint);
  77.        function  GetPosition: Longint;
  78.        procedure SetLooping(aValue: Boolean);
  79.        function  GetLooping: Boolean;
  80.        procedure SetLoopCount(aValue: Word);
  81.        function  GetLoopCount: Word;
  82.        procedure SetFileName(aValue: TFileName);
  83.        function  GetFileName: TFileName;
  84.        function  GetState: TMMWaveOutState;
  85.        procedure SetAutoConvert(aValue: Boolean);
  86.        procedure DoChange(Sender: TObject);
  87.        procedure DoChanged(Sender: TObject);
  88.        procedure DoStart(Sender: TObject);
  89.        procedure DoStop(Sender: TObject);
  90.        procedure DoClose(Sender: TObject);
  91.        procedure DoPause(Sender: TObject);
  92.        procedure DoRestart(Sender: TObject);
  93.        procedure DoData(Sender: TObject; lpwh: PWaveHdr);
  94.     protected
  95.        FWaveFile    : TMMWaveFile;
  96.        FADPCMConvert: TMMADPCMConverter;
  97.        FPCMConvert  : TMMPCMConverter;
  98.        FWaveOut     : TMMWaveOut;
  99.        function  GetBufferSize: Longint; override;
  100.        procedure SetBufferSize(aValue: Longint); override;
  101.     public
  102.        constructor Create(aOwner: TComponent); override;
  103.        destructor  Destroy; override;
  104.        function  SelectFile: Boolean;
  105.        procedure LoadFromFile(const FileName: TFileName);
  106.        procedure Play;
  107.        procedure Stop;
  108.        procedure Pause;
  109.        procedure Restart;
  110.        property  FileName: TFileName read GetFileName write SetFileName stored False;
  111.        property  PWaveFormat;
  112.        property  State: TMMWaveOutState read GetState;
  113.        property  Position: Longint read GetPosition write SetPosition;
  114.     published
  115.        property OnStart: TNotifyEvent read FOnStart write FOnStart;
  116.        property OnStop: TNotifyEvent read FOnStop write FOnStop;
  117.        property OnPause: TNotifyEvent read FOnPause write FOnPause;
  118.        property OnRestart: TNotifyEvent read FOnRestart write FOnRestart;
  119.        property OnChange: TNotifyEvent read FOnChange write FOnChange;
  120.        property OnData: TMMBufferEvent read FOnData write FOnData;
  121.        property Output;
  122.        property Wave: TMMWave read GetWave write SetWave;
  123.        property BufferSize: Longint read GetBufferSize write SetBufferSize;
  124.        property NumBuffers: integer read GetNumBuffers write SetNumBuffers;
  125.        property DeviceID: TMMDeviceID read GetDeviceID write SetDeviceID;
  126.        property ProductName: string read GetProductName write SetProductName stored False;
  127.        property TimeFormat: TMMTimeFormats read GetTimeFormat write SetTimeFormat;
  128.        property CallBackMode: TMMCBMode read GetCallBackMode write SetCallBackMode;
  129.        property Looping: Boolean read GetLooping write SetLooping;
  130.        property LoopCount: Word read GetLoopCount write SetLoopCount;
  131.        property ResetPosition: Boolean read FResetPos write FResetPos default True;
  132.        property AutoConvert: Boolean read FAutoConvert write SetAutoConvert default True;
  133.     end;
  134. implementation
  135. {== MMWavePlayer ==============================================================}
  136. constructor TMMWavePlayer.Create(aOwner: TComponent);
  137. begin
  138.    inherited Create(aOwner);
  139.    FSeeking               := False;
  140.    FStartPos              := 0;
  141.    FResetPos              := True;
  142.    FAutoConvert           := True;
  143.    FWaveFile              := TMMWaveFile.Create(Self);
  144.    FWaveFile.OnChange     := DoChange;
  145.    FWaveFile.OnChanged    := DoChanged;
  146.    FADPCMConvert          := TMMADPCMConverter.Create(Self);
  147.    FADPCMConvert.Input    := FWaveFile;
  148.    FPCMConvert            := TMMPCMConverter.Create(Self);
  149.    FPCMConvert.Input      := FADPCMConvert;
  150.    FWaveOut               := TMMWaveOut.Create(Self);
  151.    FWaveOut.Input         := FPCMConvert;
  152.    FWaveOut.OnOpen        := DoStart;
  153.    FWaveOut.OnStop        := DoStop;
  154.    FWaveOut.OnClose       := DoClose;
  155.    FWaveOut.OnPause       := DoPause;
  156.    FWaveOut.OnRestart     := DoRestart;
  157.    FWaveOut.OnBufferReady := DoData;
  158.    FInputValid            := True;
  159.    FWaveOut.Output        := Self;
  160.    FInputValid            := False;
  161.    ErrorCode := ComponentRegistered(InitCode, Self, ClassName);
  162.    if (ErrorCode <> 0) then RegisterFailed(InitCode, Self , ClassName);
  163. end;
  164. {-- TMMWavePlayer -------------------------------------------------------------}
  165. destructor TMMWavePlayer.Destroy;
  166. begin
  167.    Stop;
  168.    FWaveFile.Free;
  169.    FADPCMConvert.Free;
  170.    FPCMConvert.Free;
  171.    FWaveOut.Free;
  172.    inherited Destroy;
  173. end;
  174. {-- TMMWavePlayer -------------------------------------------------------------}
  175. procedure TMMWavePlayer.SetWave(aValue: TMMWave);
  176. begin
  177.    FWaveFile.Wave := aValue;
  178. end;
  179. {-- TMMWavePlayer -------------------------------------------------------------}
  180. function TMMWavePlayer.GetWave: TMMWave;
  181. begin
  182.    Result := FWaveFile.Wave;
  183. end;
  184. {-- TMMWavePlayer -------------------------------------------------------------}
  185. function TMMWavePlayer.SelectFile: Boolean;
  186. begin
  187.    with TMMWaveOpenDialog.Create(nil) do
  188.    try
  189.       FileName := Self.FileName;
  190.       Result   := Execute;
  191.       if Result then
  192.          Self.FileName := FileName;
  193.    finally
  194.       Free;
  195.    end;
  196. end;
  197. {-- TMMWavePlayer -------------------------------------------------------------}
  198. procedure TMMWavePlayer.LoadFromFile(const FileName: TFileName);
  199. begin
  200.    SetFileName(FileName);
  201. end;
  202. {-- TMMWavePlayer -------------------------------------------------------------}
  203. procedure TMMWavePlayer.SetFileName(aValue: TFileName);
  204. begin
  205.    FWaveFile.Wave.FileName := aValue;
  206.    FADPCMConvert.Enabled := FAutoConvert and FADPCMConvert.CanConvert;
  207. end;
  208. {-- TMMWavePlayer -------------------------------------------------------------}
  209. function TMMWavePlayer.GetFileName: TFileName;
  210. begin
  211.    Result := FWaveFile.Wave.FileName;
  212. end;
  213. {-- TMMWavePlayer -------------------------------------------------------------}
  214. procedure TMMWavePlayer.SetBufferSize(aValue: Longint);
  215. begin
  216.    FWaveOut.BufferSize := aValue;
  217. end;
  218. {-- TMMWavePlayer -------------------------------------------------------------}
  219. function TMMWavePlayer.GetBufferSize: Longint;
  220. begin
  221.    Result := FWaveOut.BufferSize;
  222. end;
  223. {-- TMMWavePlayer -------------------------------------------------------------}
  224. procedure TMMWavePlayer.SetNumBuffers(aValue: integer);
  225. begin
  226.    FWaveOut.NumBuffers := aValue;
  227. end;
  228. {-- TMMWavePlayer -------------------------------------------------------------}
  229. function TMMWavePlayer.GetNumBuffers: integer;
  230. begin
  231.    Result := FWaveOut.NumBuffers;
  232. end;
  233. {-- TMMWavePlayer -------------------------------------------------------------}
  234. procedure TMMWavePlayer.SetDeviceID(aValue: TMMDeviceID);
  235. begin
  236.    FWaveOut.DeviceID := aValue;
  237. end;
  238. {-- TMMWavePlayer -------------------------------------------------------------}
  239. function TMMWavePlayer.GetDeviceID: TMMDeviceID;
  240. begin
  241.    Result := FWaveOut.DeviceID;
  242. end;
  243. {-- TMMWavePlayer -------------------------------------------------------------}
  244. procedure TMMWavePlayer.SetProductName(aValue: string);
  245. begin
  246.    FWaveOut.ProductName := aValue;
  247. end;
  248. {-- TMMWavePlayer -------------------------------------------------------------}
  249. function TMMWavePlayer.GetProductName: string;
  250. begin
  251.    Result := FWaveOut.ProductName;
  252. end;
  253. {-- TMMWavePlayer -------------------------------------------------------------}
  254. procedure TMMWavePlayer.SetTimeFormat(aValue: TMMTimeFormats);
  255. begin
  256.    FWaveOut.TimeFormat  := aValue;
  257.    FWaveFile.Wave.TimeFormat := aValue;
  258. end;
  259. {-- TMMWavePlayer -------------------------------------------------------------}
  260. function TMMWavePlayer.GetTimeFormat: TMMTimeFormats;
  261. begin
  262.    Result := FWaveOut.TimeFormat;
  263. end;
  264. {-- TMMWavePlayer -------------------------------------------------------------}
  265. procedure TMMWavePlayer.SetCallBackMode(aValue: TMMCBMode);
  266. begin
  267.    FWaveOut.CallBackMode := aValue;
  268. end;
  269. {-- TMMWavePlayer -------------------------------------------------------------}
  270. function TMMWavePlayer.GetCallBackMode: TMMCBMode;
  271. begin
  272.    Result := FWaveOut.CallBackMode;
  273. end;
  274. {-- TMMWavePlayer -------------------------------------------------------------}
  275. procedure TMMWavePlayer.SetLooping(aValue: Boolean);
  276. begin
  277.    FWaveOut.Looping := aValue;
  278. end;
  279. {-- TMMWavePlayer -------------------------------------------------------------}
  280. function TMMWavePlayer.GetLooping: Boolean;
  281. begin
  282.    Result := FWaveOut.Looping;
  283. end;
  284. {-- TMMWavePlayer -------------------------------------------------------------}
  285. procedure TMMWavePlayer.SetLoopCount(aValue: Word);
  286. begin
  287.    FWaveOut.LoopCount := aValue;
  288. end;
  289. {-- TMMWavePlayer -------------------------------------------------------------}
  290. function TMMWavePlayer.GetLoopCount: Word;
  291. begin
  292.    Result := FWaveOut.LoopCount;
  293. end;
  294. {-- TMMWavePlayer -------------------------------------------------------------}
  295. function TMMWavePlayer.GetState: TMMWaveOutState;
  296. begin
  297.    Result := FWaveOut.State;
  298. end;
  299. {-- TMMWavePlayer -------------------------------------------------------------}
  300. procedure TMMWavePlayer.SetAutoConvert(aValue: Boolean);
  301. begin
  302.    if (aValue <> FAutoConvert) then
  303.    begin
  304.       if (wosOpen in FwaveOut.State) then
  305.           raise Exception.Create(LoadResStr(IDS_PROPERTYOPEN));
  306.       FAutoConvert          := aValue;
  307.       FPCMConvert.Enabled   := aValue;
  308.       FADPCMConvert.Enabled := aValue;
  309.    end;
  310. end;
  311. {-- TMMWavePlayer -------------------------------------------------------------}
  312. procedure TMMWavePlayer.SetPosition(aValue: Longint);
  313. var
  314.    wasPaused: Boolean;
  315. begin
  316.    if (wosOpen in State) then
  317.    begin
  318.       FSeeking := True;
  319.       wasPaused := (wosPause in State);
  320.       FWaveOut.Pause;
  321.       FWaveFile.Wave.Position := aValue;
  322.       FStartPos := aValue;
  323.       FWaveOut.Reset;
  324.       if not wasPaused then FWaveOut.Restart;
  325.       FSeeking := False;
  326.    end
  327.    else
  328.    begin
  329.       FWaveFile.Wave.Position := aValue;
  330.    end;
  331. end;
  332. {-- TMMWavePlayer -------------------------------------------------------------}
  333. function TMMWavePlayer.GetPosition: Longint;
  334. begin
  335.    if (wosPlay in State) then
  336.    begin
  337.       Result := FStartPos+FWaveOut.Position;
  338.    end
  339.    else
  340.    begin
  341.      Result := FWaveFile.Wave.Position;
  342.    end;
  343. end;
  344. {-- TMMWavePlayer -------------------------------------------------------------}
  345. procedure TMMWavePlayer.DoChange(Sender: TObject);
  346. begin
  347.    Stop;
  348.    if assigned(FOnChange) then FOnChange(Self);
  349. end;
  350. {-- TMMWavePlayer -------------------------------------------------------------}
  351. procedure TMMWavePlayer.DoChanged(Sender: TObject);
  352. begin
  353.    FADPCMConvert.Enabled := FAutoConvert and FADPCMConvert.CanConvert;
  354. end;
  355. {-- TMMWavePlayer -------------------------------------------------------------}
  356. procedure TMMWavePlayer.DoStart(Sender: TObject);
  357. begin
  358.    if assigned(FOnStart) then FOnStart(Self);
  359. end;
  360. {-- TMMWavePlayer -------------------------------------------------------------}
  361. procedure TMMWavePlayer.DoStop(Sender: TObject);
  362. begin
  363.    if (FStopPos = -1) then FStopPos := Position;
  364.    FWaveOut.Close;
  365. end;
  366. {-- TMMWavePlayer -------------------------------------------------------------}
  367. procedure TMMWavePlayer.DoClose(Sender: TObject);
  368. begin
  369.    if not FResetPos then Position := FStopPos;
  370.    if assigned(FOnStop) then FOnStop(Self);
  371. end;
  372. {-- TMMWavePlayer -------------------------------------------------------------}
  373. procedure TMMWavePlayer.DoPause(Sender: TObject);
  374. begin
  375.    if assigned(FOnPause) and not FSeeking then FOnPause(Self);
  376. end;
  377. {-- TMMWavePlayer -------------------------------------------------------------}
  378. procedure TMMWavePlayer.DoRestart(Sender: TObject);
  379. begin
  380.    if assigned(FOnRestart) and not FSeeking then FOnRestart(Self);
  381. end;
  382. {-- TMMWavePlayer -------------------------------------------------------------}
  383. procedure TMMWavePlayer.DoData(Sender: TObject; lpwh: PWaveHdr);
  384. begin
  385.    if assigned(FOnData) then FOnData(Self,lpwh);
  386. end;
  387. {-- TMMWavePlayer -------------------------------------------------------------}
  388. procedure TMMWavePlayer.Play;
  389. begin
  390.    if not (wosPlay in State) and not FWaveFile.Wave.Empty then
  391.    begin
  392.       if (Position >= FWaveFile.Wave.DataSize) then Position := 0;
  393.       FStartPos := Position;
  394.       FStopPos  := -1;
  395.       FWaveOut.Start;
  396.    end;
  397. end;
  398. {-- TMMWavePlayer -------------------------------------------------------------}
  399. procedure TMMWavePlayer.Stop;
  400. begin
  401.    FStopPos := Position;
  402.    FWaveOut.Stop;
  403.    FWaveOut.Close;
  404. end;
  405. {-- TMMWavePlayer -------------------------------------------------------------}
  406. procedure TMMWavePlayer.Pause;
  407. begin
  408.    if not (wosPause in State) and not FWaveFile.Wave.Empty then FWaveOut.Pause;
  409. end;
  410. {-- TMMWavePlayer -------------------------------------------------------------}
  411. procedure TMMWavePlayer.Restart;
  412. begin
  413.    FWaveOut.Restart;
  414. end;
  415. end.