Question

J'utilise les services de l'unité audio de mettre en place une sortie de rendu rappel, je peux mélanger audio ensemble synthétisé. Le code je semble fonctionner parfaitement sur les appareils que j'ai (iPod Touch, iPhone 3G et iPad), mais ne fonctionne pas sur le simulateur.

Sur le simulateur, la fonction AudioUnitInitialise échoue et renvoie une valeur de -10851 (kAudioUnitErr_InvalidPropertyValue selon la documentation Apple).

Voici mon code d'initialisation .. quelqu'un avec plus d'expérience avec cette API que je vois tout ce que je fais ici incorrecte?

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

}

Ma version XCode est 3.2.2 (64 bits) Ma version de simulateur est 3.2 (Bien que le même problème se produit dans 3.1.3 Debug ou Release)

Merci, je l'apprécie!

Était-ce utile?

La solution

compilation pour un dispositif et un simulateur est totalement différent. La plupart des choses communes ont le même résultat attendu. Par exemple le chargement d'un commutateur de vue entre les jouer des sons et ainsi de suite. Cependant, quand il vient à d'autres choses comme jouer avec son chargement OpenAL 10 tampons et la commutation entre eux le simulateur ne peut pas gérer, mais les appareils peuvent.

La façon dont je le vois est aussi longtemps que cela fonctionne sur le dispositif qui est tout ce que je me soucie de. Essayez de ne pas tirer t vos cheveux juste pour faire un travail d'application sur un simulateur quand il fonctionne très bien sur l'appareil.

espoir qui aide

Pk

Autres conseils

Avez-vous configuré et activer une session audio avant d'appeler votre code d'initialisation RemoteIO?

Lorsque vous définissez les propriétés de flux au bus d'entrée, vous utilisez kOutputBus pour votre champ d'entrée. C'est probablement pas bon. , Vous n'avez pas besoin probablement d'appliquer le rendu rappel à la portée globale, comme vous ne le faut pour la sortie. De plus, je pense que vos définitions de kOutputBus et kInputBus sont mal ... quand je regarde le code de travail iPhone Audio, il utilise 0 pour le bus d'entrée et 1 pour le bus de sortie.

Je peux aussi penser à quelques petites choses en ce qui concerne la AudioStreamBasicDescription, bien que je ne pense pas que ceux-ci feront une grande différence:

  1. Ajoutez la propriété kAudioFormatFlagsNativeEndian à vos drapeaux de format
  2. set Explicitement le champ mReserved à 0.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top