Термин «пакет» относится к группе сжатых аудиосэмплов с заголовком. Вам нужен заголовок для декодирования данных сразу после. Если вы считаете свой файл ima4 книгой, то каждый пакет - это страница. Вверху находятся значения, необходимые для декодирования этой страницы, а затем сжатый звук.
Вот почему вам необходимо рассчитать размер распакованных данных (а затем освободить место для них) - поскольку они сжаты, вам необходимо преобразовать данные из сжатого звука в несжатый звук, прежде чем вы сможете его выводить. Чтобы выделить выходной буфер, вам нужно знать, насколько большим он должен быть (примечание: вам может потребоваться выводить порциями, которые больше, чем один пакет за раз).
Похоже, что типичная структура, согласно более раннему разделу «Обзор», состоит в том, что наборы из 64 выборок, каждый из 16 бит (т.е. 128 байтов) транслируются в 2-байтовый заголовок и 32-байтовый набор сжатых выборок. (Всего 34 байта). Таким образом, в типичном случае вы можете получить ожидаемый размер выходных данных, взяв размер входных данных, разделив его на 34, чтобы получить количество пакетов, затем умножив его на 128 байтов для несжатого звука на пакет.
Тебе не следует этого делать. Похоже, вы должны вместо этого запросить kAudioFilePropertyDataFormat, чтобы получить mBytesPerPacket - это значение «34» выше, а mFramesPerPacket - это 64 выше, которое умножается на 2 (для 16-байтовых выборок), чтобы получить 128 байтов выхода.
Затем для каждого пакета вам необходимо выполнить декодирование, описанное в посте. В несколько более длинном псевдо-C-коде, если вы получаете массивы байтов, для обработки заголовка:
packet = GetPacket();
Header = (packet[0] << 8) | packet[1]; //Big-endian 16-bit value
step_index = Header & 0x007f; //Lower seven bits
predictor = Header & 0xff80; //Upper nine bits
for (i = 2; i < mBytesPerPacket; i++)
{
nibble = packet[i] & 0x0f; //Low Nibble
process that nibble, per the blogpost -- be careful on sign-extension!
nibble = (packet[i] & 0xf0) >> 4; //High Nibble
process that nibble, per the blogpost -- be careful on sign-extension!
}
Расширение знака, приведенное выше, относится к тому факту, что сообщение включает в себя обработку каждого клева как без знака, так и со знаком. Если старший бит полубайта (бит 3) равен 1, то он отрицательный; Кроме того, битовое смещение может выполнять расширение знака. Это не обрабатывается в приведенном выше псевдокоде.