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