2016-04-11 11 views
2

Это является продолжением к предыдущему вопросу: OSX CoreAudio: Getting inNumberFrames in advance - on initialization?OSX: API CoreAudio для настройки длины буфера IO?

Я пытаюсь выяснить, что будет AudioUnit API для возможности установки inNumberFrames или предпочитали IO длительность буфера входного обратного вызова для одного HAL экземпляр аудио компонента в OSX (не подключаемый модуль!). Хотя я понимаю, что есть полная документация о том, как это может быть достигнуто в iOS, с помощью AVAudioSession API. Я не могу ни вычислить, ни найти документацию по настройке этих значений в OSX, в зависимости от того, какой API. В Интернете полно экспертных, но противоречивых заявлений от «. Существует API аудиоустройства для запроса частоты дискретизации и предпочтительной продолжительности буфера ...», до «». Вы можете определенно получить количество кадров, но только для текущего вызова обратного вызова ... ".

Есть ли способ, по крайней мере получения (и адаптации к) в inNumberFrames или аудио буфера длиной коллекции всемирно система, для входной выбранных частот дискретизации в OSX? Например, для 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

Смотрите этот яблоко Техническое примечание: 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, возвращающее разрешенный диапазон, и сообщение об ошибке возвращается в свойство setter. Также обратите внимание, что различные режимы экономии энергии Mac могут изменять размер буфера во время работы приложения, поэтому фактический размер буфера, inNumberFrames, может не оставаться постоянным или даже быть известным, пока не начнет работать Audio Unit.

Если вы получаете необычные размеры буфера (не 2), может случиться так, что фактическое аудиооборудование на определенной модели продукта Apple имеет фиксированный или ограниченный диапазон частот выборки аудио, и, таким образом, программное обеспечение ОС используется для повторной выборки и, таким образом, изменения размера буферов, отправляемых на обратные вызовы аудиоустройств в зависимости от этого оборудования, если приложение запрашивает частоту дискретизации, не поддерживаемую фактическими чипами кодеков на печатной плате.

+0

Большое спасибо, @ hotpaw2. Я видел эту ссылку раньше, но из-за сложного заголовка «** Экономия энергии во время аудио ввода/вывода - свойство kAudioHardwarePropertyPowerHint **» пробежало по нему, вместо того чтобы уделять более пристальное внимание содержимому этого ** TN **. Большое спасибо за то, что указали на меня. Уверена, что у меня возникнут другие вопросы, касающиеся нескольких внешних аппаратных устройств высокого класса, когда я смогу переписать код в соответствии с этим ** TN **.Я согласен с ответом на то, что я «наиболее полезен в поиске решения» этой проблемы. – user3078414