#c# #naudio #vst
#c# #naudio #vst
Вопрос:
У меня есть плагин VST2, и когда я добавляю его в vsthost, он работает с байпасом, равным true, когда я устанавливаю Байпас равным false, он работает только с частотой дискретизации = 48000 Гц и буфером = 4800 выборок (10 бит / с). Изображение ниже: изображение vsthost
Итак, я хочу установить эту частоту дискретизации и размер буфера в своем коде. Ниже приведен код, который я использую для преобразования звуковых сигналов в / waveout:
public static void ConnectPlugin(bool restartDevice = false, int? inputDeviceNumber = 0, int? outputDeviceNumber = 1, bool byPass = false)
{
if (!restartDevice amp;amp; waveIn != null) return;
if (waveIn != null) waveIn.Dispose();
if (waveOut != null) waveOut.Dispose();
sampleRate = 48000;
blockSize = (int)(4800);
waveIn = new WaveInEvent();
waveIn.BufferMilliseconds = 50;
waveIn.DataAvailable = Plugin_DataAvailable;
waveIn.DeviceNumber = inputDeviceNumber ?? 0;
waveIn.WaveFormat = new WaveFormat((int)sampleRate, 16, 2);
waveProviderout = new BufferedWaveProvider(waveIn.WaveFormat) { DiscardOnBufferOverflow = true };
int inputCount = _vstPlugin.PluginInfo.AudioInputCount;
int outputCount = _vstPlugin.PluginInfo.AudioOutputCount;
var inputMgr = new VstAudioBufferManager(inputCount, blockSize);
var outputMgr = new VstAudioBufferManager(outputCount, blockSize);
_vstPlugin.PluginCommandStub.Commands.SetBlockSize(blockSize);
_vstPlugin.PluginCommandStub.Commands.SetSampleRate(sampleRate);
_vstPlugin.PluginCommandStub.Commands.SetProcessPrecision(VstProcessPrecision.Process32);
// set param
_vstPlugin.PluginCommandStub.Commands.SetBypass(byPass);
inputBuffers = inputMgr.Buffers.ToArray();
outputBuffers = outputMgr.Buffers.ToArray();
waveOut = new WaveOutEvent();
waveOut.DesiredLatency = 100;
waveOut.DeviceNumber = outputDeviceNumber ?? 1;
waveOut.Init(waveProviderout);
waveOut.Play();
waveIn.StartRecording();
_vstPlugin.PluginCommandStub.Commands.MainsChanged(true);
}
private static void Plugin_DataAvailable(object sender, WaveInEventArgs e)
{
var device = (WaveInEvent)sender;
var naudioBuf = e.Buffer;
try
{
unsafe
{
int j = 0;
for (int i = 0; i < e.BytesRecorded; i )
{
byte[] tmpbytearr = new byte[2];
tmpbytearr[0] = naudioBuf[i];
i ;
tmpbytearr[1] = naudioBuf[i];
Int16 tmpint = BitConverter.ToInt16(tmpbytearr, 0);
float f = (((float)tmpint / (float)Int16.MaxValue));
inputBuffers[0][j] = f;
inputBuffers[1][j] = f;
j ;
}
}
_vstPlugin.PluginCommandStub.Commands.StartProcess();
_vstPlugin.PluginCommandStub.Commands.ProcessReplacing(inputBuffers, outputBuffers);
_vstPlugin.PluginCommandStub.Commands.StopProcess();
//_vstPlugin.PluginCommandStub.EditorIdle();
byte[] bytebuffer;
unsafe
{
float* tmpBufLeft = ((IDirectBufferAccess32)outputBuffers[0]).Buffer;
float* tmpBufRight = ((IDirectBufferAccess32)outputBuffers[1]).Buffer;
bytebuffer = new byte[outputBuffers[0].SampleCount * 2];
int j = 0;
for (int i = 0; i < (outputBuffers[0].SampleCount * 2); i )
{
Int16 tmpint = (Int16)((float)outputBuffers[1][j] * (float)Int16.MaxValue);
byte[] tmparr = BitConverter.GetBytes(tmpint);
bytebuffer[i] = tmparr[0];
i ;
bytebuffer[i] = tmparr[1];
j ;
}
}
waveProviderout.AddSamples(bytebuffer, 0, bytebuffer.Length);
}
catch (Exception ex)
{
Console.Out.WriteLine(ex.Message);
}
}
Как я могу установить частоту дискретизации и буфер в моем коде, например, vsthost
Комментарии:
1. SetBlockSize — это количество выборок на «срез» или «цикл», которые плагин обрабатывает за один раз. Итак, я думаю, вы хотите установить значение 4800 (не 400) …? SetSampleRate … well устанавливает количество выборок в секунду => 480000 Один указатель: функции запуска / остановки процесса указывают плагину, что звуковой «движок» (на хосте) запущен. Поэтому вызовите StartProcess() в конце процедуры настройки и остановите процесс, когда вы завершаете работу с волновыми событиями, например, для изменения настроек или при закрытии приложения. Многим плагинам не нужны эти вызовы, поэтому вы также можете протестировать, если они вообще не вызываются. [2c]
2. Спасибо, я отредактировал свой код, кажется, он работает. Но звук прерывается.. Пожалуйста, помогите мне.
3. Ищите выделения во время циклов обработки звука. GC остановит потоки для сбора удаленных объектов. Например, VstAudioBufferManager предназначен для инициализации один раз, а его буфер (повторно) используется во время Process() . Эта часть выглядит нормально в вашем коде — просто убедитесь, что вы выделяете то, что вам нужно, заранее, а не во время обработки звука. [2c]
4. Когда значение параметра bypass равно «true», оно работает нормально, но когда я устанавливаю by pass равным «false», кажется, что в звуке отсутствуют некоторые слова
5. Вы можете попробовать использовать другой плагин, который выполняет аналогичную обработку. Таким образом, вы узнаете, связана ли проблема с вашим хост-кодом или причиной является плагин…