Example #1
0
    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);
    }
Example #2
0
        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);
        }
Example #3
0
        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);
        }
Example #4
0
        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);
        }
Example #5
0
        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;
 }
Example #7
0
        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);
        }
Example #9
0
        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);
        }