2011-12-14 18 views
1

コアオーディオとリモートIOを初めて使用しています。私はエンコードして送る320バイトのデータが必要です。また、毎秒最低50フレーム。これは私がやったことです:リモートIOオーディオが非常に騒々しい

AudioComponentDescription desc; 

    desc.componentType = kAudioUnitType_Output; 
    desc.componentSubType = kAudioUnitSubType_RemoteIO; 
    desc.componentFlags = 0; 
    desc.componentFlagsMask = 0; 
    desc.componentManufacturer = 0; 


    // Get component 
    AudioComponent inputComponent = AudioComponentFindNext(NULL, &desc); 

    // Get audio units 
     AudioComponentInstanceNew(inputComponent, &audioUnit); 

    // Enable IO for recording 
    UInt32 flag = 1;     AudioUnitSetProperty(audioUnit,  kAudioOutputUnitProperty_EnableIO,  kAudioUnitScope_Input,   kInputBus,  &flag,   sizeof(flag)); 

    // Enable IO for playback  AudioUnitSetProperty(audioUnit,  kAudioOutputUnitProperty_EnableIO,   kAudioUnitScope_Output,   kOutputBus, &flag,   sizeof(flag)); 

    UInt32 shouldAllocateBuffer = 1; 
    AudioUnitSetProperty(audioUnit, kAudioUnitProperty_ShouldAllocateBuffer,  kAudioUnitScope_Global, 1, &shouldAllocateBuffer, sizeof(shouldAllocateBuffer)); 

    // Describe format 
    audioFormat.mSampleRate = 8000.00; 
    audioFormat.mFormatID = kAudioFormatLinearPCM; 
    audioFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger|kAudioFormatFlagIsPacked; 
    audioFormat.mFramesPerPacket = 1; 
    audioFormat.mChannelsPerFrame = 1; 
    audioFormat.mBitsPerChannel = 16; 
    audioFormat.mBytesPerPacket = 2; 
    audioFormat.mBytesPerFrame = 2; 


    // Apply format AudioUnitSetProperty(audioUnit,  kAudioUnitProperty_StreamFormat,  kAudioUnitScope_Output, 1,   &audioFormat,  sizeof(audioFormat)); 

     AudioUnitSetProperty(audioUnit,  kAudioUnitProperty_StreamFormat,  kAudioUnitScope_Input,  0,  &audioFormat,  sizeof(audioFormat)); 

    // Set input callback 
    AURenderCallbackStruct callbackStruct; 
    callbackStruct.inputProc = recordingCallback; 
    callbackStruct.inputProcRefCon = self; 
     AudioUnitSetProperty(audioUnit,   kAudioOutputUnitProperty_SetInputCallback,   kAudioUnitScope_Global,   1,   &callbackStruct,   sizeof(callbackStruct)); 



    // Set output callback 
    callbackStruct.inputProc = playbackCallback; 
    callbackStruct.inputProcRefCon = self; 
     AudioUnitSetProperty(audioUnit, kAudioUnitProperty_SetRenderCallback,  kAudioUnitScope_Global,   0, &callbackStruct,  sizeof(callbackStruct)); 


    // Initialise 
    AudioUnitInitialize(audioUnit); 

    AudioOutputUnitStart(audioUnit); 

この設定では、デバイスで試したときにコールバックメソッドで186フレームを取得します。 Iはバッファによって割り当てられた:この372(2×186)から

bufferList = (AudioBufferList*) malloc(sizeof(AudioBufferList)); 
    bufferList->mNumberBuffers = 1; //mono input 
    for(UInt32 i=0;i<bufferList->mNumberBuffers;i++) 
    { 
      bufferList->mBuffers[i].mNumberChannels = 1; 
      bufferList->mBuffers[i].mDataByteSize = 2*186; 
      bufferList->mBuffers[i].mData = malloc(bufferList->mBuffers[i].mDataByteSize); 
    }  

がコールバックでバイト、私は320のバイトのデータを取り、私の要件ごとに使用されます。それは動作していますが、非常に騒々しいです。

誰か助けてください。私は大きな問題に陥っています。

+0

私も320バイトを使用し、それが問題の鍵ですか! – passol

答えて

1

提案のカップル -

  1. サンプルレートとバッファサイズはAVAudioSessionクラスを使用して設定します。
  2. 386は珍しい数のフレームです。あなたのコールバックは恐らく512または1024を求めているでしょう。リングバッファを使ってさまざまなバッファサイズ/フレームレートを変化させることができます。ここで

いくつかの例は以下のとおりです。

MixerHost
TimeCode

関連する問題