Hallo Wishmaster,
Joa, es hat mir weitergeholfen. Vielen Dank für die Spur, auf die du mich da gesetzt hast.
Und hier ist die Lösung:
Delphi-Quellcode:
procedure StereoToMono (
handle: HDSP; channel: DWORD; buffer: Pointer; length: DWORD; user: DWORD);
stdcall;
var
P: pSingle;
// zeiger auf ein Element des puffers.
a: DWORD;
mono, left, right: single;
begin
P := buffer;
a := 0;
while (a < (length
div 4))
do // 4 bytes pro eintrag (sizeOf single = 4)
begin
// erst kommt der linke Kanal
left := p^;
inc (p);
// jetzt zeigt p auf den rechten
right := p^;
dec (p);
// und wieder zurück zum linken, um ihn zu modifizieren
mono := (left + right) / 2;
p^ := mono;
inc (p);
// wir sind wieder beim rechten...
p^ := mono;
inc (p);
// und beim nächsten zu bearbeitenden Sample
a := a + 2;
// weil zwei Samples verändert wurden.
end;
end;
// und der Aufruf...
procedure TPlayer.MonoAbspielen (m: boolean);
begin
if m
then // mono abspielen
MonoDSP := BASS_ChannelSetDSP (sh, @StereoToMono,
nil, 1)
else
BASS_ChannelRemoveDSP (sh, MonoDSP);
end;
// wobei sh ein bei mir globaler Channel ist
// sh: HSTREAM;
Einen herzlichen Gruß
Marco