Hola, este es mi primer post, intentaré explicarme lo mejor que sé.
Estoy diseñando un plug-in de sonido con la SDK de Steinberg bajo el entorno de visual studio 2008 sobre un Windows XP 32 Bits. El lenguaje de programación es C++.
Ahora mismo, estoy implementando el efecto del Delay, más conocido como eco en algunos casos. No es más que retardar unas muestras de la entrada y sumarlas a la salida.
El código funciona de la siguiente manera: Un archivo process.cpp es el encargado del procesado de la señal que entre los metodos de definición de buses y diferentes canales tiene un metodo process() que se encarga del propio procesado de audio teniendo como atributos un tipo de dato "data" que hace referencia a las muestras que le llegan a la entrada (En este caso, el número de muestras será de 2048).
Bien, mi problema es el siguiente:
Los canales de entrada y salida están definidos respectivamente mediante :
float* in0 = data.inputs[0].channelBuffers32[0];
float* out0 = dato.outputs[0].channelBuffers32[0];
Para realizar un delay necesito un buffer externo a este metodo, declarado globalmente que se sobrescribirá cada vez que se ejecute el metodo process()
(El metodo process() se esta ejecutando continuamente en intervalos de muestras de 2048)
Bien, un metodo bypass, es decir poner la entrada sobre la salida directamente sería suficiente con:
float in; //variable auxiliar definida
int32 sampleFrames = data.numSamples; //Número de muestras, en este caso 2048
while(--sampleFrames>=0) //Es decir, por cada muestra haremos lo siguiente
{
in = (*in0++);
(*out0++)=in;
}
Bien, esto funciona, ahora el problema viene al insertar el delay
Defino un buffer externo al método process:
float * buffdelay;
buffdelay = (float*) malloc(2048*sizeof(float*)); //En esta instrucción lo que pretendo hacer es reservar un memoria para 2048 elementos tipo float.
Y aquí es donde viene la cuestión,
¿Dónde debería escribir este buffer de delay (buffdelay)? ¿Dentro de propio While? Entiendo que no, pues la idea es tener algo similar a esto:
while(--sampleFrames>=0) //Es decir, por cada muestra haremos lo siguiente
{
in = (*in0++);
(*out0++)=in+buffdelay[muestra]; //he puesto muestra por hacer referencia a lo qeu debería existir, un valor que mirase dentro del array y cogiese muestra a muestra para y sumandola a la salida, muestra a muestra
}
Luego, creo que la actualización del buffdelay sería fuera del while, pero estoy un poco perdido en cuanto a la implementación incluso quizá no estoy seguiendo la metodología adecuada.
Agradecería toda ayuda posible y disculpen las molestias por adelantado.