Я пытаюсь микшировать звук из нескольких аудиоисточников с помощью Audio Units. Структура довольно проста: у меня есть два входа, аудиоблок микшера и общий выход. Проблема в том, что буферы выходного AudioUnit заполняются только нулями.
Входные данные передаются через AURenderCallbackStruct непосредственно в микшер.
Подтип вывода — kAudioUnitSubType_GenericOutput для извлечения микшированного звука вручную, не воспроизводя его. . Выход подключается через AudioUnitConnection, чтобы избежать использования устаревшего AUGraph. AVAudioSession нельзя использовать для совместимости с ReplayKit.
Я удалил все проверки OSStatus, чтобы предоставить более короткую версию код; однако все методы Audio Unit возвращают noErr. Метод установки:
Я пытаюсь микшировать звук из нескольких аудиоисточников с помощью Audio Units. Структура довольно проста: у меня есть два входа, аудиоблок микшера и общий выход. Проблема в том, что буферы выходного AudioUnit заполняются только нулями. [list] [*]Входные данные передаются через AURenderCallbackStruct непосредственно в микшер. [*]Подтип микшера — kAudioUnitSubType_MultiChannelMixer. [*]Подтип вывода — kAudioUnitSubType_GenericOutput для извлечения микшированного звука вручную, не воспроизводя его. . Выход подключается через AudioUnitConnection, чтобы избежать использования устаревшего AUGraph. AVAudioSession нельзя использовать для совместимости с ReplayKit. [/list] Я удалил все проверки OSStatus, чтобы предоставить более короткую версию код; однако все методы Audio Unit возвращают noErr. Метод установки: [code]private func setupAudioUnits() { // Setting up mixer unit var mixerComponentDescription = AudioComponentDescription( componentType: kAudioUnitType_Mixer, componentSubType: kAudioUnitSubType_MultiChannelMixer, componentManufacturer: kAudioUnitManufacturer_Apple, componentFlags: 0, componentFlagsMask: 0) let mixerComponent = AudioComponentFindNext(nil, &mixerComponentDescription) AudioComponentInstanceNew(mixerComponent!, &mixerAudioUnit) guard let mixerAudioUnit else { fatalError() }
var streamFormat = outputFormat.streamDescription.pointee AudioUnitSetProperty(mixerAudioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 0, &streamFormat, UInt32(MemoryLayout.size))
AudioUnitInitialize(mixerAudioUnit)
var busCount = UInt32(inputs) AudioUnitSetProperty(mixerAudioUnit, kAudioUnitProperty_ElementCount, kAudioUnitScope_Input, 0, &busCount, UInt32(MemoryLayout.size))