Я довольно новичок в c # и мне может понадобиться помощь в аудиопроекте.Мои аудио входные буферы вызывают метод, когда они заполнены.В методе, который я собираю, это буферизирует в локальный метод float [], передает его в функцию, где выполняется некоторая обработка звука.После обработки функция возвращает обработанный float [], который я передаю Marshall.copy, в буфер вывода аудио.это работает, но довольно сложно достаточно быстро выполнить аудиопроцессинг, чтобы передать результат обратно методу, не заканчивая уродливыми сбоями.Если я увеличу звуковые буферы, это станет лучше, но я получу невыносимую высокую задержку в цепи сигнала.Одной из проблем является сборщик мусора.Моя подпрограмма DSP выполняет некоторые FFT, и методы часто должны распределять локальные переменные.Я думаю, что это сильно замедляет мой процесс.
Поэтому мне нужен способ выделить один раз (и повторно получить доступ) несколько фрагментов неуправляемой памяти, сохранить эту память для всей среды выполнения и просто сослаться на нее из методов,
Я нашел, например:
IntPtr hglobal = Marshal.AllocHGlobal(8192);
Marshal.FreeHGlobal(hglobal);
Итак, я попытался определить глобальный статический класс "Globasl" со статическим членом и присвоить этому IntPtr.
Globals.mem1 = hglobal;
Из любого другого метода я могу получить к нему доступ, например,
int[] f = new int[2];
f[0] = 111;
f[1] = 222;
Marshal.Copy(f, 0, Globals.mem1, 2);
Теперь возникает моя проблема: если я хочу получить доступ к этому int [] из приведенного выше примера в другом методе, как я могу это сделать??
спасибо за вашу скорую помощь.Кажется, я был немного неточен, извините
мой драйвер аудиоустройства генерирует событие, заполненное буфером, которое я перехватываю (в псевдокоде, поскольку у меня сейчас нет доступа к домашнему рабочему столу).выглядит так:
void buffer (....)
{
byte[] buf = new byte[asiobuffersize];
marshall.copy(asioinbuffers, 0, buf, asiobufferlenth);
buf= manipulate(buf);
marshall.copy(buf, 0, asiooutbuffer, asiobufferlenth);
}
функция манипуляции выполняет некоторые преобразования из байта в число с плавающей запятой, затем некоторое математическое (FFT) и обратное преобразование в байт и выглядит, например, как
private byte[] manipulate(byte[] buf, Complex[] filter)
{
float bu = convertTofloat(buf); //conversion from byte to audio float here
Complex[] inbuf = new Complex[bu.Length];
Complex[] midbuf = new Complex[bu.Length];
Complex[] mid2buf = new Complex[bu.Length];
Complex[] outbuf = new Complex[bu.Length];
for ( n....)
{
inbuf[n]= bu[n]; //Copy to Complex
}
midbuf=FFT(inbuf); //Doing FFT transform
for (n....)
{
mid2buf[n]=midbuf[n]*filter[n]; // Multiply with filter
}
outbuf=iFFT(mid2buf) //inverse iFFT transform
byte bu = convertTobyte(float); //conversion from float back to audio byte
return bu;
}
здесь я ожидаю, что мойСкорость вопроса будет.Поэтому я подумал, что проблему можно решить, если бы управляющая функция могла просто «получить» фиксированный фрагмент неуправляемой памяти, где (после того, как он был создан), он фиксировал все эти переменные (например, Сложный) и предварительно выделенный список, так что я не долженсоздавать новые каждый раз, когда вызывается функция.Сначала я ожидал причину моих глюков в неправильном БПФ или математике, но это происходит в виде «резких» временных интервалов в несколько секунд, поэтому он не связан с такими проблемами звукового сигнала, как отсечение.Я думаю, что это случается, когда GC выполняет какую-то серьезную работу и съедает меня ровно столько, сколько пропущено за несколько миллисекунд, чтобы вовремя заполнить буфер вывода.приемлемый.