Pregunta

Estoy usando los servicios de la unidad de audio para configurar una devolución de llamada de salida de salida para poder mezclar audio sintetizado. El código que tengo parece funcionar perfectamente en los dispositivos que tengo (iPod Touch, iPhone 3G y iPad) pero no funciona en el simulador.

En el simulador, la función Audiounitinitialise falla y devuelve un valor de -10851 (kaudiouniterr_invalidpropertyvalue según la documentación de Apple).

Aquí está mi código de inicialización ... ¿Alguien con más experiencia con esta API que veo algo que estoy haciendo incorrecto aquí?

#define kOutputBus 0
#define kInputBus  1 

... 

static OSStatus playbackCallback(void *inRefCon, 
                             AudioUnitRenderActionFlags* ioActionFlags, 
                             const AudioTimeStamp*       inTimeStamp, 
                             UInt32                      inBusNumber, 
                             UInt32                      inNumberFrames, 
                             AudioBufferList*            ioData) 
{
    // Mix audio here - but it never gets here on the simulator
    return noErr;
}

...



{
    OSStatus status;

    // Describe audio component
    AudioComponentDescription desc;
    desc.componentType         = kAudioUnitType_Output;
    desc.componentSubType      = kAudioUnitSubType_RemoteIO;
    desc.componentFlags        = 0;
    desc.componentFlagsMask    = 0;
    desc.componentManufacturer = kAudioUnitManufacturer_Apple;

    // Get component
    AudioComponent inputComponent = AudioComponentFindNext(NULL, &desc);

    // Get audio units
    status = AudioComponentInstanceNew(inputComponent, &m_audio_unit);
    if(status != noErr) {
        NSLog(@"Failed to get audio component instance: %d", status);
    }

    // Enable IO for playback
    UInt32 flag = 1;
    status = AudioUnitSetProperty(m_audio_unit, 
                                  kAudioOutputUnitProperty_EnableIO, 
                                  kAudioUnitScope_Output, 
                                  kOutputBus,
                                  &flag, 
                                  sizeof(flag));
    if(status != noErr) {
        NSLog(@"Failed to enable audio i/o for playback: %d", status);
    }

    // Describe format
    AudioStreamBasicDescription audioFormat;
    audioFormat.mSampleRate       = 44100.00;
    audioFormat.mFormatID         = kAudioFormatLinearPCM;
    audioFormat.mFormatFlags      = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
    audioFormat.mFramesPerPacket  = 1;      
    audioFormat.mChannelsPerFrame = 2;
    audioFormat.mBitsPerChannel   = 16;
    audioFormat.mBytesPerPacket   = 4;
    audioFormat.mBytesPerFrame    = 4;      

    // Apply format
    status = AudioUnitSetProperty(m_audio_unit, 
                                  kAudioUnitProperty_StreamFormat, 
                                  kAudioUnitScope_Input, 
                                  kOutputBus, 
                                  &audioFormat, 
                                  sizeof(audioFormat));
    if(status != noErr) {
        NSLog(@"Failed to set format descriptor: %d", status);
    }

    // Set output callback
    AURenderCallbackStruct callbackStruct;
    callbackStruct.inputProc       = playbackCallback;
    callbackStruct.inputProcRefCon = self;
    status = AudioUnitSetProperty(m_audio_unit, 
                                  kAudioUnitProperty_SetRenderCallback, 
                                  kAudioUnitScope_Global, 
                                  kOutputBus,
                                  &callbackStruct, 
                                  sizeof(callbackStruct));
    if(status != noErr) {
        NSLog(@"Failed to set output callback: %d", status);
    }

    // Initialize (This is where it fails on the simulator)
    status = AudioUnitInitialize(m_audio_unit);
    if(status != noErr) {
        NSLog(@"Failed to initialise audio unit: %d", status);
    }

}

Mi versión de Xcode es 3.2.2 (64 bit) mi versión de simulador es 3.2 (aunque el mismo problema ocurre en 3.1.3 depuración o lanzamiento)

¡Gracias lo aprecio!

¿Fue útil?

Solución

La compilación de un dispositivo y para un simulador es totalmente diferente. Las cosas más comunes tienen el mismo resultado esperado. Por ejemplo, cargando un interruptor de vista entre ellos reproduciendo sonidos, etc. Sin embargo, cuando se trata de otras cosas como reproducir el sonido con Openal cargando 10 buffers y luego cambiar entre ellos, el simulador no puede manejar eso, pero los dispositivos pueden.

La forma en que lo veo es siempre que funcione en el dispositivo que es todo lo que me importa. Intente no tirar de su cabello solo para que una aplicación funcione en un simulador cuando funcione bien en el dispositivo.

Espero que ayude

Paquete

Otros consejos

¿Configuró y habilitó una sesión de audio antes de llamar a su código de inicialización de Remoteio?

Cuando está configurando las propiedades de la secuencia en el bus de entrada, está utilizando kOutputBus para su alcance de entrada. Eso probablemente no sea bueno. Además, probablemente no necesite aplicar la devolución de llamada Render al alcance global, ya que solo la necesita para la producción. Además, creo que tus definiciones de kOutputBus y kInputBus están equivocados ... cuando miro el código de audio para iPhone que funciona, usa 0 para el bus de entrada y 1 para el bus de salida.

También puedo pensar en algunas cosas menores en lo que respecta a AudiostreamBasicDescription, aunque no creo que esto marque una gran diferencia:

  1. Añade el kAudioFormatFlagsNativeEndian propiedad de sus banderas de formato
  2. Establecer explícitamente el mReserved campo a 0.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top