gpt4 book ai didi

c++ - 使用 VST 插件失真的音频

转载 作者:行者123 更新时间:2023-12-03 01:58:37 29 4
gpt4 key购买 nike

我必须插入一个预先存在的软件,管理 ASIO 音频流,一个简单的 VST 主机。尽管缺少一些文档,我还是设法做到了,但是一旦我加载了插件,我就会得到一个严重失真的音频信号。

我正在使用的 VST 可以正常工作(与其他 VST 主机一起),所以它可能是我制作的代码中的某种错误,但是当我从插件中禁用“PROCESS”时(我的流通过插件,它根本没有得到处理)它会在我发送时返回,没有任何噪音或失真。

我稍微担心的一件事是,当插件需要一些浮点缓冲区时,ASIO 驱动程序填充 __int32 缓冲区时使用的数据类型。

这真的很令人沮丧,因为我无数次地查看了我的代码,而且看起来还不错。

这是我正在使用的类的代码;请注意,有些数字是临时硬编码的,以帮助调试。

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);
}

编辑:这是我用来将我的 sw 与 VST 主机接口(interface)的代码
// Copying the outer buffer in the inner container
for(unsigned i = 0; i < bufferLenght; i++)
{
float f;
f = ((float) buff[i]) / (float) std::numeric_limits<int>::max()

if( f > 1 ) f = 1;
if( f < -1 ) f = -1;

samples[0][i] = f;
}

// DO JOB
for(auto it = inserts.begin(); it != inserts.end(); ++it)
{
(*it)->ProcessAudio(samples, samples, bufferLenght);
}

// Copying the result back into the buffer
for(unsigned i = 0; i < bufferLenght; i++)
{
float f = samples[0][i];
int intval;
f = f * std::numeric_limits<int>::max();
if( f > std::numeric_limits<int>::max() ) f = std::numeric_limits<int>::max();
if( f < std::numeric_limits<int>::min() ) f = std::numeric_limits<int>::min();
intval = (int) f;

buff[i] = intval;
}

其中“buff”定义为“__int32* buff”

最佳答案

我猜当你调用 f = std::numeric_limits<int>::max() (以及下一行相关的 min() 案例),这可能会导致溢出。你试过f = std::numeric_limits<int>::max() - 1 ?

上面的代码片段也是如此,f = ((float) buff[i]) / (float) std::numeric_limits<int>::max() ...我还会在那里减去一个,以避免以后发生潜在的溢出。

关于c++ - 使用 VST 插件失真的音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33595333/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com