Ok, ich habe einige Zeit damit verbracht, das Problem zu untersuchen und festgestellt, dass die Frage zu wenige Informationen enthält, um beantwortet zu werden =) Also hier ist die Erklärung:
Zuerst, zum Thema nicht-interleaved: Ich dachte zunächst, es würde so aussehen: l1 l2 l3 l4...ln r1 r2 r3 r4...rn Aber es stellte sich heraus, dass im meinen Daten der rechte Kanal fehlte. Es stellte sich heraus, dass es sich nicht um nicht-interleaved-Daten handelte, sondern um einfache Monodaten. Und ja, es sollte immer mehrere Puffer geben, falls die Daten tatsächlich nicht-interleaved sind. Wenn sie interleaved sind, sollte es so sein: l1 r1 l2 r2 l3 r3 l4 r4...
Zweitens, zur tatsächlichen Transformation: alles hängt vom Bereich der Stichproben ab. In meinem Fall (und in jedem Fall, in dem Core Audio involviert ist, wenn ich mich nicht irre) sollten fixe 8.24-Werte im Bereich von (-1, 1) liegen, während 16-Bit-vorzeichenbehaftete Werte im Bereich von (-32768, 32767) liegen sollten. Ein 8.24-Wert hat also immer seine ersten 8 Bits auf 0 gesetzt (falls er positiv ist) oder auf 1 (falls er negativ ist). Diese ersten 8 Bits sollten entfernt werden (das Vorzeichen natürlich beibehalten). Außerdem können beliebig viele nachfolgende Bits entfernt werden - es wird nur die Qualität des Klangs verringern, aber den Klang nicht ruinieren. Wenn man zum 16-Bit-vorzeichenbehafteten Format konvertiert, werden die Bits 8-22 (15 Bits also) tatsächlich die Daten enthalten, die wir für SInt16 verwenden müssen. Bit 7 kann als das Vorzeichenbit verwendet werden. Um also von 8.24 auf SInt16 zu konvertieren, müssen Sie einfach 9 Bits nach rechts verschieben (9, weil das Vorzeichen erhalten bleiben muss) und in SInt16 umwandeln
11111111 10110110 11101110 10000011 - > 11111111 11111111 (11011011 01110111)
00000000 01101111 00000000 11000001 - > 00000000 00000000 (00110111 10000000)
Das ist alles. Nichts weiter als das Durchlaufen des Arrays und das Verschieben der Bits nach rechts. Hoffentlich spart das jemandem ein paar Stunden.