Lo que hago en las clases de accesorios de Novocaine, al igual que el buffer circular, de desentrelazado:
float zero = 0.0;
vDSP_vsadd(data, numChannels, &zero, leftSampleData, 1, numFrames);
vDSP_vsadd(data+1, numChannels, &zero, rightSampleData, 1, numFrames);
para la intercalación:
float zero = 0.0;
vDSP_vsadd(leftSampleData, 1, &zero, data, numChannels, numFrames);
vDSP_vsadd(rightSampleData, 1, &zero, data+1, numChannels, numFrames);
La forma más general de hacer las cosas es tener una matriz de matrices, como
int maxNumChannels = 2;
int maxNumFrames = 1024;
float **arrays = (float **)calloc(maxNumChannels, sizeof(float *));
for (int i=0; i < maxNumChannels; ++i) {
arrays[i] = (float *)calloc(maxNumFrames, sizeof(float));
}
[[Novocaine audioManager] setInputBlock:^(float *data, UInt32 numFrames, UInt32 numChannels) {
float zero = 0.0;
for (int iChannel = 0; iChannel < numChannels; ++iChannel) {
vDSP_vsadd(data, numChannels, &zero, arrays[iChannel], 1, numFrames);
}
}];
que es lo que uso internamente mucho en las clases de accesorios RingBuffer para Novocaine. Calculé la velocidad de vDSP_vsadd versus memcpy, y (muy, muy sorprendentemente), no hay diferencia de velocidad.
Por supuesto, siempre puede utilizar un búfer de anillo, y se ahorrará la molestia
#import "RingBuffer.h"
int maxNumFrames = 4096
int maxNumChannels = 2
RingBuffer *ringBuffer = new RingBuffer(maxNumFrames, maxNumChannels)
[[Novocaine audioManager] setInputBlock:^(float *data, UInt32 numFrames, UInt32 numChannels) {
ringBuffer->AddNewInterleavedFloatData(data, numFrames, numChannels);
}];
[[Novocaine audioManager] setOuputBlock:^(float *data, UInt32 numFrames, UInt32 numChannels) {
ringBuffer->FetchInterleavedData(data, numFrames, numChannels);
}];
Espero que ayude.
Gracias, parece una forma limpia de hacerlo! – bartolsthoorn
Alex, por favor, eche un vistazo a [este] (http://stackoverflow.com/questions/13228618/how-to-read-vbr-audio-in-novacaine-as-opposed-to-pcm) pregunta, yo ' Estoy tratando de agregar a su ejemplo de novacaína permitiéndole leer datos VBR (en SInt16 en lugar de flotar) – abbood