oboe: cleanup resampler comments
diff --git a/src/common/README.md b/src/common/README.md
new file mode 100644
index 0000000..b55811e
--- /dev/null
+++ b/src/common/README.md
@@ -0,0 +1,33 @@
+# Notes on Implementation
+
+## Latency from Resampling
+
+There are two components of the latency. The resampler itself, and a buffer that
+is used to adapt the block sizes.
+
+1) The resampler is an FIR running at the target sample rate. So its latency is the number of taps.
+From MultiChannelResampler.cpp, numTaps is
+
+    Fastest: 2
+    Low: 4
+    Medium: 8
+    High: 16
+    Best: 32
+
+For output, the device sampling rate is used, which is typically 48000.For input, the app sampling rate is used.
+
+2) The is a block size adapter  collects odd sized blocks into larger blocks of the correct size.
+
+The adapter contains one burst of frames, from getFramesPerBurst(). But if the app specifies a
+particular size using setFramesPerCallback() then that size will be used.
+Here is some pseudo-code to calculate the latency.
+
+    latencyMillis = 0
+    targetRate = isOutput ? deviceRate : applicationRate
+    // Add latency from FIR
+    latencyMillis += numTaps * 1000.0 / targetRate
+    // Add latency from block size adaptation
+    adapterSize = (callbackSize > 0) ? callbackSize : burstSize
+    if (isOutput && isCallbackUsed) latencyMillis += adapterSize * 1000.0 / deviceRate
+    else if (isInput && isCallbackUsed) latencyMillis += adapterSize * 1000.0 / applicationRate
+    else if (isInput && !isCallbackUsed) latencyMillis += adapterSize * 1000.0 / deviceRate