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); }