Frage

Ich verwende die Audio -Einheit -Dienste, um einen Rückruf für die Ausgabe -Rendering einzurichten, damit ich synthetisierte Audio miteinander mischen kann. Der Code, den ich habe, scheint perfekt auf den Geräten zu funktionieren, die ich habe (iPod touch, iPhone 3G und iPad), funktioniert jedoch nicht am Simulator.

Auf dem Simulator schlägt die Audiounitinitial -Funktion fehl und gibt einen Wert von -10851 zurück (kaudiouniterr_invalidpropertyValue gemäß Apple -Dokumentation).

Hier ist mein Initialisierungscode. Jeder mit mehr Erfahrung mit dieser API als ich etwas sehe, was ich hier falsch mache?

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

}

Meine Xcode -Version ist 3.2.2 (64 Bit) Meine Simulator -Version ist 3.2 (obwohl das gleiche Problem in 3.1.3 Debug oder Veröffentlichung auftritt)

Danke ich schätze das!

War es hilfreich?

Lösung

Das Kompilieren für ein Gerät und für einen Simulator ist völlig anders. Die meisten häufigsten Dinge haben das gleiche erwartete Ergebnis. Zum Beispiel laden Sie einen View -Schalter zwischen ihnen, um Sounds und so weiter zu spielen. Wenn es jedoch um andere Dinge geht, wie das Spielen von Sound mit Openal -Laden von 10 Puffern und dann zwischen ihnen, kann der Simulator das nicht verarbeiten, aber die Geräte können.

Die Art und Weise, wie ich es sehe, ist, solange es auf dem Gerät funktioniert, was mir wichtig ist. Versuchen Sie nicht, Ihr Haar nicht auszuziehen, nur um eine Anwendung auf einem Simulator zu bearbeiten, wenn es auf dem Gerät einwandfrei funktioniert.

Ich hoffe, das hilft

Pk

Andere Tipps

Haben Sie eine Audiositzung konfiguriert und aktiviert, bevor Sie Ihren Remoteio -Initialisierungscode aufgerufen haben?

Wenn Sie die Stream -Eigenschaften auf den Eingabebus einstellen, verwenden Sie kOutputBus Für Ihren Eingangsbereich. Das ist wahrscheinlich nicht gut. Außerdem müssen Sie den Render -Rückruf wahrscheinlich nicht auf den globalen Bereich anwenden, da Sie ihn nur für die Ausgabe benötigen. Darüber hinaus denke ich, dass Ihre Definitionen von kOutputBus und kInputBus sind falsch ... wenn ich mich mit dem arbeitenden iPhone -Audiocode anschaue, verwendet er 0 für den Eingabebus und 1 für den Ausgangsbus.

Ich kann mir auch ein paar kleinere Dinge in Bezug auf die AudioTreamBasicDescription vorstellen, obwohl ich nicht glaube, dass diese einen großen Unterschied machen werden:

  1. Ergänzen Sie die kAudioFormatFlagsNativeEndian Eigenschaft zu Ihren Formatflags
  2. Setzen Sie die ausdrücklich die mReserved Feld bis 0.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top