PaStreamCallbackResult SineCallback( PaBuffer input, PaBuffer output, int frameCount, PaStreamCallbackTimeInfo timeInfo, PaStreamCallbackFlags statusFlags, object userData) { var outBuffer = (PaBuffer <float>)output; var outSpan = outBuffer.Span; if (note >= 0) { for (int n = 0; n < frameCount; n++) { outSpan[n] = (float)Sin(osc); osc += delta; } osc = osc % (2 * Math.PI); } else { for (int n = 0; n < frameCount; n++) { outSpan[n] = 0; // silence; } } return(PaStreamCallbackResult.paContinue); }
private static PaStreamCallbackResult PaStreamCallback( float *input, float *output, uint frameCount, ref PaStreamCallbackTimeInfo timeInfo, PaStreamCallbackFlags statusFlags, IntPtr userData) { #region GC boilerplate var gcHandle = GCHandle.FromIntPtr(userData); if (!gcHandle.IsAllocated) { return(PaStreamCallbackResult.PaAbort); } var instance = (WavePlayer)gcHandle.Target; #endregion try { if (instance._bufferNeeded != null) { instance._bufferNeeded(output, (int)frameCount); } } catch { return(PaStreamCallbackResult.PaAbort); } return(PaStreamCallbackResult.PaContinue); }
private static PaStreamCallbackResult PaStreamCallback( float *input, float *output, uint frameCount, ref PaStreamCallbackTimeInfo timeInfo, PaStreamCallbackFlags statusFlags, IntPtr userData) { #region GC boilerplate var gcHandle = GCHandle.FromIntPtr(userData); if (!gcHandle.IsAllocated) { return(PaStreamCallbackResult.PaAbort); } var instance = (WaveDuplex)gcHandle.Target; #endregion try { Utils.Memcpy(output, input, (int)frameCount * 2 * sizeof(float)); if (instance._bufferAvailable != null) { instance._bufferAvailable(output, (int)frameCount); } } catch { return(PaStreamCallbackResult.PaAbort); } return(PaStreamCallbackResult.PaContinue); }
public static StreamCallbackTimeInfo FromNative(IntPtr ptr) { PaStreamCallbackTimeInfo native = Marshal.PtrToStructure <PaStreamCallbackTimeInfo>(ptr); StreamCallbackTimeInfo managed = new StreamCallbackTimeInfo(); managed.InputBufferAdcTime = native.inputBufferAdcTime; managed.CurrentTime = native.currentTime; managed.OutputBufferDacTime = native.outputBufferDacTime; return(managed); }
private static PaStreamCallbackResult SineCallback( PaBuffer input, PaBuffer output, int frameCount, PaStreamCallbackTimeInfo timeInfo, PaStreamCallbackFlags statusFlags, object userData) { var data = (SineCallbackData)userData; var outBuffer = (PaBuffer <float>)output; var outSpan = outBuffer.Span; for (int n = 0; n < frameCount; n++) { outSpan[n] = 0.1f * (float)data.osc.Real; data.osc *= data.delta;; } data.osc *= (3 - (data.osc.Real * data.osc.Real + data.osc.Imaginary * data.osc.Imaginary)) / 2; return(PaStreamCallbackResult.paContinue); }
PaStreamCallbackResult StreamCallback(byte[] output, int offset, int byteCount, PaStreamCallbackTimeInfo timeInfo, PaStreamCallbackFlags statusFlags, IntPtr userData) { bool takeNewBuffer = last_sample == null; do { var sample = takeNewBuffer ? GetNextSample () : last_sample; if (sample == null) // complete return PaStreamCallbackResult.Complete; var arr = sample.GetBuffer<byte> (); int rem = takeNewBuffer ? arr.Count : remaining; int size = Math.Min (rem, byteCount); Array.Copy (arr.Array, arr.Offset, output, offset, size); byteCount -= size; remaining -= size; if (remaining == 0) takeNewBuffer = true; } while (byteCount > 0); return PaStreamCallbackResult.Continue; }
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); } WaveDuplex waveDuplex = (WaveDuplex)gCHandle.Target; try { Utils.Memcpy(output, input, (int)(frameCount * 2 * 4)); if (waveDuplex._bufferAvailable != null) { waveDuplex._bufferAvailable(output, (int)frameCount); } } catch { return(PaStreamCallbackResult.PaAbort); } return(PaStreamCallbackResult.PaContinue); }
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); } AudioPlayer instance = (AudioPlayer)gcHandle.Target; try { instance._bufferNeeded?.Invoke(new UnsafeSamplesEventArgs(output, (int)frameCount)); } catch { return(PaStreamCallbackResult.paAbort); } return(PaStreamCallbackResult.paContinue); }
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); } WavePlayer wavePlayer = (WavePlayer)gCHandle.Target; try { if (wavePlayer._bufferNeeded != null) { wavePlayer._bufferNeeded(output, (int)frameCount); } } catch { return(PaStreamCallbackResult.PaAbort); } return(PaStreamCallbackResult.PaContinue); }
private PaStreamCallbackResult StreamCallback(IntPtr input, IntPtr output, uint frameCount, ref PaStreamCallbackTimeInfo timeInfo, PaStreamCallbackFlags statusFlags, IntPtr userData) { if ((state & 0b10) == 0b10) { state = 0; return(PaStreamCallbackResult.paAbort); } if (!outBuffer.IsFull(outBufferState)) { if ((state & 0b01) == 0b01) { state = 0; return(PaStreamCallbackResult.paComplete); } #if DEBUG Debug.WriteLine("解码速度过慢!"); #endif //outBufferState.AbsolutePosition -= 256 * channel * bps / 8; //if ((state & 0b01) == 0b01) { // state = 0; // return PaStreamCallbackResult.paComplete; //} } outBufferState.Info(start: 0, length: (int)frameCount * channel * bps / 8); outBuffer.Read(output, outBufferState); bool success; int start, length; (success, start, length, _, _) = outBufferState.Info(); if (success) { outBuffer.DeleteOperate(outBufferState); } else { #if DEBUG Console.WriteLine("发生了不可能错误!"); #endif for (int i = 0; i < length; i++) { Marshal.WriteByte(output, start, 0); } } if (outBuffer.IsEndOfBuffer(outBufferState)) { outBufferState.AbsolutePosition = 0; } //int times = rest.Length * 8; //IntPtr ptr; //for (int i = 0; i < frameCount * channel / times; i++) { // ptr = new IntPtr(output.ToInt64() + i * times); // Marshal.Copy(rest, 0, ptr, rest.Length); //} //if ((state & 0b01) == 0b01) { // state = 0; // return PaStreamCallbackResult.paComplete; //} return(PaStreamCallbackResult.paContinue); }