Was ich in Novocaine des Zubehörs Klasse zu tun, wie der Ringbuffer, zum Entschachteln:
float zero = 0.0;
vDSP_vsadd(data, numChannels, &zero, leftSampleData, 1, numFrames);
vDSP_vsadd(data+1, numChannels, &zero, rightSampleData, 1, numFrames);
zur Verschachtelung:
float zero = 0.0;
vDSP_vsadd(leftSampleData, 1, &zero, data, numChannels, numFrames);
vDSP_vsadd(rightSampleData, 1, &zero, data+1, numChannels, numFrames);
Der allgemeinere Weg, Dinge zu tun, ist, ein Array von Arrays zu haben, wie
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);
}
}];
was ich intern viel in den RingBuffer Zubehörklassen für Novocaine verwende. Ich habe die Geschwindigkeit von vDSP_vsadd gegen memcpy gemessen, und (sehr, sehr überraschend) gibt es keine Geschwindigkeitsdifferenz.
Natürlich können Sie immer nur einen Ringpuffer, und sparen Sie sich die Mühe
#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);
}];
Hoffnung, das hilft.
Danke, das sieht nach einem sauberen Weg aus! – bartolsthoorn
Alex, bitte schauen Sie sich [diese] (http://stackoverflow.com/questions/13228618/how-to-read-vbr-audio-in-novacaine-as-oppe-pied-to-pcm) Frage, ich ' m versuche, zu deinem Novacaine-Beispiel hinzuzufügen, indem ich ihm erlaube, VBR-Daten zu lesen (in SInt16 anstatt in float) – abbood