const Value: TBitsperSample);
procedure SetChannels(const Value: TChannels);
procedure SetSamplesPerSec(const Value: TSamplesPerSec);
function GetActive: Boolean;
procedure SetFormat(const Value: TWaveFormatEx);
procedure FreeHeaderBuffer;
protected
function GetFileName: string; virtual;
procedure CheckError(msg: string);
procedure SetActive(Value: Boolean); virtual;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Close;
procedure Open;
property Format: TWaveFormatEx read FFormat write SetFormat;
property WaveStream: TWaveFileStream read FWaveStream write FWaveStream;
published
property Active: Boolean read GetActive write SetActive;
{ Channels: 单声/立体声}
property Channels: TChannels read GetChannels write SetChannels;
{ SamplesPerSec: 声音频率 }
property SamplesPerSec: TSamplesPerSec read GetSamplesPerSec write SetSamplesPerSec;
{ SamplesPerSec: 声音位:8位/16位}
property BitsperSample: TBitsperSample read GetBitsperSample write SetBitsperSample;
property FileName: string read GetFileName write SetFileName;
end;
EWaveException = class(Exception);
TWaveIn = class(TWave)
private
FWaveID: PHWaveIn;
FDataSize: Integer;
FBufferSize: Integer;
FAutoSaveFile: Boolean;
FOnData: TWaveInEvent;
procedure AddPrepareBuffer;
procedure DoDataEvent(Data: Pointer; Count: Integer);
procedure DoAutoSaveFile(Data: Pointer; Count: Integer);
procedure WaveInCallback (var msg:TMessage); message MM_WIM_DATA;
procedure SetAutoSaveFile(const Value: Boolean);
procedure DoCheckWaveFormat;
protected
procedure CheckError(Res: Integer);
procedure SetActive(Value: Boolean); override;
public
constructor Create(AOwner: TComponent); override;
procedure Start;
procedure Stop;
published
property OnData: TWaveInEvent read FOnData write FOnData;
property BufferSize: Integer read FBufferSize write FBufferSize default 3;
property AutoSaveFile: Boolean read FAutoSaveFile write SetAutoSaveFile;
end;
TWaveOut = class(TWave)
private
FWaveID: PHWaveOut;
FAutoPlayFile: Boolean;
procedure WaveOutCallback(var msg: TMessage); message MM_WOM_DONE;
procedure VolumeProc(Add: Boolean);
procedure SetAutoPlayFile(const Value: Boolean);
procedure DoCheckWaveFormat;
procedure DoAutoPlayFile;
procedure Au
toPlayBuffer;
protected
procedure CheckError(Res: Integer);
procedure SetActive(Value: Boolean); override;
procedure IncVolume;
procedure DecVolume;
public
constructor Create(AOwner: TComponent); override;
procedure PlayBack(Data: Pointer; Count: Integer);
procedure Pause;
procedure ReStart;
published
property AutoPlayFile: Boolean read FAutoPlayFile write SetAutoPlayFile;
end;
implementation
const
OpenType: array [Boolean] of Integer = (fmCreate, fmOpenReadWrite or fmShareDenyNone);
procedure MakeWaveFormat(var Format: TWaveFormatEx;
Channels, SamplesPerSec, BitsperSample: DWORD);
begin
with Format do
begin
wFormatTag := WAVE_FORMAT_PCM;
nChannels := Channels;