OboeTester: show framesPerCallback
diff --git a/apps/OboeTester/app/src/main/cpp/NativeAudioContext.h b/apps/OboeTester/app/src/main/cpp/NativeAudioContext.h
index 74d0c8a..2f570e5 100644
--- a/apps/OboeTester/app/src/main/cpp/NativeAudioContext.h
+++ b/apps/OboeTester/app/src/main/cpp/NativeAudioContext.h
@@ -287,6 +287,10 @@
         return oboeCallbackProxy.getCallbackCount();
     }
 
+    int32_t getFramesPerCallback() {
+        return oboeCallbackProxy.getFramesPerCallback();
+    }
+
     virtual void setChannelEnabled(int channelIndex, bool enabled) {}
 
     virtual void setSignalType(int signalType) {}
diff --git a/apps/OboeTester/app/src/main/cpp/OboeStreamCallbackProxy.cpp b/apps/OboeTester/app/src/main/cpp/OboeStreamCallbackProxy.cpp
index fa9f175..17ea8f5 100644
--- a/apps/OboeTester/app/src/main/cpp/OboeStreamCallbackProxy.cpp
+++ b/apps/OboeTester/app/src/main/cpp/OboeStreamCallbackProxy.cpp
@@ -47,6 +47,8 @@
         void *audioData,
         int numFrames) {
     mCallbackCount++;
+    mFramesPerCallback = numFrames;
+
     if (mCallbackReturnStop) {
         return oboe::DataCallbackResult::Stop;
     }
diff --git a/apps/OboeTester/app/src/main/cpp/OboeStreamCallbackProxy.h b/apps/OboeTester/app/src/main/cpp/OboeStreamCallbackProxy.h
index d21d905..c8e1be9 100644
--- a/apps/OboeTester/app/src/main/cpp/OboeStreamCallbackProxy.h
+++ b/apps/OboeTester/app/src/main/cpp/OboeStreamCallbackProxy.h
@@ -42,6 +42,10 @@
         mCallbackCount = count;
     }
 
+    int32_t getFramesPerCallback() {
+        return mFramesPerCallback.load();
+    }
+
     /**
      * Called when the stream is ready to process audio.
      */
@@ -74,6 +78,7 @@
     oboe::AudioStreamCallback *mCallback = nullptr;
     static bool                mCallbackReturnStop;
     int64_t                    mCallbackCount = 0;
+    std::atomic<int32_t>       mFramesPerCallback{0};
 };
 
 
diff --git a/apps/OboeTester/app/src/main/cpp/jni-bridge.cpp b/apps/OboeTester/app/src/main/cpp/jni-bridge.cpp
index 97e09d0..d0a6b46 100644
--- a/apps/OboeTester/app/src/main/cpp/jni-bridge.cpp
+++ b/apps/OboeTester/app/src/main/cpp/jni-bridge.cpp
@@ -150,6 +150,11 @@
 }
 
 JNIEXPORT jint JNICALL
+Java_com_google_sample_oboe_manualtest_TestAudioActivity_getFramesPerCallback(JNIEnv *env, jobject) {
+    return (jint) engine.getCurrentActivity()->getFramesPerCallback();
+}
+
+JNIEXPORT jint JNICALL
 Java_com_google_sample_oboe_manualtest_OboeAudioStream_startPlaybackNative(JNIEnv *env, jobject) {
     return (jint) engine.getCurrentActivity()->startPlayback();
 }
diff --git a/apps/OboeTester/app/src/main/java/com/google/sample/oboe/manualtest/AudioStreamBase.java b/apps/OboeTester/app/src/main/java/com/google/sample/oboe/manualtest/AudioStreamBase.java
index e3c8227..c4cfcd1 100644
--- a/apps/OboeTester/app/src/main/java/com/google/sample/oboe/manualtest/AudioStreamBase.java
+++ b/apps/OboeTester/app/src/main/java/com/google/sample/oboe/manualtest/AudioStreamBase.java
@@ -51,6 +51,7 @@
         public double latency; // msec
         public int state;
         public long callbackCount;
+        public int framesPerCallback;
 
         // These are constantly changing.
         String dump(int framesPerBurst) {
@@ -64,10 +65,13 @@
 
             String latencyText = (latency < 0.0)
                     ? "?"
-                    : String.format("%6.1f msec", latency);
-            buffer.append("latency = " + latencyText
-                    + ", " + convertStateToString(state)
-                    + ", #callbacks " + callbackCount+ "\n");
+                    : String.format("%6.1f ms", latency);
+            buffer.append(
+                    convertStateToString(state)
+                    + ", #cb=" + callbackCount
+                    + ", f/cb=" + String.format("%3d", framesPerCallback)
+                    + ", latency = " + latencyText
+                    + "\n");
 
             buffer.append("buffer size = ");
             if (bufferSize < 0) {
@@ -162,4 +166,5 @@
 
     public abstract int getXRunCount();
 
+
 }
diff --git a/apps/OboeTester/app/src/main/java/com/google/sample/oboe/manualtest/TestAudioActivity.java b/apps/OboeTester/app/src/main/java/com/google/sample/oboe/manualtest/TestAudioActivity.java
index d9ea057..317b07b 100644
--- a/apps/OboeTester/app/src/main/java/com/google/sample/oboe/manualtest/TestAudioActivity.java
+++ b/apps/OboeTester/app/src/main/java/com/google/sample/oboe/manualtest/TestAudioActivity.java
@@ -104,6 +104,7 @@
                     if (streamContext.configurationView != null) {
                         // Handler runs this on the main UI thread.
                         int framesPerBurst = streamContext.tester.getCurrentAudioStream().getFramesPerBurst();
+                        status.framesPerCallback = getFramesPerCallback();
                         final String msg = status.dump(framesPerBurst);
                         streamContext.configurationView.setStatusText(msg);
                         updateStreamDisplay();
@@ -423,6 +424,7 @@
     private native int pauseNative();
     private native int stopNative();
     protected native void setActivityType(int activityType);
+    private native int getFramesPerCallback();
 
     public void startAudio() {
         int result = startNative();