ASIO SDK 中的主机示例非常接近您的需要。在bufferSwitchTimeInfo
回调中有一些这样的代码:
for (int i = 0; i < asioDriverInfo.inputBuffers + asioDriverInfo.outputBuffers; i++)
{
int ch = asioDriverInfo.bufferInfos[i].channelNum;
if (asioDriverInfo.bufferInfos[i].isInput == ASIOTrue)
{
char* buf = asioDriver.bufferInfos[i].buffers[index];
....
其中 if 块asioDriver.bufferInfos[i].buffers[index]
是指向原始音频数据的指针(index
是方法的参数)。
缓冲区的格式取决于驱动程序,可以通过测试发现asioDriverInfo.channelInfos[i].type
。格式的类型将是 32bit int LSB first,32bit int MSB first,依此类推。您可以在ASIOSampleType
枚举中找到值列表asio.h
。此时,您需要将样本转换为下游信号处理代码的一些通用格式。如果您正在进行信号处理,您可能需要转换为double
. 该文件host\asioconvertsample.cpp
将使您了解转换中涉及的内容。您将遇到的最常见格式可能是 INT32 MSB。这是您将其转换为双倍的方法。
for (int i = 0; i < asioDriverInfo.inputBuffers + asioDriverInfo.outputBuffers; i++)
{
int ch = asioDriverInfo.bufferInfos[i].channelNum;
if (asioDriverInfo.bufferInfos[i].isInput == ASIOTrue)
{
switch (asioDriverInfo.channelInfos[i].type)
{
case ASIOInt32LSB:
{
double* pDoubleBuf = new double[_bufferSize];
for (int i = 0 ; i < _bufferSize ; ++i)
{
pDoubleBuf[i] = *(int*)asioDriverInfo.bufferInfos.buffers[index] / (double)0x7fffffff;
}
// now pDoubleBuf contains one channels worth of samples in the range of -1.0 to 1.0.
break;
}
// and so on...