public PortAudio.PaStreamCallbackResult myPaStreamCallback( IntPtr input, IntPtr output, uint frameCount, ref PortAudio.PaStreamCallbackTimeInfo timeInfo, PortAudio.PaStreamCallbackFlags statusFlags, IntPtr userData) { try { // log("Callback called"); // log("time: " + timeInfo.currentTime // + " " + timeInfo.inputBufferAdcTime // + " " + timeInfo.outputBufferDacTime); // log("statusFlags: "+statusFlags); if (callbackBuffer.Length < frameCount * 2) { callbackBuffer = new float[frameCount * 2]; } for (int j = 0; j < frameCount * 2; j++) { callbackBuffer[j] = (float)Math.Sin((double)(callbackPos++) / 20.0); } Marshal.Copy(callbackBuffer, 0, output, (int)frameCount * 2); } catch (Exception e) { Console.WriteLine(e.ToString()); } return(PortAudio.PaStreamCallbackResult.paContinue); }
public PortAudio.PaStreamCallbackResult myPaStreamCallback( IntPtr input, IntPtr output, uint frameCount, ref PortAudio.PaStreamCallbackTimeInfo timeInfo, PortAudio.PaStreamCallbackFlags statusFlags, IntPtr userData) { SoundPacket packet; if (stop_flag && sampleQueue.Count == 0) { //this is likely a bad way of checking if the stream is complete as it could get in here if the read thread //falls behind but it works behind. //todo: find a smarter way of knowing when the stream completes return(PortAudio.PaStreamCallbackResult.paComplete); } if (sampleQueue.Count == 0) { byte[] buffer = new byte[NUM_SAMPLES]; Marshal.Copy(buffer, 0, output, (int)(frameCount * (bitDepth / 8) * 2)); return(PortAudio.PaStreamCallbackResult.paContinue); //probably paused } packet = (SoundPacket)sampleQueue.Dequeue(); form.Invoke(form.myDelegate, new object[] { packet.averageDB }); Marshal.Copy(packet.samples, 0, output, (int)(frameCount * (bitDepth / 8) * 2)); return(PortAudio.PaStreamCallbackResult.paContinue); }
public PortAudio.PaStreamCallbackResult myPaStreamCallback( IntPtr input, IntPtr output, uint frameCount, ref PortAudio.PaStreamCallbackTimeInfo timeInfo, PortAudio.PaStreamCallbackFlags statusFlags, IntPtr userData) { try { frameCount *= 4; if (frameCount > 0 && input != IntPtr.Zero) { byte[] _recbuffer = new byte[frameCount]; byte[] _leftBuffer = new byte[frameCount / 2]; byte[] _rightBuffer = new byte[frameCount / 2]; // copy from managed to unmanaged memory Marshal.Copy(input, _recbuffer, 0, (int)frameCount); // copy into left/right Buffer for (int i = 0; i < frameCount / 2; i++) { _leftBuffer[i] = _recbuffer[i * 2 - (i % 2)]; _rightBuffer[i] = _recbuffer[i * 2 - (i % 2) + 2]; } for (int i = 0; i < _recHandle.Length; i++) { if (new IntPtr(i) == userData) { if (_DeviceConfig[i].Inputs[0].PlayerChannel1 > 0) { _Buffer[_DeviceConfig[i].Inputs[0].PlayerChannel1 - 1].ProcessNewBuffer(_leftBuffer); } if (_DeviceConfig[i].Inputs[0].PlayerChannel2 > 0) { _Buffer[_DeviceConfig[i].Inputs[0].PlayerChannel2 - 1].ProcessNewBuffer(_rightBuffer); } break; } } } } catch (Exception e) { CLog.LogError("Error on Stream Callback: " + e.ToString()); } return(PortAudio.PaStreamCallbackResult.paContinue); }
// Audio render callback static PortAudio.PaStreamCallbackResult AudioCallback( IntPtr input, IntPtr output, uint frameCount, ref PortAudio.PaStreamCallbackTimeInfo timeInfo, PortAudio.PaStreamCallbackFlags statusFlags, IntPtr userData) { unsafe { LibPD.Process((int)frameCount / LibPD.BlockSize, (float *)input.ToPointer(), (float *)output.ToPointer()); } return(PortAudio.PaStreamCallbackResult.paContinue); }
public PortAudio.PaStreamCallbackResult myPaStreamCallback( IntPtr input, IntPtr output, uint frameCount, ref PortAudio.PaStreamCallbackTimeInfo timeInfo, PortAudio.PaStreamCallbackFlags statusFlags, IntPtr userData) { if (stop_flag) { return(PortAudio.PaStreamCallbackResult.paComplete); } byte[] buffer = new byte[NUM_SAMPLES * 2]; //buffer to read the raw bytes into Marshal.Copy(input, buffer, 0, (int)(NUM_SAMPLES * 2)); sampleQueue.Enqueue(buffer); //send the buffer to the queue return(PortAudio.PaStreamCallbackResult.paContinue); }
public PortAudio.PaStreamCallbackResult recordCallback( IntPtr input, IntPtr output, uint frameCount, ref PortAudio.PaStreamCallbackTimeInfo timeInfo, PortAudio.PaStreamCallbackFlags statusFlags, IntPtr userData) { try { float[] callbackBuffer = new float[frameCount]; Marshal.Copy(input, callbackBuffer, 0, (int)frameCount); samplesDelegate(callbackBuffer); } catch (Exception e) { Console.WriteLine(e.ToString()); } return(PortAudio.PaStreamCallbackResult.paContinue); }
private PortAudio.PaStreamCallbackResult _PaStreamCallback( IntPtr input, IntPtr output, uint frameCount, ref PortAudio.PaStreamCallbackTimeInfo timeInfo, PortAudio.PaStreamCallbackFlags statusFlags, IntPtr userData) { byte[] buf = new byte[frameCount * _ByteCount]; if (_Paused) { try { Marshal.Copy(buf, 0, output, (int)frameCount * _ByteCount); } catch (Exception e) { Console.WriteLine(e.ToString()); } return(PortAudio.PaStreamCallbackResult.paContinue); } lock (MutexData) { if (_NoMoreData || _data.BytesNotRead >= buf.Length) { _data.Read(ref buf); byte[] b = new byte[2]; for (int i = 0; i < buf.Length; i += _ByteCount) { b[0] = buf[i]; b[1] = buf[i + 1]; b = BitConverter.GetBytes((Int16)(BitConverter.ToInt16(b, 0) * _Volume)); buf[i] = b[0]; buf[i + 1] = b[1]; if (_ByteCount == 4) { b[0] = buf[i + 2]; b[1] = buf[i + 3]; b = BitConverter.GetBytes((Int16)(BitConverter.ToInt16(b, 0) * _Volume)); buf[i + 2] = b[0]; buf[i + 3] = b[1]; } } } if (_data.BytesNotRead < BUFSIZE - 10000L) { EventDecode.Set(); _waiting = false; } else { _waiting = true; } float latency = buf.Length / _BytesPerSecond + CConfig.AudioLatency / 1000f; float time = _TimeCode - _data.BytesNotRead / _BytesPerSecond - latency; _CurrentTime = _SyncTimer.Update(time); } try { Marshal.Copy(buf, 0, output, (int)frameCount * _ByteCount); } catch (Exception e) { CLog.LogError("Error PortAudio.StreamCallback: " + e.Message); } return(PortAudio.PaStreamCallbackResult.paContinue); }
PortAudio.PaStreamCallbackResult RealtimeCallback(IntPtr inputBuffer, IntPtr outputBuffer, uint framesPerBuffer, ref PortAudio.PaStreamCallbackTimeInfo timeInfo, PortAudio.PaStreamCallbackFlags statusFlags, IntPtr userData) { if (UseDirectProcessing) { var ins = (float **)inputBuffer; var outs = (float **)outputBuffer; ProcessDirect(ins, outs, (int)framesPerBuffer); return(PortAudio.PaStreamCallbackResult.paContinue); } float[][] Inputs = new float[NumberOfInputs][]; float[][] Outputs = new float[NumberOfOutputs][]; // create input channels and copy data into them for (int i = 0; i < NumberOfInputs; i++) { float * inChannel = (float *)((float **)inputBuffer)[i]; float[] inArr = new float[framesPerBuffer]; Marshal.Copy((IntPtr)inChannel, inArr, 0, (int)framesPerBuffer); Inputs[i] = inArr; } // create empty output array for (int i = 0; i < NumberOfOutputs; i++) { float[] outArr = new float[framesPerBuffer]; Outputs[i] = outArr; } // Call the process function Process(Inputs, Outputs); // Copy data back from managed array into native array for (int i = 0; i < NumberOfOutputs; i++) { float * outChannel = (float *)((float **)outputBuffer)[i]; float[] outArr = Outputs[i]; Marshal.Copy(outArr, 0, (IntPtr)outChannel, (int)framesPerBuffer); } return(PortAudio.PaStreamCallbackResult.paContinue); }