2016-04-11 9 views
2

これは、前の質問へのフォローアップである:私はおそらくinNumberFrames入力コールバックのIOバッファ時間を兼ね備えを設定するためのAudioUnitのAPIがどうなるかを把握しようとしています OSX CoreAudio: Getting inNumberFrames in advance - on initialization?OSX:IOバッファ長を設定するCoreAudio API?

単一の場合HALオーディオコンポーネントインスタンスOSX(プラグインではありません!) iOSでこれをどのように達成できるかについての包括的なドキュメントがあることを理解していますが、APIのどちらでもOSXでこれらの値を設定するためのドキュメントを見つけたり見つけたりすることはできません。 ウェブには、「」から「サンプルレートと優先バッファ時間を要求するオーディオユニットAPIがあります...」から「」の範囲の妥当な文章が含まれていますが、確かにフレーム数は取得できますが、現在のコールバックコールの場合にのみ... "。

少なくともOSXでの入力・選択されたサンプリング・レートのために、システムによってinNumberFramesまたはオーディオバッファ長 offerdを取得(およびへの適応)の方法はありますか?例えば、44.1kとその倍数(これは部分的にうまくいくようです)、48kとその倍数(これはまったく動作しないようですが、バッファを適応させるためのハックはどこにありますか分かりませんこれらの値にlenfth)?ここでは、コンソールのプリントアウトです:

Available 7 Sample Rates 
Available Sample Rate value : 8000.000000 
Available Sample Rate value : 16000.000000 
Available Sample Rate value : 32000.000000 
Available Sample Rate value : 44100.000000 
Available Sample Rate value : 48000.000000 
Available Sample Rate value : 88200.000000 
Available Sample Rate value : 96000.000000 

.mSampleRate   = 48000.00 
.mFormatID   = 1819304813 
.mBytesPerPacket  = 8 
.mFramesPerPacket  = 1 
.mBytesPerFrame  = 8 
.mChannelsPerFrame = 2 
.mBitsPerChannel  = 32 
.mFormatFlags   = 9 
_mFormatHumanReadable = kAudioFormatFlagIsFloat 
    kAudioFormatFlagIsPacked 
    kLinearPCMFormatFlagIsFloat 
    kLinearPCMFormatFlagIsPacked 
    kLinearPCMFormatFlagsSampleFractionShift 
    kAppleLosslessFormatFlag_16BitSourceData 
    kAppleLosslessFormatFlag_24BitSourceData 

expectedInNumberFrames = 512 

Couldn't render in current context (Error -10863) 

期待inNumberFramesがシステムから読み込まれる:

UInt32 expectedInNumberFrames = 0; 
UInt32 propSize = sizeof(UInt32); 
AudioUnitGetProperty(gInputUnitComponentInstance, 
        kAudioDevicePropertyBufferFrameSize, 
        kAudioUnitScope_Global, 
        0, 
        &expectedInNumberFrames, 
        &propSize); 

おかげで、事前に正しい方向に私を指しているために!

答えて

2

は、このAppleのテクニカルノートを参照してください:https://developer.apple.com/library/mac/technotes/tn2321/_index.html#//apple_ref/doc/uid/DTS40013499-CH1-THE_I_O_BUFFER_SIZE

)は(GetIOBufferFrameSizeRangeのために、このテクニカルノートでOS Xのコード例を参照してください、GetCurrentIOBufferFrameSize()、およびSetCurrentIOBufferFrameSize()。

許可された範囲を返すAPIプロパティがあり、プロパティセッターでエラーが返されることに注意してください。また、さまざまなMacの省電力モードでは、アプリケーションの実行中にバッファサイズが変更される可能性があるので、実際のバッファサイズinNumberFramesは、オーディオユニットが動作を開始するまで一定ではないかもしれません。

通常のバッファサイズ(2の累乗ではありません)が得られた場合、特定のアップル製品モデルの実際のオーディオハードウェアが固定または制限されたオーディオサンプルレートの範囲にあり、OSソフトウェアが使用されている可能性がありますアプリケーションが回路基板上の実際のコーデックチップでサポートされていないサンプルレートを要求した場合、そのハードウェアに応じてオーディオユニットコールバックに送信されるバッファをリサンプリングしてサイズ変更します。

+0

ありがとう、@ hotpaw2私は前にこのリンクを見たことがありますが、この** TN **の内容に細心の注意を払う代わりに、難しいタイトル "**オーディオI/O中の電力節約 - kAudioHardwarePropertyPowerHintプロパティ**"私にそれを指摘してくれてありがとう。この** TN **に準拠してコードを書き直すと、いくつかの外部ハイエンドハードウェアデバイスに関する他の質問が出てくることは確かです。私はこの問題に対する「私の解決策を見つけるのに最も役立つ」という答えを受け入れます。 – user3078414

関連する問題