AudioBufferList 的 AurioTouch 用途
AurioTouch purpose of AudioBufferList
在Apple提供的aurioTouch项目中,听说在performRender()函数下的AudioController文件中的AudioBufferList ioData携带了mic的音频数据到音频播放器?谁能证实这一点?这是代码:
// 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()
由音频系统定期调用,它表示 "Gimme some audio samples to play." 在该函数内部,它读取行中麦克风产生的数据:AudioUnitRender(cd.rioUnit, ioActionFlags, inTimeStamp, 1, inNumberFrames, ioData);
您可以替换 performRender()
的内部并以编程方式制作您自己的音频数据,从文件或缓冲区读取等。他们所做的只是从麦克风数据中读取。
关于你问的AudioBufferList的用途。这只是提供了一个缓冲区列表,其中每个缓冲区都是一个通道。有时,根据格式(单声道、立体声、立体声交错、混合器通道等)和设备类型,您有多个音频通道。
在Apple提供的aurioTouch项目中,听说在performRender()函数下的AudioController文件中的AudioBufferList ioData携带了mic的音频数据到音频播放器?谁能证实这一点?这是代码:
// 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()
由音频系统定期调用,它表示 "Gimme some audio samples to play." 在该函数内部,它读取行中麦克风产生的数据:AudioUnitRender(cd.rioUnit, ioActionFlags, inTimeStamp, 1, inNumberFrames, ioData);
您可以替换 performRender()
的内部并以编程方式制作您自己的音频数据,从文件或缓冲区读取等。他们所做的只是从麦克风数据中读取。
关于你问的AudioBufferList的用途。这只是提供了一个缓冲区列表,其中每个缓冲区都是一个通道。有时,根据格式(单声道、立体声、立体声交错、混合器通道等)和设备类型,您有多个音频通道。