2011-02-01 15 views
4

私の問題はAudioUnitsです。 (Objective-CのXcodeので)iPhone用voicechangingアプリケーションを設計するために、私はこのウェブサイトからRemoteIO AudioUnitのサンプルを使用します。AudioUnitバッファの長さを調整する

http://atastypixel.com/blog/using-remoteio-audio-unit/

AudioUnitのバッファは256個のサンプルの長さに設定されています。私のプロジェクトでは、もっとたくさんのことが必要です(約22050)。 引用されたページのAudioUnitバッファの長さは次のように調整することができると述べている:

float aBufferLength = 0.005; // In seconds 
AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration, 
         sizeof(aBufferLength), &aBufferLength); 

今私の具体的な質問:AudioSessionが使用されていないため、上記のコードは、前述のAudioUnitに適していない、初期化されていないとエラーが発生します。 "kAudioSessionProperty_PreferredHardwareIOBufferDuration"を除いて、バッファの持続時間を調整する他の可能性はありますか? ドキュメントはこの場合にはあまり役に立ちません。 Lukasに事前に感謝します。

+0

私の回答に関連するコードを追加しました。 –

答えて

7

RemoteIOオーディオユニットでAudioSessionを定義して初期化することに問題はなく、これが目的のバッファ長を設定する方法です。私はちょうどこれをやっているいくつかのコードを持っていますが、帰るまで数時間かかるでしょう。 AppleのAurioTouch code-sampleを見るか、後で投稿するまで待つことができます。

とにかく心の中で2つの物事を保つ:

  1. バッファ長がデバイス上でのみ変更されますので、あなたはそれを変更し、シミュレータには何の違いを見ていない場合も驚かないでください。
  2. バッファ長を取得することはできません。そのため、プロパティはPreferredHardwareIOBufferDurationです。バッファサイズは常に2の累乗です。

これを念頭において、独自のバッファを割り当てて、必要なサンプル数に達するまで蓄積してみましたか?

EDIT

オーディオセッションを初期化するためのコードが

(オーディオユニットの前に行くべきでは初期化されます):あなたが/を探すために各呼び出しの後resultを調べる必要がありますすることができ

OSStatus result; 
result = AudioSessionInitialize(NULL, NULL, NULL, NULL); 

UInt32 audioCategory = kAudioSessionCategory_PlayAndRecord; 
result = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(audioCategory), &audioCategory); 

// set preferred buffer size 
Float32 preferredBufferSize = .04; // in seconds 
result = AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration, sizeof(preferredBufferSize), &preferredBufferSize); 

// get actuall buffer size 
Float32 audioBufferSize; 
UInt32 size = sizeof (audioBufferSize); 
result = AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareIOBufferDuration, &size, &audioBufferSize); 

result = AudioSessionSetActive(true); 

可能なエラー。 詳細についてはAudioSessionInitializeのドキュメントを読むことができますが、4つの引数すべてにNULLを渡しても動作します。たとえば、割り込みリスナーのコールバックを確立する必要がある場合は、これを変更する必要があります。

+0

その有用な答えをありがとう!私はすぐにそれをテストし、私の経験を投稿します。しかし、バッファの長さがデバイス上でのみ変化すると私が考えるのは難しいです...連続した関数が長いバッファを入力として必要とする場合はどうでしょうか?それはシミュレータで正常に動作しませんが、アイフォーン上で正常に動作しないという意味ですか? – Lukas

+0

'連続機能 'とはどういう意味ですか?とにかく、オーディオハードウェアはあなたのニーズには関係しません。必要なときにN個のサンプルを再生する(再生コールバックで)、またはN個のサンプルを処理する折り返し電話)。あなたがもっと必要な場合は、十分になるまで蓄積し、待つべきです。 –

関連する問題