Llamar a AudioUnitInitialize() cuando no hay hardware de audio disponible

En un proyecto de aplicación de iOS, tengo un código de inicialización de unidad de audio (usado para entrada/salida) que (después de configurar varias propiedades, devoluciones de llamada, etc.) termina con:

OSErr err = AudioUnitInitialize (self.audioUnit);
NSAssert1 (err == noErr, "Error initializing audio unit: %ld", err);

Mi problema es que en algunas situaciones tengo que ejecutar este código en una computadora (en el simulador de iPhone, por supuesto) sin hardware de audio disponible, y luego sucede lo siguiente:

Primero, en la consola recibo el siguiente mensaje (perdón por las líneas largas, me parece más claro sin saltos de línea adicionales):

2012-05-03 12:41:15.020 TimeKeeper[452:10703] Error loading /System/Library/Extensions/AudioIPCDriver.kext/Contents/Resources/AudioIPCPlugIn.bundle/Contents/MacOS/AudioIPCPlugIn:  dlopen(/System/Library/Extensions/AudioIPCDriver.kext/Contents/Resources/AudioIPCPlugIn.bundle/Contents/MacOS/AudioIPCPlugIn, 262): Symbol not found: ___CFObjCIsCollectable
  Referenced from: /System/Library/Frameworks/Security.framework/Versions/A/Security
  Expected in: /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.0.sdk/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation
 in /System/Library/Frameworks/Security.framework/Versions/A/Security
2012-05-03 12:41:15.140 TimeKeeper[452:10703] Error loading /System/Library/Extensions/AudioIPCDriver.kext/Contents/Resources/AudioIPCPlugIn.bundle/Contents/MacOS/AudioIPCPlugIn:  dlopen(/System/Library/Extensions/AudioIPCDriver.kext/Contents/Resources/AudioIPCPlugIn.bundle/Contents/MacOS/AudioIPCPlugIn, 262): Symbol not found: ___CFObjCIsCollectable
  Referenced from: /System/Library/Frameworks/Security.framework/Versions/A/Security
  Expected in: /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.0.sdk/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation
 in /System/Library/Frameworks/Security.framework/Versions/A/Security
2012-05-03 12:41:15.207 TimeKeeper[452:10703] Error '!obj' trying to fetch default input device's sample rate
2012-05-03 12:41:15.209 TimeKeeper[452:10703] Error getting audio input device sample rate: '!obj'

Luego pasan unos 2 minutos más o menos hasta que AudioUnitInitialize devuelve con código de error 0 (es decir, noErr), y este mensaje en la consola:

2012-05-03 12:43:45.222 TimeKeeper[452:14403] AQMEIO_Base::DoStartIO: timeout
2012-05-03 12:43:45.226 TimeKeeper[452:14403] AQMEDevice(0x7b0de00)::StartIO: error -66681

Si luego llamo AudioOutputUnitStart, la función vuelve a tardar unos 2 minutos en volver, pero al menos el estado de devolución no es cero.

Me gustaría poder saber si el hardware de audio no está disponible, así puedo evitar llamar AudioUnitInitialize en primer lugar, o al menos obtener un estado de devolución distinto de cero sin tener que esperar tanto (en términos de tiempo de ejecución de la aplicación).

preguntado el 03 de mayo de 12 a las 11:05

1 Respuestas

Siempre puede verificar si se está ejecutando el código iOS simulado y hacer otra cosa.

#if TARGET_IPHONE_SIMULATOR
    // stub out audio unit with a unit test, unix pipe, or etc.
#endif

contestado el 03 de mayo de 12 a las 21:05

Sí, pero a veces el hardware de audio is disponible cuando se ejecuta en el simulador. Así que necesito una forma directa. - Itamar Katz

Una aplicación Simulator es una aplicación Mac OS X. Siempre puede verificar una variable de entorno o hacer llamadas IOKit o QuickTime en este entorno que no puede hacer en un dispositivo iOS. - pata caliente2

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.