Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        // 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);
        }
Esempio n. 5
0
        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);
        }
Esempio n. 6
0
 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);
 }
Esempio n. 7
0
        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);
        }
Esempio n. 8
0
        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);
        }