How to handle input in a AUv3 render block from the host perspective

问题描述 投票:0回答:0

我正在尝试为 iOS 编写 AUv3 主机,但我遇到了处理音频输入的问题。

我已经可以处理 AUv3 的声音输出,但是在使用 FX 时,我无法将音频传递到 AUv3 单元。

我用输入参数调用 AURenderBlock,填充相应的 AURenderPullInputBlock。

render 方法具有指向将从代码的 C++ 内核端调用的输出和输入的指针。

如果我打印输入数据缓冲区,输入数据被正确放置但是,我可以看到正在打印的音频数据但是音频单元似乎没有接收到这个音频输入因此我无法理解输出是否也被放置在输出缓冲区上。

有人能告诉我这里缺少什么吗?我错过了什么?

- (void)render:(IAudioSample*)outL rightChannel:(IAudioSample*)outR leftIn:(IAudioSample*)inL rightIn:(IAudioSample*)inR frames:(int)frames
{
  if (_ready)
  {
    AudioUnitRenderActionFlags flags = 0;
     
    if (_isEffect)
    {
      memcpy((IAudioSample *)_inputBuffers[0].mBuffers[0].mData, inL, sizeof(IAudioSample)*frames);
      memcpy((IAudioSample *)_inputBuffers[0].mBuffers[1].mData, inR, sizeof(IAudioSample)*frames);
       
      _auRenderBlock(&flags, &_renderTimeStamp, frames, 0, _outputBuffers,
        (AURenderPullInputBlock)^(AudioUnitRenderActionFlags *actionFlags, const AudioTimeStamp *timestamp, AUAudioFrameCount frameCount, NSInteger inputBusNumber, AudioBufferList *inputData)
        {
          memcpy((IAudioSample *)inputData[inputBusNumber].mBuffers[0].mData, (IAudioSample *)_inputBuffers[inputBusNumber].mBuffers[0].mData, sizeof(IAudioSample)*frameCount);
          memcpy((IAudioSample *)inputData[inputBusNumber].mBuffers[1].mData, (IAudioSample *)_inputBuffers[inputBusNumber].mBuffers[1].mData, sizeof(IAudioSample)*frameCount);
        }
      );
    }
    else
    {
      _auRenderBlock(&flags, &_renderTimeStamp, frames, 0, _outputBuffers, NULL);
    }
     
    memcpy(outL, (IAudioSample *)_outputBuffers[0].mBuffers[0].mData, sizeof(IAudioSample)*frames);
    memcpy(outR, (IAudioSample *)_outputBuffers[0].mBuffers[1].mData, sizeof(IAudioSample)*frames);
     
    unsigned int sampleTime = _renderTimeStamp.mSampleTime + frames;
     
    _renderTimeStamp.mSampleTime = sampleTime;
  }
}
ios audio signal-processing auv3
© www.soinside.com 2019 - 2024. All rights reserved.