在Apple提供的aurioTouch项目中,我听说在performRender()函数下的AudioController文件中的AudioBufferList ioData将音频数据从麦克风传递到音频播放器吗?有人可以确认吗?这是代码:

// Render callback function
static OSStatus performRender (void                         *inRefCon,
                           AudioUnitRenderActionFlags   *ioActionFlags,
                           const AudioTimeStamp         *inTimeStamp,
                           UInt32                       inBusNumber,
                           UInt32                       inNumberFrames,
                           AudioBufferList              *ioData)
{
OSStatus err = noErr;
if (*cd.audioChainIsBeingReconstructed == NO)
{
    // we are calling AudioUnitRender on the input bus of AURemoteIO
    // this will store the audio data captured by the microphone in ioData
    err = AudioUnitRender(cd.rioUnit, ioActionFlags, inTimeStamp, 1, inNumberFrames, ioData);

    // filter out the DC component of the signal
    cd.dcRejectionFilter->ProcessInplace((Float32*) ioData->mBuffers[0].mData, inNumberFrames);

    // based on the current display mode, copy the required data to the buffer manager
    if (cd.bufferManager->GetDisplayMode() == aurioTouchDisplayModeOscilloscopeWaveform)
    {
        cd.bufferManager->CopyAudioDataToDrawBuffer((Float32*)ioData->mBuffers[0].mData, inNumberFrames);
    }

    else if ((cd.bufferManager->GetDisplayMode() == aurioTouchDisplayModeSpectrum) || (cd.bufferManager->GetDisplayMode() == aurioTouchDisplayModeOscilloscopeFFT))
    {
        if (cd.bufferManager->NeedsNewFFTData())
            cd.bufferManager->CopyAudioDataToFFTInputBuffer((Float32*)ioData->mBuffers[0].mData, inNumberFrames);
    }

    // mute audio if needed
    if (*cd.muteAudio)
    {
        for (UInt32 i=0; i<ioData->mNumberBuffers; ++i)
            memset(ioData->mBuffers[i].mData, 0, ioData->mBuffers[i].mDataByteSize);
    }
}

return err;
}

最佳答案

RemoteIO音频单元是既可以访问音频硬件输入(麦克风)又可以访问输出(扬声器)的组件。

输入从麦克风或缓冲区获取数据。输出将音频数据放入扬声器或缓冲区。

由于输入是从麦克风获取数据的,因此您可以使用它进行任何操作。您可以将其保存到文件中。您可以将其发送到网络流。您可以将其保存在内存中。

对于输出,音频输出设备和扬声器正在请求播放数据。

因此,在您提供的软件中,他们所做的就是将麦克风连接到扬声器,以使音频直接通过。

音频系统会定期调用函数performRender(),并说“给一些音频样本播放”。在该函数内部,它从以下行中的麦克风产生的数据中读取:AudioUnitRender(cd.rioUnit, ioActionFlags, inTimeStamp, 1, inNumberFrames, ioData);
您可以替换performRender()的内部内容,并以编程方式制作自己的音频数据,从文件或缓冲区等读取数据。它们所做的只是从麦克风数据中读取数据。

至于您有关AudioBufferList用途的问题。这只是提供了一个缓冲区列表,其中每个缓冲区都是一个通道。有时,根据格式(单声道,立体声,立体声交错,混音器声道等)和设备类型,您会有多个声道。

关于ios - AudioBufferList的AurioTouch目的,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34525385/

10-10 02:20