Пример #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);
    }
Пример #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 = (WaveRecorder) gcHandle.Target;

            #endregion

            try
            {
                if (instance._bufferAvailable != null)
                {
                    instance._bufferAvailable(input, (int) frameCount);
                }
            }
            catch
            {
                return PaStreamCallbackResult.PaAbort;
            }

            return PaStreamCallbackResult.PaContinue;
         }
Пример #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 = (WavePlayer)gcHandle.Target;

            #endregion

            try
            {
                if (instance._bufferNeeded != null)
                {
                    instance._bufferNeeded(output, (int)frameCount);
                }
            }
            catch
            {
                return(PaStreamCallbackResult.PaAbort);
            }

            return(PaStreamCallbackResult.PaContinue);
        }
Пример #4
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);
        }
 // 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));
 }
Пример #7
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);
        }
Пример #8
0
 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;
 }
Пример #9
0
 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;
 }
Пример #10
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);
        }
Пример #11
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);
            }
            AudioPlayer instance = (AudioPlayer)gcHandle.Target;

            try {
                instance._bufferNeeded?.Invoke(new UnsafeSamplesEventArgs(output, (int)frameCount));
            } catch {
                return(PaStreamCallbackResult.paAbort);
            }

            return(PaStreamCallbackResult.paContinue);
        }
Пример #12
0
        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);
            }
        }
Пример #13
0
        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);
        }
Пример #14
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);
        }