Domanda

Sto usando i servizi di unità audio per impostare un callback di rendering di output in modo da poter mescolare l'audio sintetizzato. Il codice che ho sembra funzionare perfettamente sui dispositivi che ho (iPod touch, iPhone 3G e iPad) ma non riesce a funzionare sul simulatore.

Sul simulatore, la funzione AudiounitInitialis fallisce e restituisce un valore di -10851 (kaudiouniterr_invalidpropertyvalue secondo la documentazione di Apple).

Ecco il mio codice di inizializzazione .. chiunque abbia più esperienza con questa API di quanto non vedo qualcosa che sto facendo errata qui?

#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);
    }

}

La mia versione Xcode è 3.2.2 (64 bit) La mia versione del simulatore è 3.2 (anche se lo stesso problema si verifica in 3.1.3 debug o versione)

Grazie, lo apprezzo!

È stato utile?

Soluzione

La compilazione per un dispositivo e per un simulatore è totalmente diverso. Le cose più comuni hanno lo stesso risultato previsto. Ad esempio, caricando un passaggio di vista tra loro suoni e così via. Tuttavia, quando si tratta di altre cose come suonare il suono con il caricamento aperto di 10 buffer e quindi passare da un po ', il simulatore non può gestirlo, ma i dispositivi possono.

Il modo in cui lo vedo è fintanto che funziona sul dispositivo, è tutto ciò che mi interessa. Prova a non tirare fuori i capelli solo per far funzionare un'applicazione su un simulatore quando funziona bene sul dispositivo.

Spero possa aiutare

Pk

Altri suggerimenti

Hai configurato e abilitato una sessione audio prima di chiamare il codice di inizializzazione Remoteio?

Quando si impostano le proprietà del flusso sul bus di input, si utilizzano kOutputBus Per il tuo ambito di input. Probabilmente non va bene. Inoltre, probabilmente non è necessario applicare il callback di rendering all'ambito globale, poiché ne hai bisogno solo per l'output. Inoltre, penso che le tue definizioni di kOutputBus e kInputBus sono sbagliati ... quando guardo il codice audio iPhone funzionante, utilizza 0 per il bus di input e 1 per il bus di output.

Posso anche pensare ad alcune cose minori per quanto

  1. Aggiungi il kAudioFormatFlagsNativeEndian Proprietà alle flag del tuo formato
  2. Impostare esplicitamente il mReserved campo a 0.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top