なぜこのオーディオユニットのremoteioの初期化はiPhoneで動作しますが、シミュレータでは機能しませんか?

StackOverflow https://stackoverflow.com/questions/3809377

質問

オーディオユニットサービスを使用して、合成されたオーディオを一緒にミックスできるように、出力レンダリングコールバックをセットアップしています。私が持っているコードは、私が持っているデバイス(iPod Touch、iPhone 3G、およびiPad)で完全に動作しているようですが、シミュレーターでは動作しません。

シミュレータでは、AudiounitInitialise関数が失敗し、-10851(kaudiouniterr_invalidpropertyvalue)の値を返します。

これが私の初期化コードです。このAPIの経験がある人は、ここで間違っていることを見るよりも多くの人がいますか?

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

}

私のXcodeバージョンは3.2.2(64ビット)です私のシミュレーターバージョンは3.2です(ただし、同じ問題は3.1.3デバッグまたはリリースで発生します)

ありがとう、私はそれを感謝します!

役に立ちましたか?

解決

デバイスとシミュレータ用のコンパイルはまったく異なります。最も一般的なものには、同じ予想される結果があります。たとえば、ビュースイッチを再生するなどを読み込むなど。ただし、10個のバッファーをオープンロードしてサウンドを再生してからそれらを切り替えるなど、シミュレータはそれを処理できませんが、デバイスはそれを処理できません。

私が見る方法は、私が気にかけているすべてのデバイスで動作する限りです。デバイスで正常に動作するときに、シミュレーターでアプリケーションを動作させるためだけに髪を引き抜かないでください。

それが役立つことを願っています

PK

他のヒント

remoteio初期化コードを呼び出す前に、オーディオセッションを構成して有効にしましたか?

入力バスにストリームプロパティを設定している場合、使用しています kOutputBus 入力スコープ用。それはおそらく良くないでしょう。また、出力のためだけに必要なので、おそらくグローバルスコープにレンダリングコールバックを適用する必要はありません。さらに、私はあなたの定義があると思います kOutputBuskInputBus 間違っています...ワーキングiPhoneオーディオコードを見ると、入力バスに0、出力バスに1が使用されます。

また、AudioStreamBasicdescriptionに関していくつかの小さなことを考えることもできますが、これらが大きな違いを生むとは思わない:

  1. 追加します kAudioFormatFlagsNativeEndian フォーマットフラグのプロパティ
  2. 明示的に設定します mReserved フィールド0。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top