Tengo una serie de datos PCM, podría ser de 16 bits, 24 bits, 32 bits, etc. Podría estar firmado, o no, y podría ser un punto flotante de 32 o 64 bits. Actualmente se almacena como una matriz "vacía **", indexada por canal, luego por marco. El objetivo es permitir que mi biblioteca tome cualquier formato PCM y lo guarde, sin que sea necesario manipular los datos para que se ajusten a la estructura designada. Si el convertidor A/D escupe matrices empaquetadas de 24 bits de PCM intercalado, necesito aceptarlo con gracia. También necesito admitir 16 bits no intercalados, así como cualquier permutación de los formatos anteriores.Void * selección de matriz para flotar, int32, int16, etc.
Conozco la profundidad de bits y otra información en tiempo de ejecución, y estoy intentando codificar de manera eficiente sin duplicar el código. Lo que necesito es una forma efectiva de lanzar la matriz, poner datos de PCM en la matriz y luego extraerla más tarde.
puedo echar la matriz a int32_t o int16_t para el 32 y 16 bits con signo PCM, respectivamente, que probablemente tendrá que almacenar el PCM de 24 bits en un int32_t de 32 bits, los sistemas de bytes de 8 bits también.
¿Alguien puede recomendar una buena manera de poner datos en este conjunto, y sacarlo más tarde? Me gustaría evitar grandes secciones de código que se parecen:
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
...
Limitaciones: Estoy trabajando en C/C++, no hay plantillas, sin RTTI, sin STL. Piensa incrustado Las cosas se vuelven más complicadas cuando tengo que portar esto a un DSP con bytes de 16 bits.
¿Alguien tiene alguna macro útil que puedan estar dispuestos a compartir?
Gracias,
-Griff
yo habría pensado que esto es exactamente se suponía que las plantillas problema a resolver. ¿La cosa "sin plantillas" es una limitación de su cadena de herramientas, alguna otra restricción en el proyecto, o simplemente una preferencia personal? –
¿Qué haces con los datos? No está claro en la pregunta que realmente necesites hacer el casting si todo lo que haces es almacenar los datos en bruto y entregarlos después. – Kylotan
@Anon, dado que el OP ni siquiera acepta la sintaxis replicada protegida por una rama condicional, probablemente creo que el asunto del tamaño del archivo ejecutable es levantar la bandera roja en las plantillas. (dado que la función de plantillas da como resultado ejecutables más grandes que el interruptor ... caso) – YeenFei