2

しばらくして、オーディオ ユニットを使って開発していると、低レベルのオーディオ バッファを扱う開発者によく知られているバグがあることがわかりました。

バグは、Mac のバッファ サイズが正しくなく、iDevice の同じソフトウェアが 1024 を表示する 1024 ではなく、512 を表示することです。

質問は、それを解決する方法があるので、Mac でも 1024 ビットのバッファを取得できますか? シミュレーションはデバイスとは異なるため、そのように作業するのは少し難しいです。

これは、マイク入力からバッファをチェックするコールバック関数です:

static OSStatus recordingCallback(void *inRefCon,
                                  AudioUnitRenderActionFlags *ioActionFlags,
                                  const AudioTimeStamp *inTimeStamp,
                                  UInt32 inBusNumber,
                                  UInt32 inNumberFrames,
                                  AudioBufferList *ioData)
{

    AudioBuffer buffer;
    buffer.mNumberChannels = 1;
    buffer.mDataByteSize = inNumberFrames * 2;  
    buffer.mData = NULL; 

    AudioBufferList bufferList;
    bufferList.mNumberBuffers = 1;
    bufferList.mBuffers[0] = buffer;
    OSStatus status;
    status = AudioUnitRender(audioUnit,
                             ioActionFlags,
                             inTimeStamp,
                             inBusNumber,
                             inNumberFrames,
                             &bufferList);


     int16_t *q = (int16_t *)(&bufferList)->mBuffers[0].mData;


//  inNumberFrames, is 512 on a mac ,and 1024 on a device 

(スピーカー出力のコールバックは、ちなみに同じです=512ビット)。

オーディオユニットの設定の一部:

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

さて、私はここで、誰かがあなたがMac(Retinaは私のものです)にmidiツールのサンプルレートを設定しなければならないと言っているのを見つけました、私はそれをチェックしますが、そこには44100があります. チャネルは 24 ビットです。16 ビットで試しましたが、良い結果は得られませんでした。私のMacではまだ512ビットのバッファサイズです。Mac Retina ディスプレイ 2012 を使用しています。

4

1 に答える 1

2

考慮すべき点がいくつかあります: 1) オーディオ ユニットは、ホストによって設定されたバッファ サイズを持つように作られています。最小バッファ サイズを設定します。

そうは言っても、AUBase クラスのより多くの関数をオーバーライドすることで、適切と思われるようにコードをカスタマイズできます。私の知る限り、最小バッファ サイズを設定する方法はありません。できることは、必要な数に達するまでフレームをバッファに保存してから、フレームを送信することです。遅延効果の循環バッファーのように。

特定のフレーム数が必要な理由はありますか?

于 2013-09-27T07:24:13.363 に答える