Code:
int pan; // panning position, set as you would with BASS_ChannelSetAttributes
void CALLBACK PanDSP(HDSP
handle, DWORD channel, void *buffer, DWORD length, DWORD user)
{
short *s=buffer;
for (;length;length-=4,s+=2) {
if (pan<0) s[1]=s[1]*(100+pan)/100; // pan left = reduce right
else if (pan>0) s[0]=s[0]*(100-pan)/100; // vice versa
}
}
"aus dem Bauch heraus", also keine Garantie auf kompilierbarkeit bzw. inhaltlich korrekte Uebersetzung:
Delphi-Quellcode:
procedure PanDSP(
handle: HDSP; channel: DWORD; buffer: Pointer; length: DWORD; user: DWORD);
type
PShortInt =
array of ShortInt;
var
s: PShortInt;
IndexOfS: integer;
begin
s := PShortInt(buffer);
IndexOfS := 0;
while (length > 0)
do
begin
if (pan < 0)
then
s[1 + IndexOfS] := s[1 + IndexOfS] * (100 + pan)
div 100
else
if (pan > 0)
then
s[IndexOfS] := s[IndexOfS] * (100 - pan)
div 100;
dec(length, 4);
inc(IndexOfS);
end;
end;
Ist eine etwas direktere Uebersetzung als die Variante mit der For-Schleife, kommt allerdings zu keinem Ende, wenn Length mod 4 > 0
greetz
Mike