我必须插入一个预先存在的软件,管理ASIO音频流,一个简单的VST主机。尽管缺少一些文档,我设法这样做,但是一旦我加载了插件,我就会收到严重失真的音频信号。
我正在使用的VST工作正常(与其他VST主机一起使用)所以它可能是我编写的代码中的某种错误,但是当我从插件中禁用“PROCESS”时(我的流经过插件,它只是没有得到处理)它在我发送时没有任何噪音或失真就回来了。
我稍微关心的一件事是当ASIO驱动程序填充__int32缓冲区时使用的数据类型,而插件需要一些浮动缓冲区。
这让我感到非常沮丧,因为我查看了数以万计的代码并且看起来很好。
这是我正在使用的类的代码;请注意,有些数字会暂时硬编码以帮助调试。
self.output.write(str(thing))
编辑:这是我用来将我的sw与VST主机接口的代码
VSTPlugIn::VSTPlugIn(const char* fullDirectoryName, const char* ID)
: plugin(NULL)
, blocksize(128) // TODO
, sampleRate(44100.0F) // TODO
, hostID(ID)
{
this->LoadPlugin(fullDirectoryName);
this->ConfigurePluginCallbacks();
this->StartPlugin();
out = new float*[2];
for (int i = 0; i < 2; ++i)
{
out[i] = new float[128];
memset(out[i], 0, 128);
}
}
void VSTPlugIn::LoadPlugin(const char* path)
{
HMODULE modulePtr = LoadLibrary(path);
if(modulePtr == NULL)
{
printf("Failed trying to load VST from '%s', error %d\n", path, GetLastError());
plugin = NULL;
}
// vst 2.4 export name
vstPluginFuncPtr mainEntryPoint = (vstPluginFuncPtr)GetProcAddress(modulePtr, "VSTPluginMain");
// if "VSTPluginMain" was not found, search for "main" (backwards compatibility mode)
if(!mainEntryPoint)
{
mainEntryPoint = (vstPluginFuncPtr)GetProcAddress(modulePtr, "main");
}
// Instantiate the plugin
plugin = mainEntryPoint(hostCallback);
}
void VSTPlugIn::ConfigurePluginCallbacks()
{
// Check plugin's magic number
// If incorrect, then the file either was not loaded properly, is not a
// real VST plugin, or is otherwise corrupt.
if(plugin->magic != kEffectMagic)
{
printf("Plugin's magic number is bad. Plugin will be discarded\n");
plugin = NULL;
}
// Create dispatcher handle
this->dispatcher = (dispatcherFuncPtr)(plugin->dispatcher);
// Set up plugin callback functions
plugin->getParameter = (getParameterFuncPtr)plugin->getParameter;
plugin->processReplacing = (processFuncPtr)plugin->processReplacing;
plugin->setParameter = (setParameterFuncPtr)plugin->setParameter;
}
void VSTPlugIn::StartPlugin()
{
// Set some default properties
dispatcher(plugin, effOpen, 0, 0, NULL, 0);
dispatcher(plugin, effSetSampleRate, 0, 0, NULL, sampleRate);
dispatcher(plugin, effSetBlockSize, 0, blocksize, NULL, 0.0f);
this->ResumePlugin();
}
void VSTPlugIn::ResumePlugin()
{
dispatcher(plugin, effMainsChanged, 0, 1, NULL, 0.0f);
}
void VSTPlugIn::SuspendPlugin()
{
dispatcher(plugin, effMainsChanged, 0, 0, NULL, 0.0f);
}
void VSTPlugIn::ProcessAudio(float** inputs, float** outputs, long numFrames)
{
plugin->processReplacing(plugin, inputs, out, 128);
memcpy(outputs, out, sizeof(float) * 128);
}
其中“buff”定义为“__int32 * buff”
答案 0 :(得分:0)
我猜测当你拨打min()
(以及下面一行的相关f = std::numeric_limits<int>::max() - 1
案例时),这可能会导致溢出。你试过f = ((float) buff[i]) / (float) std::numeric_limits<int>::max()
吗?
上面的代码snippit与get
相同......我还会在那里减去一个以避免以后可能出现溢出。