首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VST.NET vs NAUDIO (vstaudiobuffer vs pcmstream buffer)

VST.NET vs NAUDIO (vstaudiobuffer vs pcmstream buffer)
EN

Stack Overflow用户
提问于 2010-06-22 05:18:55
回答 1查看 710关注 0票数 0

请告诉我如何将VSTaudiobuffer转换为PCMStream缓冲区,我尝试从http://vstnet.codeplex.com/Thread/View.aspx?ThreadId=216682,但没有用。

代码语言:javascript
复制
                int inputCount = PluginContext.PluginInfo.AudioInputCount;
                int outputCount = PluginContext.PluginInfo.AudioOutputCount;
                int blockSize = bytesWritten;                    

                VstAudioBufferManager inputMgr = new VstAudioBufferManager(inputCount, blockSize);
                VstAudioBufferManager outputMgr = new VstAudioBufferManager(outputCount, blockSize);

                foreach (VstAudioBuffer buffer in inputMgr.ToArray())
                {
                    for (int i = 0; i < blockSize; i++)
                    {
                        buffer[i] = (float)destBuffer[i] / 128.0f - 1.0f;
                    }
                }

                PluginContext.PluginCommandStub.SetBlockSize(blockSize);
                PluginContext.PluginCommandStub.SetSampleRate(44.8f);

                PluginContext.PluginCommandStub.StartProcess();
                PluginContext.PluginCommandStub.ProcessReplacing(inputMgr.ToArray(), outputMgr.ToArray());
                PluginContext.PluginCommandStub.StopProcess();                   

                foreach (VstAudioBuffer buffer in outputMgr.ToArray())
                {
                    for (int i = 0; i < blockSize; i++)
                    {
                        destBuffer[i] = Convert.ToByte(((float)buffer[i] + 1.0f) * 128.0f);                           
                    }                        
                }
                inputMgr.ClearBuffer(inputMgr.ToArray()[0]);
                inputMgr.ClearBuffer(inputMgr.ToArray()[1]);
                inputMgr.Dispose();
                outputMgr.ClearBuffer(outputMgr.ToArray()[0]);
                outputMgr.ClearBuffer(outputMgr.ToArray()[1]);
                outputMgr.Dispose();
EN

回答 1

Stack Overflow用户

发布于 2010-06-22 19:37:12

问题是您的输入缓冲区是16位整数,范围是{ -32767.0 ..32767.0 }。您需要除以/乘以该值,而不是128,这将是7位。

此外,当您将1.0f减去/添加到您的转换值时,您正在以错误的顺序执行该操作,并将导致发生裁剪。转换应为:

代码语言:javascript
复制
buffer[i] = ((float)destBuffer[i]) / 32767.0f;

代码语言:javascript
复制
destBuffer[i] = Convert.ToByte(buffer[i] * 32768.0f);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3088593

复制
相关文章

相似问题

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