Example #1
0
    static IntPtr ReadAudio(int sampleNums, IntPtr numSamplesPointer)
    {
        context.Send((_) =>
        {
            if (sampleNums <= 0)
            {
                numSamplesToCopy = 0;
                return;
            }

            // 前回の録音位置から今回の録音位置までを返す
            var currentReadPos = Microphone.GetPosition("");
            if (previousReadPos < currentReadPos) // 巻き戻りが起きていない
            {
                var sampleRected = (currentReadPos - previousReadPos);
                numSamplesToCopy = Math.Min(sampleRected, sampleNums);

                CopySamplesFromClipToSharedBuffer(numSamplesToCopy);
            }
            else if (currentReadPos < previousReadPos) // 巻き戻りが起きている
            {
                var sampleRected = ((clip.samples - previousReadPos) + currentReadPos);
                numSamplesToCopy = Math.Min(sampleRected, sampleNums);

                CopySamplesFromClipToSharedBuffer(numSamplesToCopy);
            }
            else
            {
                numSamplesToCopy = 0;
            }

            previousReadPos = currentReadPos;
        }, null);

        Marshal.WriteInt32(numSamplesPointer, numSamplesToCopy);
        return(sharedBuffer);
    }