Хорошо, я потратил некоторое время на изучение проблемы и понял, что вопрос содержит слишком мало информации, чтобы ответить =) Так вот, сделка:
Во-первых, о не чередующемся: я изначально думал, что этовыглядело бы так: l1 l2 l3 l4 ... ln r1 r2 r3 r4 ... rn Но оказалось, что в моих данных правый канал просто отсутствовал.Оказалось, что это были не чередующиеся данные, а просто простые моно данные.И да, это всегда должно быть несколько буферов на случай, если данные фактически не чередуются.Если это чередование, это должно быть l1 r1 l2 r2 l3 r3 l4 r4 ...
Во-вторых, о фактическом преобразовании: все зависит от диапазона выборок.В моем случае (и в любом случае, когда задействовано ядро, если я прав), значения с фиксированной точкой 8,24 должны находиться в диапазоне (-1, 1), тогда как 16-битные значения со знаком должны находиться в диапазоне (-32768, 32767).Таким образом, значение 8.24 всегда будет иметь свои первые 8 битов равными 0 (если оно положительное) или 1 (если оно отрицательное).Эти первые 8 бит должны быть удалены (с сохранением знака c).Также вы можете удалить столько конечных битов, сколько захотите - это просто уменьшит качество звука, но не испортит звук.В случае преобразования в 16-битный формат со знаком биты 8-22 (15 битов) будут фактически содержать данные, которые мы должны использовать для SInt16.Бит 7 может использоваться как знаковый бит.Таким образом, чтобы преобразовать 8.24 в SInt16, вам просто нужно сместить 9 бит вправо (9, потому что вам нужно сохранить знак) и привести к SInt16
11111111 10110110 11101110 10000011 -> 11111111 11111111 (11011011 01110111)
0000000001101111 00000000 11000001 -> 00000000 00000000 (00110111 10000000)
Вот и все.Ничего больше, чем перебирать массив и сдвигать биты вправо.Надеюсь, это спасет кого-то пару часов.