Quello che faccio nelle classi accessorie di Novocaine, come il ringbuffer, per de-interlacciamento:
float zero = 0.0;
vDSP_vsadd(data, numChannels, &zero, leftSampleData, 1, numFrames);
vDSP_vsadd(data+1, numChannels, &zero, rightSampleData, 1, numFrames);
per interleaving:
float zero = 0.0;
vDSP_vsadd(leftSampleData, 1, &zero, data, numChannels, numFrames);
vDSP_vsadd(rightSampleData, 1, &zero, data+1, numChannels, numFrames);
Il modo più generale di fare le cose è avere una matrice di matrici, come
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);
}
}];
che è quello che uso internamente molto nelle classi di accessori RingBuffer per Novocaine. Ho calcolato la velocità di vDSP_vsadd rispetto a memcpy e (molto, molto sorprendentemente), non c'è differenza di velocità.
Naturalmente, si può sempre e solo usare un buffer circolare, e risparmiare il fastidio
#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);
}];
Speranza che aiuta.
Grazie, sembra un modo pulito per farlo! – bartolsthoorn
Alex, per favore dai un'occhiata a [questo] (http://stackoverflow.com/questions/13228618/how-to-read-vbr-audio-in-novacaine-as-opposed-to-pcm) question, i ' Sto cercando di aggiungere al tuo esempio di novacaine permettendo di leggere i dati VBR (in SInt16 anziché in virgola mobile) – abbood