2016-04-30 9 views
1

このシンプルなアプリケーションを実行すると、非常に騒々しいひどい歪み音が聞こえます。私は単純にデフォルト出力ユニットをインスタンス化し、レンダリングコールバックを割り当てます。また、プログラムをrunloopで実行させます。 Core Audioからエラーは検出されず、この歪み以外はすべて正常に動作します。出力からの歪みオーディオユニット

#import <AudioToolbox/AudioToolbox.h> 


OSStatus render1(void *inRefCon, 
       AudioUnitRenderActionFlags *ioActionFlags, 
       const AudioTimeStamp *inTimeStamp, 
       UInt32 inBusNumber, 
       UInt32 inNumberFrames, 
       AudioBufferList * ioData) 
{ 
    return noErr; 
} 

int main(int argc, const char * argv[]) { 
    AudioUnit timerAU; 
    UInt32 propsize = 0;  

    AudioComponentDescription outputUnitDesc; 
    outputUnitDesc.componentType   = kAudioUnitType_Output; 
    outputUnitDesc.componentSubType  = kAudioUnitSubType_DefaultOutput; 
    outputUnitDesc.componentManufacturer = kAudioUnitManufacturer_Apple; 
    outputUnitDesc.componentFlags   = 0; 
    outputUnitDesc.componentFlagsMask  = 0; 

    //Get RemoteIO AU from Audio Unit Component Manager 
    AudioComponent outputComp = AudioComponentFindNext(NULL, &outputUnitDesc); 

    if (outputComp == NULL) exit (-1); 

    CheckError(AudioComponentInstanceNew(outputComp, &timerAU), "comp");  

    //Set up render callback function for the RemoteIO AU. 
    AURenderCallbackStruct renderCallbackStruct; 
    renderCallbackStruct.inputProc = render1; 
    renderCallbackStruct.inputProcRefCon = nil;//(__bridge void *)(self); 

    propsize = sizeof(renderCallbackStruct); 

    CheckError(AudioUnitSetProperty(timerAU, 
            kAudioUnitProperty_SetRenderCallback, 
            kAudioUnitScope_Global, 
            0, 
            &renderCallbackStruct, 
            propsize), "set render"); 

    CheckError(AudioUnitInitialize(timerAU), "init");  

    // tickMethod = completion; 

    CheckError(AudioOutputUnitStart(timerAU), "start"); 

    CFRunLoopRunInMode(kCFRunLoopDefaultMode, 1000, false); 

} 
+0

適切に書式を設定することで、コードを読みやすくするようにしてください... – user3078414

答えて

1

あなたの質問は完全ではないようです。おそらく未定義の動作である出力ノイズを抑制する副作用についてはわかりません。私はまたあなたのコードがそのように役立つだろうか分からない。 kAudioUnitSubType_DefaultOutputには未完了のレンダリングコールバックがありますが、何もしません(ではなく、は無音です)。私はそれを沈黙させる2つの方法を知っています。彼らは空に初期化される保証はありませんので、ioDataバッファは、明示的にゼロで満たされなければならコールバックで

Float32 * lBuffer0; 
Float32 * lBuffer1; 
lBuffer0 = (Float32 *)ioData->mBuffers[0].mData; 
lBuffer1 = (Float32 *)ioData->mBuffers[1].mData; 
memset(lBuffer0, 0, inNumberFrames*sizeof(Float32)); 
memset(lBuffer1, 0, inNumberFrames*sizeof(Float32)); 

他の可能性はそのまま未完コールバックを残しますが、宣言することですtimerAUoutputUnitDesc.componentSubType = kAudioUnitSubType_HALOutput;
代わり
outputUnitDesc.componentSubType = kAudioUnitSubType_DefaultOutput;
であることと、明示的に次のコードを用いて描画するコールバックを設定する前にI/Oを無効にする:

UInt32 lEnableIO = 0; 
CheckError(AudioUnitSetProperty(timerAU, 
          kAudioOutputUnitProperty_EnableIO, 
          kAudioUnitScope_Output, 
          0, //output element 
          &lEnableIO, 
          sizeof(lEnableIO)), 
"couldn't disable output"); 

CoreAudio APIを徹底的に調べ、オーディオユニットの設定方法を理解することを強くお勧めします。このことを理解する上でこれは重要です。あなたのコードにはRemoteIO AUというコメントがあります。 OSXにはRemoteIO AUのようなものはありません。 iOSコードからポートを試している場合は、その違いを覚えてみてください。彼らはよく文書化されています。

+0

ええ、ありがとう、私は歪みが私のプログラムのヒープに残っている非mem-settedメモリによって引き起こされたことに気づいたioDataのバッファです。私は単にそれらをループし、私のフロート型のサンプルをゼロにしましたが、私はあなたのmemset呼び出しがより効率的だと思います。確かにこれはiOSのポートであり、remoteIOはiOS固有の構成要素であり、削除するのを忘れてしまったのは残ったコメントだけだったことを認識しています。出力を無効にすることをお勧めしたいと思います.HALユニットを(恐らくサブクラス化された)デフォルト出力の代わりに試してみるのも面白いですね。それは何の意味ですか? –

+0

この歪みの原因は私のプログラムの意図から来ます。私はこのレンダリングコールバックを一定の間隔でリアルタイム関数呼び出しのソースとして使用しています。他のコールバックですべてのオーディオユニットのサウンド出力を行っているか、 midiメッセージをAUSamplerに送信します。したがって、初期化されていないノイズは、おそらく 'AudioUnitRender()'コールなしでHALに送信されます。レンダリングコールバックを実際に使用するとそこに存在します。私は、この適切なコールバックよりも定期的なタイミングで構築された私の "シーケンサー"の基礎があるのだろうか? –

+0

@ user5797668、AFAIK、 'kAudioUnitSubType_DefaultOutput'の出力は_open_なので、プログラムで割り当てられたバッファを消す必要があります沈黙。 'kAudioUnitSubType_HALOutput'では、セットアップ時にI/Oを無効にすることができます。私はCoreAudio APIがplain-Cなので、それを "サブクラス化"と呼んでいません。私の答えが助けてくれることを願う。 – user3078414

関連する問題