He estado trabajando en una aplicación de detección de frecuencia para iOS y tengo un problema al llenar un AudioBufferList definido por el usuario con muestras de audio del micrófono.Grabación con E/S remotas, AudioUnitRender -50 código de retorno
Obtengo un código de retorno de -50 cuando llamo AudioUnitRender en mi método InputCallback. Creo que esto significa que uno de mis parámetros no es válido. Supongo que es la AudioBufferList, pero no he podido averiguar qué está mal con ella. Creo que lo he configurado para que coincida con el formato de datos que he especificado en mi ASBD.
A continuación se muestra la configuración de E/S remotas y llamadas a funciones que creo que podría ser incorrecta:
ASBD:
size_t bytesPerSample = sizeof(AudioUnitSampleType);
AudioStreamBasicDescription localStreamFormat = {0};
localStreamFormat.mFormatID = kAudioFormatLinearPCM;
localStreamFormat.mFormatFlags = kAudioFormatFlagsAudioUnitCanonical;
localStreamFormat.mBytesPerPacket = bytesPerSample;
localStreamFormat.mBytesPerFrame = bytesPerSample;
localStreamFormat.mFramesPerPacket = 1;
localStreamFormat.mBitsPerChannel = 8 * bytesPerSample;
localStreamFormat.mChannelsPerFrame = 2;
localStreamFormat.mSampleRate = sampleRate;
Declaración InputCallback:
err = AudioUnitSetProperty(ioUnit, kAudioOutputUnitProperty_SetInputCallback,
kAudioUnitScope_Input,
kOutputBus, &callbackStruct, sizeof(callbackStruct));
Declaración AudioBufferList:
// Allocate AudioBuffers
bufferList = (AudioBufferList *)malloc(sizeof(AudioBuffer));
bufferList->mNumberBuffers = 1;
bufferList->mBuffers[0].mNumberChannels = 2;
bufferList->mBuffers[0].mDataByteSize = 1024;
bufferList->mBuffers[0].mData = calloc(256, sizeof(uint32_t));
InputCallback Función:
AudioUnit rioUnit = THIS->ioUnit;
OSStatus renderErr;
UInt32 bus1 = 1;
renderErr = AudioUnitRender(rioUnit, ioActionFlags, inTimeStamp, bus1, inNumberFrames, THIS->bufferList);
Algunas cosas a tener en cuenta:
- frecuencia de muestreo = 22050 Hz
- Dado que el formato canónico de E/datos O es punto fijo 8,24 bits, I Supongo que las muestras son de 32 bits cada una (o 4 bytes). Como un int sin signo tiene 4 bytes, lo estoy usando para asignar mi buffer de audio.
- Puedo obtener el mismo código para procesar el audio correctamente si implemento el flujo de datos de audio como PassThru en lugar de solo la entrada.
- Ya he visto Michael Tyson's blog post en E/S remotas. No vi nada allí diferente de lo que estoy haciendo.
Gracias de nuevo, ¡ustedes son geniales!
Demetri
Finalmente finalicé la aplicación de detección de frecuencia que mencioné. He publicado un informe junto con el código fuente para los interesados. EDITAR: el enlace ... http: //sleepyleaf.com/2011/01/25/pitch-detection-in-ios-4-x/ – irtemed88
No se ha encontrado ningún código en los mencionados .. Enlaces sleepyleaf.com/2011/ 01/25/pitch-detection-in-ios-4-x - irtemed88 –
Vaya, lo siento, actualicé mi dominio. Nuevo enlace: http://demetrimiller.com/2011/01/25/pitch-detection-in-ios-4-x/ – irtemed88