VST.NET против NAUDIO (vstaudiobuffer против pcmstream буфера) - PullRequest
0 голосов
/ 22 июня 2010

, пожалуйста, помогите мне, как преобразовать VSTaudiobuffer в PCMStream Buffer, который я пробовал из http://vstnet.codeplex.com/Thread/View.aspx?ThreadId=216682, но безрезультатно.

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

1 Ответ

1 голос
/ 22 июня 2010

Проблема в том, что ваши входные буферы представляют собой 16-битные целые числа, которые находятся в диапазоне {-32767.0 .. 32767.0}.Вам нужно делить / умножать это значение, а не 128, что было бы для 7 бит.

Кроме того, когда вы вычитаете / прибавляете 1.0f к преобразованному значению, вы делаете это в неправильном порядкеи вызовет отсечение.Преобразование должно быть:

buffer[i] = ((float)destBuffer[i]) / 32767.0f;

И

destBuffer[i] = Convert.ToByte(buffer[i] * 32768.0f);
...