2011-05-05 8 views
6

Estoy trabajando en un proyecto en el que he usado AudioUnitRender funciona bien en el simulador pero da error -50 en el dispositivo.Error de AudioUnitRender de iPhone -50 en el dispositivo

Si alguien se ha enfrentado a un problema similar, por favor, dame una solución.

RIOInterface* THIS = (RIOInterface *)inRefCon; 
COMPLEX_SPLIT A = THIS->A; 
void *dataBuffer = THIS->dataBuffer; 
float *outputBuffer = THIS->outputBuffer; 
FFTSetup fftSetup = THIS->fftSetup; 

uint32_t log2n = THIS->log2n; 
uint32_t n = THIS->n; 
uint32_t nOver2 = THIS->nOver2; 
uint32_t stride = 1; 
int bufferCapacity = THIS->bufferCapacity; 
SInt16 index = THIS->index; 

AudioUnit rioUnit = THIS->ioUnit; 
OSStatus renderErr; 
UInt32 bus1 = 1; 

renderErr = AudioUnitRender(rioUnit, ioActionFlags, 
    inTimeStamp, bus1, inNumberFrames, THIS->bufferList); 
NSLog(@"%d",renderErr); 
if (renderErr < 0) { 
    return renderErr; 
} 

de datos con respecto al tamaño de la muestra y el marco ...

bytesPerSample = sizeof(SInt16); 
asbd.mFormatID = kAudioFormatLinearPCM; 
asbd.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked; 
asbd.mBitsPerChannel = 8 * bytesPerSample; 
asbd.mFramesPerPacket = 1; 
asbd.mChannelsPerFrame = 1; 

//asbd.mBytesPerPacket = asbd.mBytesPerFrame * asbd.mFramesPerPacket; 
asbd.mBytesPerPacket = bytesPerSample * asbd.mFramesPerPacket; 


//asbd.mBytesPerFrame = bytesPerSample * asbd.mChannelsPerFrame;  
asbd.mBytesPerFrame = bytesPerSample * asbd.mChannelsPerFrame;   

asbd.mSampleRate = sampleRate;  

gracias de antemano ..

Respuesta

3

La longitud del búfer (enNumberFrames) puede ser diferente en el dispositivo y en el simulador. Desde mi experiencia, a menudo es más grande en el dispositivo. Cuando utilizas tu propia AudioBufferList esto es algo que debes tener en cuenta. Sugeriría asignar más memoria para el buffer en la AudioBufferList.

0

Trate de añadir kAudioFormatFlagsNativeEndian a su lista de banderas formato de descripción de flujo. No estoy seguro de si eso marcará la diferencia, pero no puede doler.

Además, sospecho del uso de THIS para el miembro userData, que definitivamente no completa ese miembro con ningún dato significativo de forma predeterminada. Intente ejecutar el código en un depurador y vea si esa instancia se extrae y se copia correctamente. Asumiendo que sea, solo por diversión intente poner el objeto AudioUnit en una variable global (sí, lo sé ...) solo para ver si funciona.

Finalmente, ¿por qué usar THIS->bufferList en lugar del que pasó a su devolución de llamada en render? Eso probablemente no sea bueno.

3

Sé que este hilo es viejo, pero acabo de encontrar la solución a este problema.

La duración del búfer para el dispositivo es diferente de la del simulador. Por lo tanto, debe cambiar la duración del búfer:

Float32 bufferDuration = ((Float32) <INSERT YOUR BUFFER DURATION HERE>)/sampleRate; // buffer duration in seconds 

AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration, sizeof(bufferDuration), &bufferDuration); 
Cuestiones relacionadas