У меня есть массив данных PCM, он может быть 16-битным, 24-битным упакованным, 32-битным и т. Д. Он может быть со знаком или без знака, и это может быть 32- или 64-битная с плавающей запятой.В настоящее время он хранится в виде матрицы «void **», индексируется по каналу, а затем по кадру.Цель состоит в том, чтобы моя библиотека могла использовать любой формат PCM и буферизовать его, не требуя манипулирования данными для соответствия назначенной структуре.Если аналого-цифровой преобразователь выдает 24-битные массивы чередующихся PCM, я должен принять это изящно.Мне также нужно поддерживать 16-битное без чередования, а также любую перестановку вышеуказанных форматов.
Я знаю битовую глубину и другую информацию во время выполнения, и я пытаюсь эффективно кодировать, не дублируя код.Мне нужен эффективный способ приведения матрицы, помещения данных PCM в матрицу и последующего извлечения их позже.
Я могу привести матрицу к int32_t или int16_t для 32-битной и 16-битной подписанной PCMсоответственно, мне, вероятно, придется хранить 24-битную PCM в int32_t для 32-битных и 8-битных систем.
Может кто-нибудь порекомендовать хороший способ поместить данные в этот массив и извлечь его?потом?Я хотел бы избежать больших разделов кода, которые выглядят следующим образом:
switch( mFormat )
{
case 1: // unsigned 8 bit
for( int i = 0; i < mChannels; i++ )
framesArray = (uint8_t*)pcm[i];
break;
case 2: // signed 8 bit
for( int i = 0; i < mChannels; i++ )
framesArray = (int8_t*)pcm[i];
break;
case 3: // unsigned 16 bit
...
Ограничения: я работаю на C / C ++, нет шаблонов, нет RTTI, нет STL.Думай встраивай.Все становится сложнее, когда мне нужно перенести это на DSP с 16-битными байтами.
Есть ли у кого-нибудь полезные макросы, которыми он мог бы поделиться?
Спасибо,
-Griff