Zitat von
xaromz:
Wenn der Wert größer als 65535 ist, dann ist der Wert zu groß und Du musst ist stutzen, so dass er kleiner oder gleich 65535 ist.
16-Bit Audiosamples werden vorzeichenbehaftet gespeichert, der Wert muss also zwischen -32768 und +32767 liegen.
Außerdem ist eine dynamische Signalanpassung ein etwas kompliziertes Unterfangen für jemanden, der zu Beginn der Fragestellung nicht wusste, wie man zwei Audiosignale mischt.
@Six:
Wenn du die kompletten Audiostreams auf einen Schlag verarbeitest, dann kannst du zunächst den maximalen absoluten Sample-Wert berechnen, der bei der Addition der beiden Streams herauskommt. Danach kannst du dann einen Faktor <= 1 berechnen, so dass dieser Wert 32767 nicht übersteigt. Dafür bräuchtest du dann zwei Durchläufe.
Beispiel (ungetestet):
Delphi-Quellcode:
function TForm1.SoundStreamsMischenStereo2(Stream1, Stream2: PSmallInt): PSmallInt;
var
i, n, d, v: integer;
Data2, Data3, Data4, Ziel, Ziel2: PSmallInt;
begin
n := 32767;
d := 32767;
// Erster Durchlauf: d (Divisor) anpassen
Data2 := Stream1;
Data4 := Stream2;
for i := Size - 1 downto 0 do
begin
v := Data2^ + Data4^;
if v > d then
d := v
else if -v > d then
d := -v;
Inc(Data2);
Inc(Data4);
end;
// Zweiter Durchlauf: Ziel berechnen, mit Pegelanpassung
GetMem(Ziel, Size);
Ziel2 := Ziel;
Data2 := Stream1;
Data4 := Stream2;
for i := Size - 1 downto 0 do
begin
ziel2^ := (Data2^ + Data4^) * n div d;
Inc(Ziel2);
Inc(Data2);
Inc(Data4);
end;
Result := Ziel;
end;