delphi中对Wave格式的录音和播放(new) //copy_paste 09-02 同志们,我很懒的写注释。这是我对wave的新版,加入对wave文件格式的支持和一些新属性,不用像原来那样麻烦操作。
程序第一次运行有
问题,因为都要产生temp.wav文件,这两天准备回家了,不想再改了,你有兴趣有改吧。
//WaveConsts.pas
unit WaveConsts;
interface
uses
Windows, MMSystem;
type
TWaveInEvent = procedure(Data: Pointer; Count: Integer) of object;
TChannels = (ctMono, ctStereo);
TSamplesPerSec = (sp11k, sp22k, sp38k, sp44k);
TBitsperSample = (bs8Bit, bs16Bit);
//wave文件头格式
TWaveFileHeader = packed record
FType: Integer;
Size: Longint;
RType: Integer;
end;
//wave文件Chunk头格式(CType= ID_FMT/ID_FACT/ID_DATA)
TWaveChunkHeader = packed record
CType: Longint;
Size: Longint;
end;
const
C_PlayBufferSize = 1024 * 100;
ID_RIFF = Ord('R') + Ord('I') * $100 + Ord('F') * $10000 + Ord('F') * $1000000;
ID_WAVE = Ord('W') + Ord('A') * $100 + Ord('V') * $10000 + Ord('E') * $1000000;
ID_FMT = Ord('f') + Ord('m') * $100 + Ord('t') * $10000 + Ord(' ') * $1000000;
ID_FACT = Ord('f') + Ord('a') * $100 + Ord('c') * $10000 + Ord('t') * $1000000;
ID_DATA = Ord('d') + Ord('a') * $100 + Ord('t') * $10000 + Ord('a') * $1000000;
ChannelValue: array [TChannels] of WORD = (1, 2);
SamplesPerSecValue: array [TSamplesPerSec] of DWORD = (11025, 22050, 38000, 44100);
BitsperSampleValue: array [TBitsperSample] of WORD = (8, 16);
{ default wav format }
PCMFormat: TWaveFormatEx = (
wFormatTag: 1;
nChannels: 2;
nSamplesPerSec: 48000;
nAvgBytesPerSec: 192000;
nBlockAlign: 4;
wBitsperSample: 16;
cbSize: 0);
resourcestring
SInvalidWaveFile = 'Invalid wave file';
SReadWaveError = 'Read wave file error';
SWriteWaveError = 'Write wave file error';
SOverlay = 'File is exists, are you overlay?';
SConfirm = 'confirm';
SNotActive = 'no ope';
implementation
end.
1楼:这个组件源码。
//waveComp.pas
unit WaveComp;
interface
uses Windows, Messages, Classes, SysUtils, Controls, MMSystem, WaveConsts;
type
TWave = class;
TWaveFileStream = class(TObject)
private
FReadEof: Boolean;
FFormat: TWaveFormatEx;
FStream: TFileStream;
FDataPosition: Integer;
FReadPos: Integer;
FWritePos: Integer;
FFileName: string;
FOwner: TWave;
procedure ReadFormat;
function GetSize: Integer;
procedure InternatSaveFile;
procedure SetFileName(const Value: string);
public
constructor Create(FileName: string; AOwner: TWave);
destructor Destroy; override;
procedure ClearWave;
function ReadWave(var Buffer; Count: Integer): Integer;
function WriteWave(const Buffer; Count: Integer): Integer;
procedure SaveToFile(const FileName: string);
property Size: Integer read GetSize;
property Format: TWaveFormatEx read FFormat write FFormat;
property FileName: string read FFil
eName write SetFileName;
property ReadPos: Integer read FReadPos;
property WritePos: Integer read FWritePos;
end;
EWaveFileException = class(Exception);
TWave = class(TWinControl)
private
FActive: Boolean;
FFormat: TWaveFormatEx;
FHeaderList: TList;
FWaveStream: TWaveFileStream;
procedure AddBuffer(Header: PWaveHdr);
procedure DeleteBuffer(var Header: PWaveHdr);
procedure CheckActive;
procedure SetFileName(const Value: string);
function GetBitsperSample: TBitsperSample;
function GetChannels: TChannels;
function GetSamplesPerSec: TSamplesPerSec;
procedure SetBitsperSample(