在 Spotify iOS SDK 中混合两个 AUNode

Mix two AUNodes in Spotify iOS SDK

我正在尝试使用动态处理器和一堆过滤器来压缩 spotify 方法中的特定频带 connectOutputBus 但是当我在 kAudioUnitSubType_MultiChannelMixer 中混合节点时只有声音第一个添加的节点出来。

obs:我实际上在 sourceNodeCopy 上使用过滤器来删除将在 souceNode 上压缩的频率,但为了简短起见,我省略了它们。

代码如下:

override func connectOutputBus(_ sourceOutputBusNumber: UInt32, ofNode  sourceNode: AUNode, toInputBus destinationInputBusNumber: UInt32, ofNode destinationNode: AUNode, in graph: AUGraph!) throws {

  let sourceNodeCopy = sourceNode //original node without the harsh freq

  //create a filter for the harsh frequencies
  var filterDescription = AudioComponentDescription()
  filterDescription.componentType = kAudioUnitType_Effect
  filterDescription.componentSubType = kAudioUnitSubType_BandPassFilter
  filterDescription.componentManufacturer = kAudioUnitManufacturer_Apple
  filterDescription.componentFlags = 0
  filterDescription.componentFlagsMask = 0

  AUGraphAddNode(graph, &filterDescription, &filterNode!) // Add the filter node
  AUGraphNodeInfo(graph, filterNode!, nil, &filterUnit!) // Get the Audio Unit from the node
  AudioUnitInitialize(filterUnit!) // Initialize the audio unit
  // Set filter params
  AudioUnitSetParameter(filterUnit!, kBandpassParam_CenterFrequency, kAudioUnitScope_Global, 0, 10038, 0)

  //create a processor to compress the frequency
  var dynamicProcessorDescription = AudioComponentDescription()
  dynamicProcessorDescription.componentType = kAudioUnitType_Effect
  dynamicProcessorDescription.componentSubType = kAudioUnitSubType_DynamicsProcessor
  dynamicProcessorDescription.componentManufacturer = kAudioUnitManufacturer_Apple
  dynamicProcessorDescription.componentFlags = 0
  dynamicProcessorDescription.componentFlagsMask = 0

  // Add the dynamic processor node
  AUGraphAddNode(graph, &dynamicProcessorDescription, &dynamicProcessorNode)
  AUGraphNodeInfo(graph, dynamicProcessorNode, nil, &dynamicProcessorUnit)
  AudioUnitInitialize(dynamicProcessorUnit!)

  // Set compressor params
  AudioUnitSetParameter(dynamicProcessorUnit!, kDynamicsProcessorParam_Threshold, kAudioUnitScope_Global, 0, -35, 0)
  AudioUnitSetParameter(dynamicProcessorUnit!, kDynamicsProcessorParam_AttackTime, kAudioUnitScope_Global, 0, 0.02, 0)
  AudioUnitSetParameter(dynamicProcessorUnit!, kDynamicsProcessorParam_ReleaseTime, kAudioUnitScope_Global, 0, 0.04, 0)
  AudioUnitSetParameter(dynamicProcessorUnit!, kDynamicsProcessorParam_HeadRoom, kAudioUnitScope_Global, 0, 0, 0)

  //mixer
  var mixerDescription = AudioComponentDescription()
  mixerDescription.componentType = kAudioUnitType_Mixer
  mixerDescription.componentSubType = kAudioUnitSubType_MultiChannelMixer
  mixerDescription.componentManufacturer = kAudioUnitManufacturer_Apple
  mixerDescription.componentFlags = 0
  mixerDescription.componentFlagsMask = 0

  AUGraphAddNode(graph, &mixerDescription, &audioEffectsController.mixerNode)
  AUGraphNodeInfo(graph, audioEffectsController.mixerNode, nil,
                    &audioEffectsController.mixerUnit)
  AudioUnitInitialize(audioEffectsController.mixerUnit!)

  AudioUnitSetParameter(mixerUnit!, kMultiChannelMixerParam_Volume, kAudioUnitScope_Input, 0, 1.0, 0);
    AudioUnitSetParameter(mixerUnit!, kMultiChannelMixerParam_Volume, kAudioUnitScope_Output, 0, 1.0, 0);


  //connect the nodes
  AUGraphConnectNodeInput(graph, sourceNode, sourceOutputBusNumber, filterNode, 0)
  AUGraphConnectNodeInput(graph, filterNode, sourceOutputBusNumber, dynamicProcessorNode, 0)

  AUGraphConnectNodeInput(graph, sourceNodeCopy, sourceOutputBusNumber, mixerNode, 0)
  AUGraphConnectNodeInput(graph, fiterNode, sourceOutputBusNumber, mixerNode, 0)

  //connect the mixer to the output
  AUGraphConnectNodeInput(graph, audioEffectsController.mixerNode, 0, destinationNode, destinationInputBusNumber)

在您的代码中,您像这样连接节点

AUGraphConnectNodeInput(graph, sourceNodeCopy, sourceOutputBusNumber, mixerNode, 0)
AUGraphConnectNodeInput(graph, fiterNode, sourceOutputBusNumber, mixerNode, 0)

如果这样做,您会将 sourceNodeCopyfilterNode 连接到 MixerNode 的相同输入 (0)。但是只能连接一个...

你应该试试这个

AUGraphConnectNodeInput(graph, sourceNodeCopy, sourceOutputBusNumber, mixerNode, 0)
AUGraphConnectNodeInput(graph, fiterNode, sourceOutputBusNumber, mixerNode, 1)