Недавно я начал создавать VST-хост, и для этого я использую библиотеку VST.NET для C#. Теперь я пытаюсь создать маршрутизацию между линейным входом, через плагины и линейным выходом. Мой план состоит в том, чтобы записать звук на хост и отправить записанный буфер (живой, когда он записан, не сохраняя временный файл) в первый плагин. Выход первого плагина (который будет плагином эффектов) будет передан следующему плагину. После того, как он прошел через все необходимые плагины, он должен быть направлен на устройство вывода звука.
Для части записи я уже взглянул на NAudio и создал часть записи, например this а>. Теперь я могу получить аудиобуфер в моем методе isDataAvailable в виде массива байтов. Проблема в том, что VST.NET использует метод ProcessReplacing (я думаю) для обработки звука в плагине, и для этого метода требуется буфер в виде экземпляра массива VstAudioBuffer, а конструктору VstAudioBuffer требуется буфер с плавающей запятой *.
Теперь, как я должен преобразовать эти переменные, чтобы отправить их в плагин? Также, в конце концов, как я могу преобразовать их обратно для отправки в WaveOut?
Другой вопрос: могу ли я после вызова plugin1.processreplacing отправить записанные данные в plugin1, вызвать plugin2.processreplacing с параметрами inputBuffer, являющимися выходным буфером вызова processreplacing для plugin1, чтобы отправить обработанное аудио в plugin2?
Я попытался изменить пример из ссылки и сделал это:
void waveIn_DataAvailable(object sender, WaveInEventArgs e)
{
if (waveProvider != null)
waveProvider.AddSamples(e.Buffer, 0, e.BytesRecorded);
int bytesRead = waveProvider.Read(naudioBuf,0,e.BytesRecorded);
naudioBuf = e.Buffer;
unsafe
{
fixed (byte* byteBuf = &naudioBuf[0])
{
float* floatBuf = (float*)byteBuf;
for (int i = 0; i < e.BytesRecorded; i++)
{
vstBufIn[0][i] = *(floatBuf + i);
}
}
}
cont.PluginCommandStub.MainsChanged(true);
cont.PluginCommandStub.StartProcess();
cont.PluginCommandStub.ProcessReplacing(vstBufIn, vstBufOut);
cont.PluginCommandStub.StopProcess();
cont.PluginCommandStub.MainsChanged(false);
unsafe
{
float* tmpBufL = ((IDirectBufferAccess32)vstBufOut[0]).Buffer;
byte[] buffer = BitConverter.GetBytes(*(tmpBufL));
waveOutProv.AddSamples(buffer, 0, buffer.Length);
}
}
Настройка для WaveIn и Out выглядит так:
WaveIn waveIn = new WaveIn(this.Handle);
waveIn = new WaveIn(this.Handle);
waveIn.BufferMilliseconds = 25;
waveIn.DataAvailable += waveIn_DataAvailable;
waveProvider = new BufferedWaveProvider(waveIn.WaveFormat);
waveOutProv = new BufferedWaveProvider(waveIn.WaveFormat);
waveOut = new WaveOut();
waveOut.DesiredLatency = 100;
waveOut.Init(waveOutProv);
waveIn.StartRecording();
waveOut.Play();
this.sampleRate = 44100;
this.channels = 2;
this.blockSize = 4410;
cont.PluginCommandStub.SetBlockSize(blockSize);
cont.PluginCommandStub.SetSampleRate((float)sampleRate);
vstBufManIn = new VstAudioBufferManager(channels, blockSize * channels);
vstBufManOut = new VstAudioBufferManager(channels, blockSize * channels);
vstBufIn = vstBufManIn.ToArray();
vstBufOut = vstBufManOut.ToArray();
naudioBuf = new byte[blockSize * channels * 4];
Я получаю выход, и он также становится громче, когда вход в микрофон громче, но это просто странный «щелчок». Я предполагаю, что сделал что-то не так с преобразованием vstBufOut в массив укусов, но я не совсем понимаю, что не так.