Llamar a AudioUnitInitialize() cuando no hay hardware de audio disponible
Frecuentes
Visto 825 veces
1
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).
1 Respuestas
1
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
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas iphone ios core-audio audiounit or haz tu propia pregunta.
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