delphi – Deinterleave 24 bit audio buffer for ASIO output
I’m using an ASIO component (in Delphi 7) which supports only 16-bit and 32-bit output when it deinterleaves the left/right channels into 2 separate ASIO buffers. Some ASIO drivers only support 24-bit output so I want to add a deinterleaving function for this bit depth, but the bitwise logic required is beyond me. Below are the DeInterleave32 and DeInterleave16 functions. Can someone please help create a DeInterleave24 function.
The PBufferInfoArray is basically an array of pointers.
type
TBuffer32 = array[0..0] of LongWord;
PBuffer32 = ^TBuffer32;
TBuffer16 = array[0..0] of SmallInt;
PBuffer16 = ^TBuffer16;
procedure Deinterleave32(InputBuffer : PBuffer32; OutputBuffer : PBufferInfoArray; Samples, BufferIndex : LongWord);
var
i, j : LongWord;
Dest : array[0..1] of PBuffer32;
begin
for i := 0 to 1 do // always 2 channels
Dest[i] := OutputBuffer[i].buffers[BufferIndex];
i := 0;
while i < Samples do
begin
j := i shl 1;
Dest[0][i] := InputBuffer[j];
Dest[1][i] := InputBuffer[j+1];
Inc(i);
end;
end;
procedure Deinterleave16(InputBuffer : PBuffer16; OutputBuffer : PBufferInfoArray; Samples, BufferIndex : LongWord);
var
i, j : LongWord;
Dest : array[0..1] of PBuffer16;
begin
for i := 0 to 1 do // always 2 channels
Dest[i] := OutputBuffer[i].buffers[BufferIndex];
for i := 0 to Samples - 1 do
for j := 0 to 1 do
Dest[j][i] := InputBuffer[i*2 + j];
end;
Most appreciated if you can help.
Read more here: Source link
