2016-04-11 45 views
2

這是一個後續到以前的問題: OSX CoreAudio: Getting inNumberFrames in advance - on initialization?OSX:用於設置IO緩衝區長度的CoreAudio API?

我試圖找出什麼將是AudioUnit API的可能設置inNumberFrames較受歡迎的輸入回調的IO的緩存時間對於單個HAL音頻組件實例OSX(不是插件!)。 雖然我知道有一個全面的文檔,說明如何在iOS中實現這一點,通過AVAudioSession API,我既不能找出也沒有找到有關在OSX中設置這些值的文檔,無論哪個API。 該網站充滿了專家,但衝突的聲明範圍從「有一個音頻單元API請求採樣率和首選緩衝區的時間...」,以「你可以肯定得到的幀數,但僅用於當前的回撥呼叫...「。

是否有至少獲得(和適應)的inNumberFrames音頻緩衝器長度 offerd由系統,用於在OSX輸入選擇的採樣率的方法嗎?例如,對於44.1k及其倍數(似乎部分起作用),以及48k及其倍數(這似乎根本不起作用,我不知道允許修改緩衝區的破解在哪裏爲這些價值增加)?這裏的控制檯打印:

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

看到這個蘋果技術說明:https://developer.apple.com/library/mac/technotes/tn2321/_index.html#//apple_ref/doc/uid/DTS40013499-CH1-THE_I_O_BUFFER_SIZE

看到OS X示例代碼在此技術說明爲GetIOBufferFrameSizeRange(),GetCurrentIOBufferFrameSize(),和SetCurrentIOBufferFrameSize()。

請注意,有一個API屬性返回一個允許的範圍,並在屬性設置器上返回一個錯誤。另請注意,各種Mac省電模式可能會在應用程序運行時更改緩衝區大小,因此實際的緩衝區大小inNumberFrames可能不會保持不變,或者甚至在音頻單元開始運行時纔會知道。

如果您獲得不正常的緩衝區大小(不是2的冪),則可能是某個Apple產品型號上的實際音頻硬件具有固定或有限範圍的音頻採樣率,因此正在使用OS軟件如果應用程序請求電路板上的實際編解碼器芯片不支持的採樣率,則重新採樣並因此根據硬件調整發送到音頻單元回調的緩衝區的大小。

+0

非常感謝,@ hotpaw2。我之前已經看到過這個鏈接,但是因爲棘手的標題「**在音頻I/O期間省電--kAudioHardwarePropertyPowerHint屬性**」跑過了它,而不是密切關注這個** TN **的內容。非常感謝你指點我。一旦我按照這個** TN **重新編寫代碼,我相信我還會遇到其他一些外部高端硬件設備的問題。我將接受爲解決問題提供「最有幫助的解決方案」的答案。 – user3078414