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 = (WaveRecorder) gcHandle.Target; #endregion try { if (instance._bufferAvailable != null) { instance._bufferAvailable(input, (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 = (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); }
// Note: userData object cannot be reconstituted from IntPtr but thunking delegate can curry the userData, bypassing PortAudio with better efficiency public unsafe PaStreamCallbackResult Callback( void *input, void *output, unsigned_long_t frameCount, IntPtr timeInfo, PaStreamCallbackFlags statusFlags, IntPtr garbage) { return(callbackProvider( PaBufferBySampleFormat(inputSampleFormat, input, (int)frameCount, numInputChannels), PaBufferBySampleFormat(outputSampleFormat, output, (int)frameCount, numOutputChannels), (int)frameCount, Marshal.PtrToStructure <PaStreamCallbackTimeInfo>(timeInfo), statusFlags, userData)); }
public unsafe PaStreamCallbackResult Callback( void *input, void *output, unsigned_long_t frameCount, IntPtr timeInfo, PaStreamCallbackFlags statusFlags, IntPtr garbage) { // Note: userData object cannot be reconstituted from IntPtr so thunking delegate curries userData instead return(callbackProvider( PaBufferBySampleFormat((IntPtr)input, inputSampleFormat, numInputChannels, (int)frameCount), PaBufferBySampleFormat((IntPtr)output, outputSampleFormat, numOutputChannels, (int)frameCount), (int)frameCount, Marshal.PtrToStructure <PaStreamCallbackTimeInfo>(timeInfo), statusFlags, userData)); }
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); }
private static unsafe 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; }
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); }
PaStreamCallbackResult ImmediateStreamCallback(IntPtr input, IntPtr output, uint frameCount, IntPtr timeInfo, PaStreamCallbackFlags statusFlags, IntPtr userData) { int numSamplesToCopy = (int)Math.Min(frameCount, immediateStreamData.Length - immediateStreamPosition); if (numSamplesToCopy <= 0) { return(PaStreamCallbackResult.Abort); } Marshal.Copy(immediateStreamData, immediateStreamPosition, output, numSamplesToCopy); immediateStreamPosition += (int)frameCount; if (immediateStreamPosition >= immediateStreamData.Length) { immediateStreamData = null; immediateStreamPosition = -1; return(PaStreamCallbackResult.Complete); } else { return(PaStreamCallbackResult.Continue); } }
PaStreamCallbackResult StreamCallback(IntPtr input, IntPtr output, uint frameCount, IntPtr timeInfo, PaStreamCallbackFlags statusFlags, IntPtr userData) { var outPtr = output; do { if (lastSamplesOffset == 0) { while (true) { lastSamples = bufferFill(); if (lastSamples != null) { break; } Pa_Sleep(0); } } int numSamplesToCopy = (int)Math.Min(frameCount, lastSamples.Length - lastSamplesOffset); Marshal.Copy(lastSamples, lastSamplesOffset, outPtr, numSamplesToCopy); lastSamplesOffset += numSamplesToCopy; if (lastSamplesOffset == lastSamples.Length) { lastSamplesOffset = 0; } outPtr = IntPtr.Add(outPtr, numSamplesToCopy * sizeof(short)); frameCount = (uint)(frameCount - numSamplesToCopy); }while (frameCount != 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); } 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); }