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

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: 17.09.98 - 12:19:42 $                                        =}
  24. {========================================================================}
  25. unit MMVolume;
  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.     MMSystem,
  39.     MMRegs,
  40.     MMObj,
  41.     MMDSPObj,
  42.     MMUtils,
  43.     MMWaveIO,
  44.     MMPCMSup;
  45. type
  46.    EMMVolumeError = class(Exception);
  47.    {-- TMMVolume ---------------------------------------------------------}
  48.    TMMVolume = class(TMMDSPComponent)
  49.    private
  50.       FEnabled       : Boolean;
  51.       FOpen          : Boolean;
  52.       FOverflow      : Boolean; { overflow detected                       }
  53.       FVolume        : Longint; { 0 = silence, 16384 = 0 dB, 32768 = +6dB }
  54.       FPanning       : Longint; { L <-  -16384..0..16384  -> R            }
  55.       FLeftVolume    : Longint;
  56.       FRightVolume   : Longint;
  57.       procedure SetEnabled(aValue: Boolean);
  58.       procedure SetVolumeValues(index: integer; aValue: Longint);
  59.    protected
  60.       procedure SetPWaveFormat(aValue: PWaveFormatEx); override;
  61.       procedure Opened; override;
  62.       procedure Closed; override;
  63.       procedure Started; override;
  64.       procedure Stopped; override;
  65.       procedure Paused; override;
  66.       procedure Restarted; override;
  67.       procedure Reseting; override;
  68.       procedure BufferReady(lpwh: PWaveHdr); override;
  69.       procedure BufferLoad(lpwh: PWaveHdr; var MoreBuffers: Boolean); override;
  70.    public
  71.       constructor Create(aOwner: TComponent); override;
  72.       destructor Destroy; override;
  73.       procedure Open;
  74.       procedure Close;
  75.       procedure Process(Buffer: PChar; Length: integer);
  76.       property  Overflow: Boolean read FOverflow write FOverflow;
  77.    published
  78.       property Input;
  79.       property Output;
  80.       property Enabled: Boolean read FEnabled write SetEnabled default True;
  81.       property Volume: Longint index 0 read FVolume write SetVolumeValues default VOLUMEBASE;
  82.       property Panning: Longint index 1 read FPanning write SetVolumeValues default 0;
  83.    end;
  84. implementation
  85. {== TMMVolume ============================================================}
  86. constructor TMMVolume.Create(aOwner: TComponent);
  87. begin
  88.    inherited Create(aOwner);
  89.    FEnabled     := True;
  90.    FOpen        := False;
  91.    FLeftVolume  := VOLUMEBASE;
  92.    FRightVolume := VOLUMEBASE;
  93.    FVolume      := VOLUMEBASE;
  94.    FPanning     := 0;
  95. end;
  96. {-- TMMVolume ------------------------------------------------------------}
  97. destructor TMMVolume.Destroy;
  98. begin
  99.    Close;
  100.    inherited Destroy;
  101. end;
  102. {-- TMMVolume ------------------------------------------------------------}
  103. procedure TMMVolume.SetEnabled(aValue: Boolean);
  104. begin
  105.    if (aValue <> FEnabled) then
  106.    begin
  107.       FEnabled := aValue;
  108.    end;
  109. end;
  110. {-- TMMVolume ------------------------------------------------------------}
  111. procedure TMMVolume.SetVolumeValues(index: integer; aValue: Longint);
  112. begin
  113.    { calc the volumes for the left and right channel }
  114.    case index of
  115.       0: if (FVolume  = aValue) then exit else FVolume := MinMax(aValue,0,2*VOLUMEBASE);
  116.       1: if (FPanning = aValue) then exit else FPanning:= MinMax(aValue,-VOLUMEBASE,VOLUMEBASE);
  117.    end;
  118.    CalcVolume(VOLUMEBASE, FVolume,FPanning, FLeftVolume, FRightVolume);
  119. end;
  120. {-- TMMVolume ------------------------------------------------------------}
  121. procedure TMMVolume.SetPWaveFormat(aValue: PWaveFormatEx);
  122. begin
  123.    { we can only handle PCM format }
  124.    if (aValue <> nil) then
  125.    begin
  126.       if not (csDesigning in ComponentState) then
  127.          if not pcmIsValidFormat(aValue) then
  128.             raise EMMVolumeError.Create(LoadResStr(IDS_INVALIDFORMAT));
  129.    end;
  130.    inherited SetPWaveFormat(aValue);
  131. end;
  132. {-- TMMVolume ------------------------------------------------------------}
  133. procedure TMMVolume.Open;
  134. begin
  135.    if not FOpen then
  136.    begin
  137.       if pcmIsValidFormat(PWaveFormat) then
  138.       begin
  139.          // determine the maximal possible datasize we might receive in the events
  140.          // FMaxDatasize := Max(BufferSize,Max(QUEUE_READ_SIZE,QUEUE_WRITE_SIZE));
  141.          // DataBuffer := GlobalAllocMem(FMaxDataSize);
  142.          FOpen := True;
  143.       end;
  144.    end;
  145. end;
  146. {-- TMMVolume ------------------------------------------------------------}
  147. procedure TMMVolume.Close;
  148. begin
  149.    if FOpen then
  150.    begin
  151.       FOpen := False;
  152.    end;
  153. end;
  154. {-- TMMVolume ------------------------------------------------------------}
  155. procedure TMMVolume.Process(Buffer: PChar; Length: integer);
  156. begin
  157.    { process the buffer }
  158.    if pcmVolume(PWaveFormat, Buffer, Length, FLeftVolume, FRightVolume) then
  159.       FOverflow := True;
  160. end;
  161. {-- TMMVolume ------------------------------------------------------------}
  162. procedure TMMVolume.Opened;
  163. begin
  164.    { pipe opened }
  165.    Open;
  166.    inherited Opened;
  167. end;
  168. {-- TMMVolume ------------------------------------------------------------}
  169. procedure TMMVolume.Closed;
  170. begin
  171.    { pipe closed }
  172.    Close;
  173.    inherited Closed;
  174. end;
  175. {-- TMMVolume ------------------------------------------------------------}
  176. procedure TMMVolume.Started;
  177. begin
  178.    { pipe started }
  179.    inherited Started;
  180. end;
  181. {-- TMMVolume ------------------------------------------------------------}
  182. procedure TMMVolume.Stopped;
  183. begin
  184.    { pipe stopped }
  185.    inherited Stopped;
  186. end;
  187. {-- TMMVolume ------------------------------------------------------------}
  188. procedure TMMVolume.Paused;
  189. begin
  190.    { pipe paused }
  191.    inherited Paused;
  192. end;
  193. {-- TMMVolume ------------------------------------------------------------}
  194. procedure TMMVolume.Restarted;
  195. begin
  196.    { pipe restarted }
  197.    inherited Restarted;
  198. end;
  199. {-- TMMVolume ------------------------------------------------------------}
  200. procedure TMMVolume.Reseting;
  201. begin
  202.    { pipe reseting }
  203.    inherited Reseting;
  204. end;
  205. {-- TMMVolume ------------------------------------------------------------}
  206. procedure TMMVolume.BufferReady(lpwh: PWaveHdr);
  207. begin
  208.    { we are the output, process the data and put it to the right side }
  209.    if Enabled and FOpen then
  210.    begin
  211.       Process(lpwh^.lpData, lpwh^.dwBytesRecorded);
  212.    end;
  213.    inherited BufferReady(lpwh);
  214. end;
  215. {-- TMMVolume ------------------------------------------------------------}
  216. procedure TMMVolume.BufferLoad(lpwh: PWaveHdr; var MoreBuffers: Boolean);
  217. begin
  218.    { we are the input, load new data from the left side }
  219.    inherited BufferLoad(lpwh, MoreBuffers);
  220.    if Enabled and FOpen then
  221.    begin
  222.       { and process the data }
  223.       Process(lpwh^.lpData, lpwh^.dwBytesRecorded);
  224.    end;
  225. end;
  226. end.