AccessViolationException с хост-приложением VST.NET и NAudio в C#

Я пытаюсь создать класс VSTstream на основе этого потока: http://vstnet.codeplex.com/discussions/228692.

Для записи и воспроизведения звука я использую AsioOut объект, который дает мне доступ к IntPtr[] тип буфера в функции обратного вызова OnAudioAvailable(),

Для этого я создал VSTstream класс, беря пример из связанного потока, соответствующим образом модифицируется для непосредственной обработки IntPtr[] буферы.

Однако во время различных процессов приведения это выдает ошибку "AccessViolationException", возможно, из-за неправильного приведения.

Я тестирую VSTstream открытие класса Jacobi.Vst.Samples.Delay.dll

РЕДАКТИРОВАТЬ: ошибка происходит в этой строке:Marshal.Copy(sourceBuffer[1], rightBuf, 0, sampleCount/channels);

Кто-нибудь знает, что я сделал не так? Если вам нужна дополнительная информация или код, я доступен.

Спасибо всем.

OnAudioAvailable ():

private void OnAudioAvailable(object sender, AsioAudioAvailableEventArgs e)
    {
        //No Effect
        for (int i = 0; i < e.InputBuffers.Length; i++)
        {
            MoveMemory(e.OutputBuffers[i], e.InputBuffers[i], e.SamplesPerBuffer * e.InputBuffers.Length * 2);
        }

        //Effect
        if (Parametri.effetto)
        {
            //Accendo i plugin
            for (int i = 0; i < plugins.Count; i++)
            {
                plugins[i].MainsChanged(true);
                plugins[i].StartProcess();
            }

            //Processo i sample
            vstStream.ProcessSample(e.OutputBuffers, 0, e.SamplesPerBuffer * e.InputBuffers.Length * 2, e.InputBuffers);

            //Spengo i plugin
            for (int i = 0; i < plugins.Count; i++)
            {
                plugins[i].StopProcess();
                plugins[i].MainsChanged(false);
            }
        }

        e.WrittenToOutputBuffers = true;
    }

VSTstream класс:

class VSTstream
{
    public List<IVstPluginCommandStub> plugins;
    VstAudioBufferManager vstBufManIn, vstBufManOut;

    private VstAudioBuffer[] vstBufIn = null;
    private VstAudioBuffer[] vstBufOut = null;

    private int sampleRate, channels, blockSize;

    private float[] leftBuf, rightBuf;

    public VSTstream(int sampleRate, int channels, int blockSize, List<IVstPluginCommandStub> plugins)
    {
        this.plugins = plugins;
        this.sampleRate = sampleRate;
        this.channels = channels;
        this.blockSize = blockSize;

        plugins[0].SetBlockSize(blockSize);
        plugins[0].SetSampleRate((float)sampleRate);

        vstBufManIn = new VstAudioBufferManager(channels, blockSize); //*channels
        vstBufManOut = new VstAudioBufferManager(channels, blockSize);

        //vstBufIn = vstBufManIn.ToArray();
        //vstBufOut = vstBufManOut.ToArray();
        vstBufIn = vstBufManIn.Cast<VstAudioBuffer>().ToArray();
        vstBufOut = vstBufManOut.Cast<VstAudioBuffer>().ToArray();

        leftBuf = new float[(blockSize * 4)/channels];
        rightBuf = new float[(blockSize * 4)/channels];
    }

    public int ProcessSample(IntPtr[] destBuffer, int offset, int sampleCount, IntPtr[] sourceBuffer)
    {
        //da IntPtr[L][R] a Lfloat[]+Rfloat[]
        Marshal.Copy(sourceBuffer[0], leftBuf, 0, sampleCount/channels);// (/channels)
        Marshal.Copy(sourceBuffer[1], rightBuf, 0, sampleCount/channels);

        unsafe
        {
            fixed (float* Lfloat = &leftBuf[0])
            {
                fixed (float* Rfloat = &rightBuf[0])
                {
                    for (int i = 0; i < sampleCount / channels; i++)
                    {
                        vstBufIn[0][i] = *(Lfloat + i);
                        vstBufIn[1][i] = *(Rfloat + i);
                    }
                }
            }
        }

        //Qui dovrà rimanere solo 'ProcessReplacing();'
        //plugins[0].MainsChanged(true);
        //plugins[0].StartProcess();
        plugins[0].ProcessReplacing(vstBufIn, vstBufOut);
        //plugins[0].StopProcess();
        //plugins[0].MainsChanged(false);

        unsafe
        {
            float* tmpBufL = ((IDirectBufferAccess32)vstBufOut[0]).Buffer;
            float* tmpBufR = ((IDirectBufferAccess32)vstBufOut[1]).Buffer;
            for (int i = 0; i < (sampleCount / channels); i++)
            {
                leftBuf[i] = *(tmpBufL + i);
                rightBuf[i] = *(tmpBufR + i);
            }
        }
        //da Lfloat[]+Rfloat[] a IntPtr[L][R]
        Marshal.Copy(leftBuf, 0, destBuffer[0], sampleCount/channels);
        Marshal.Copy(rightBuf, 0, destBuffer[1], sampleCount/channels);

        return sampleCount;
    }
}

0 ответов

Другие вопросы по тегам