idRiff: RIFF
RiffLen: 36
idWave: WAVE
idFmt:  fmt 
InfoLen: 16
WaveType: 1
Channels: 1
SamplesPerSec: 44100
BytesPerSecond: 88200
BytesPerSample: 2
BitsPerSample: 16
idData: data
DataLen: 0

File size: 44

---
type
  TBufferSingle = array[0..0] of Single;
  PBufferSingle = ^TBufferSingle;
  TBuffer16 = array[0..0] of SmallInt;
  PBuffer16 = ^TBuffer16;  
  TBuffer32 = array[0..0] of Integer;
  PBuffer32 = ^TBuffer32;

  procedure SetSingleFPUPrecision(OldCW : PLongWord);
  asm
    FNSTCW [OldCW].WORD;
    MOV EAX, DWORD PTR [OldCW];
    AND EAX, $FCFF;
    PUSH EAX;
    FNCLEX;
    FLDCW  [ESP].WORD;
    POP EAX;
  end;

  procedure RestoreCW(OldCW : PLongWord);
  asm
    FNCLEX;
    FLDCW  [OldCW].Word;
  end;
  
  procedure SingleToSmallInt(_in : PBufferSingle; _out : PBuffer16; len : Integer);
  var
    i : Integer;
    CW : LongWord;
    iin : PBuffer32;
  const
    f : LongWord = 32767;
  begin
    iin := PBuffer32(_in);
    for i := 0 to len - 1 do
    begin
      if ((LongWord(iin[i]) shr 23) and 255) > 126 then
      begin
        if _in[i] >= 1 then
          _in[i] := 1
        else
        if _in[i] <= -1 then
          _in[i] := -1
      end;
    end;
    CW := 0;
    SetSingleFPUPrecision(@CW);
    asm
      PUSH EDI;
      PUSH ESI;
      MOV ECX, len;
      CMP ECX, 0;
      JE @loop2;
      MOV EDI, _In;
      MOV ESI, _out;
      FILD DWORD PTR [f];
      @loop1:
      FLD DWORD PTR [EDI];
      ADD EDI, 4;
      FMUL ST(0), ST(1);
      DEC ECX;
      FISTP WORD PTR [ESI];
      ADD ESI, 2;
      CMP ECX, 0;
      JNE @loop1;
      FSTP DWORD PTR [lDummie];
      @loop2:
      POP ESI;
      POP EDI;
    end;
//    for i := 0 to len - 1 do
//      _out[i] := Floor(_in[i] * $7FFF);
    RestoreCW(@CW);
  end;
  
  procedure SmallIntToSingle(_in : PBuffer16; _out : PBufferSingle; len : Integer);
  asm
    PUSH EDI;
    PUSH ESI;
    MOV ECX, len;
    CMP ECX, 0;
    JE @loop2;
    MOV EDI, _In;
    MOV ESI, _out;
    PUSH  0;
    FNSTCW  [ESP].Word;
    POP  EAX;
    PUSH EAX;
    AND EAX, $FCFF;
    PUSH EAX;
    FNCLEX;
    FLDCW  [ESP].WORD;
    POP EAX;
    FLD DWORD PTR [lFfsingle];
    XOR EAX, EAX;
    @loop1:
    FILD WORD PTR [EDI+EAX*2];
    FMUL ST(0), ST(1);
    DEC ECX;
    FSTP DWORD PTR [ESI+EAX*4];
    INC EAX;
    CMP ECX, 0;
    JNE @loop1;
    FSTP DWORD PTR [LDummie];
    FNCLEX;
    FLDCW  [ESP].Word;
    POP EAX;
    @loop2:
    POP ESI;
    POP EDI;
  end;
  
var
  FloatBuf1, FloatBuf2 : PBufferSingle;
  v1, v2 : Single;

    SamplesReq := Bytes div FOutBytesPerSample;
    if SamplesReq > BUF_SIZE then SamplesReq := BUF_SIZE;
    Bytes1 := SamplesReq * BytesPerSample1;
    Bytes2 := SamplesReq * BytesPerSample2;
    v1 := FVolume1 / High(Word);
    v2 := FVolume2 / High(Word);
    FillChar(InBuf1^, Bytes1, 0);
    FillChar(FloatBuf1^, SamplesReq * SizeOf(Single), 0);
    FillChar(FloatBuf2^, SamplesReq * SizeOf(Single), 0);
    SmallIntToSingle(Pointer(InBuf1), FloatBuf1, BUF_SIZE); 
    for i := 0 to BUF_SIZE - 1 do
      FloatBuf1[i] := (FloatBuf1[i]*v1 + FloatBuf2[i]*v2)/2;
    SingleToSmallInt(FloatBuf1, Pointer(InBuf1), BUF_SIZE);
