- Code: Select all
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 := CreateStreamWaveAudio(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 formats are 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: Select all
MergeWaves(AudioPlayer3.Wave.Stream,
[AudioPlayer1.Wave.Stream, AudioPlayer2.Wave.Stream]);
Cheers,
Kambiz