2016-07-20 8 views
4

iOS 9のアプリケーション間オーディオセッション中に入力を録音しようとしました。スピーカー出力はうまく聞こえますが、録音ファイルにはリズムのあるクリック音があります。 波形は以下のように見える...アプリ間オーディオ録音中にクリックする

enter image description here

私は、私は考えることができると何も動いていないようにみえすべての設定やパラメータを微調整しています。ここで

はここ

 //connect instrument to output 
AudioComponentDescription componentDescription = unit.componentDescription; 
AudioComponent inputComponent = AudioComponentFindNext(NULL, &componentDescription); 
OSStatus status = AudioComponentInstanceNew(inputComponent, &_instrumentUnit); 
NSLog(@"%d",status); 
AudioUnitElement instrumentOutputBus = 0; 
AudioUnitElement ioUnitInputElement = 0; 

    //connect instrument unit to remoteIO output's input bus 
AudioUnitConnection connection; 
connection.sourceAudioUnit = _instrumentUnit; 
connection.sourceOutputNumber = instrumentOutputBus; 
connection.destInputNumber = ioUnitInputElement; 
status = AudioUnitSetProperty(_ioUnit, 
           kAudioUnitProperty_MakeConnection, 
           kAudioUnitScope_Output, 
           ioUnitInputElement, 
           &connection, 
           sizeof(connection)); 
NSLog(@"%d",status); 
UInt32 maxFrames = 1024; //I tried setting this to 4096 but it did not help 
status = AudioUnitSetProperty(_instrumentUnit, 
           kAudioUnitProperty_MaximumFramesPerSlice, 
           kAudioUnitScope_Output, 
           0, 
           &maxFrames, 
           sizeof(maxFrames)); 
NSLog(@"%d",status); 



_connectedInstrument = YES; 
_instrumentIconImageView.image = unit.icon; 
NSLog(@"Remote Instrument connected"); 
status = AudioUnitInitialize(_ioUnit); 
NSLog(@"%d",status); 
status = AudioOutputUnitStart(_ioUnit); 
NSLog(@"%d",status); 
status = AudioUnitInitialize(_instrumentUnit); 
NSLog(@"%d",status); 
[self setupFile]; 

...私のコールバックです...ここで

AudioStreamBasicDescription fileFormat; 
fileFormat.mSampleRate   = kSessionSampleRate; 
fileFormat.mFormatID   = kAudioFormatLinearPCM; 
fileFormat.mFormatFlags   = kAudioFormatFlagsNativeFloatPacked; 
fileFormat.mFramesPerPacket  = 1; 
fileFormat.mChannelsPerFrame = 1; 
fileFormat.mBitsPerChannel  = 32;  //tone is correct but there is still pops 
fileFormat.mBytesPerPacket  = sizeof(Float32); 
fileFormat.mBytesPerFrame  = sizeof(Float32); 

は、ストリームの設定です...書式設定(ストリームの設定が同一である)されています

static OSStatus recordingCallback(void        *inRefCon, 
           AudioUnitRenderActionFlags   *ioActionFlags, 
           const AudioTimeStamp    *inTimeStamp, 
           UInt32        inBusNumber, 
           UInt32        inNumberFrames, 
           AudioBufferList     *ioData) 
{ 
    ViewController* This = This = (__bridge ViewController *)inRefCon; 
    if (inBusNumber == 0 && !(*ioActionFlags & kAudioUnitRenderAction_PostRenderError)) 
    { 
      ExtAudioFileWriteAsync(This->fileRef, inNumberFrames, ioData); 
    } 

    return noErr; 
} 

Full view controller code here

ご協力ありがとうございます。

+0

これはデバイスまたはシミュレータ上のものですか? – dave234

+0

@DaveはiPad Mini 2でそれを公開しました。 – Pescolly

+0

それを考え出しました。フラグをチェックして、レンダリングコールバックをIOユニットに転送しなければなりませんでした。 – Pescolly

答えて

5

プレレンダリングとポストレンダリングをファイルに書き込んでいます。あなたのレンダリングコールバックで、ポストレンダリングだけを書くようにifステートメントを変更してください。それは最初の書き込み前首相も限りレンダリングコールバックで使用するために細かいですので

if (inBusNumber == 0 && *ioActionFlags == kAudioUnitRenderAction_PostRender){ 
    ExtAudioFileWriteAsync(This->fileRef, inNumberFrames, ioData); 
} 

ExtAudioFileWriteAsyncは、いくつかの内部コピーやバッファリングを行います。

+0

プライミングすることでこれを行うことを意味しますか? ExtAudioFileWriteAsync(fileRef、0、NULL); – Pescolly

+0

@Pescollyこれは、内部リングバッファを設定します。 – dave234

1

あなたは両方をチェックする必要がありますほとんどの場合:

  • ポストエラーレンダリング

    • ポストレンダリングするアクションフラグあなたのコールバックの重要な部分

    おそらく意志このように見える必要があります:

    if (*ioActionFlags & kAudioUnitRenderAction_PostRender){ 
        static int TEMP_kAudioUnitRenderAction_PostRenderError = (1 << 8); 
        if (!(*ioActionFlags & TEMP_kAudioUnitRenderAction_PostRenderError)) 
        { 
         ExtAudioFileWriteAsync(This->fileRef, inNumberFrames, ioData); 
         //whichever additional code needed 
         // { … } 
        } 
    
  • 関連する問題