首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AurioTouch目的AudioBufferList

AurioTouch目的AudioBufferList
EN

Stack Overflow用户
提问于 2015-12-30 08:03:00
回答 1查看 512关注 0票数 1

在苹果提供的aurioTouch项目中,我听说AudioController文件中的performRender()函数下的AudioBufferList ioData将音频数据从麦克风传送到音频播放器?有人能证实这一点吗?以下是代码:

代码语言:javascript
复制
// 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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-02 07:57:43

RemoteIO音频单元是能够访问音频硬件输入(麦克风)和输出(扬声器)的组件。

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

由于输入从麦克风获取数据,所以您可以使用它做任何事。你可以把它保存到一个文件里。你可以给它发送一个网络流。你可以把它记在记忆里。

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

所以在你所提供的软件中,他们所做的就是把麦克风和扬声器连接起来,就像一个直接的音频通过。

performRender()函数由音频系统定期调用,它说:“给我一些音频样本来播放。”在该函数中,它从行中的麦克风生成的数据中读取:AudioUnitRender(cd.rioUnit, ioActionFlags, inTimeStamp, 1, inNumberFrames, ioData);

您可以替换performRender()的内部,以编程的方式创建自己的音频数据,从文件或缓冲区读取等等。它们所做的只是从麦克风数据中读取。

至于你关于AudioBufferList的目的的问题。它只提供一个缓冲区列表,其中每个缓冲区都是一个通道。有时,根据格式(单声道、立体声、立体声交织、混音通道等)和单元类型,您有多个音频通道。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34525385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档