Kambiz Administrator

Joined: 07 Mar 2003 Posts: 420 Location: Tehran, Iran
|
Posted: 07/09/03 18:12 Post subject: Merging wave files (Wave Audio Package) |
|
|
Here is the implementation of a function to make a wave audio stream by merging several wave audio streams. The function expects all input waves have identical format, otherwise it fails and returns False.
| Code: | uses
WaveUtils, MMSystem;
function MergeWaves(DstStream: TStream; SrcStreams: array of TStream): Boolean;
function AppendWave(mmIO: HMMIO; Stream: TStream;
ExpectedFormat: PWaveFormatEx): Boolean;
var
Buffer: array[0..1023] of Char;
DataSize, DataOffset: Cardinal;
ReadCount: Cardinal;
WaveFormat: PWaveFormatEx;
begin
Result := False;
GetStreamWaveAudioInfo(Stream, WaveFormat, DataSize, DataOffset);
try
if (ExpectedFormat^.cbSize = WaveFormat^.cbSize) and
CompareMem(ExpectedFormat, WaveFormat, ExpectedFormat^.cbSize) then
begin
Stream.Seek(DataOffset, soFromBeginning);
while DataSize <> 0 do
begin
if DataSize > SizeOf(Buffer) then
ReadCount := SizeOf(Buffer)
else
ReadCount := DataSize;
Stream.ReadBuffer(Buffer, ReadCount);
mmioWrite(mmIO, @Buffer[0], ReadCount);
Dec(DataSize, ReadCount);
end;
Result := True;
end;
finally
FreeMem(WaveFormat);
end;
end;
var
mmIO: HMMIO;
ckRIFF, ckData: TMMCKInfo;
WaveFormat: PWaveFormatEx;
Dummy: Cardinal;
I: Integer;
begin
Result := False;
if Length(SrcStreams) > 0 then
begin
GetStreamWaveAudioInfo(SrcStreams[0], WaveFormat, Dummy, Dummy);
try
mmIO := CreateStreamWaveAudioInfo(DstStream, WaveFormat, ckRIFF, ckData);
try
for I := 0 to Length(SrcStreams) - 1 do
begin
if not AppendWave(mmIO, SrcStreams[I], WaveFormat) then
Break; // Error: Wave format is not identical
end;
Result := True;
finally
mmioAscend(mmIO, @ckData, 0);
mmioAscend(mmIO, @ckRIFF, 0);
mmioClose(mmIO, 0);
end;
finally
FreeMem(WaveFormat);
end;
end;
end; |
Here is an example of usage:
| Code: | | MergeWaves(AudioPlayer3.Wave, [AudioPlayer1.Wave, AudioPlayer2.Wave]); |
Cheers,
Kambiz |
|