private unsafe static PaStreamCallbackResult PaStreamCallback(float *input, float *output, uint frameCount, ref PaStreamCallbackTimeInfo timeInfo, PaStreamCallbackFlags statusFlags, IntPtr userData) { GCHandle gCHandle = GCHandle.FromIntPtr(userData); if (!gCHandle.IsAllocated) { return(PaStreamCallbackResult.PaAbort); } WaveRecorder waveRecorder = (WaveRecorder)gCHandle.Target; try { if (waveRecorder._bufferAvailable != null) { waveRecorder._bufferAvailable(input, (int)frameCount); } } catch { return(PaStreamCallbackResult.PaAbort); } return(PaStreamCallbackResult.PaContinue); }