Add CTS test for AudioTrack float playback

Bug: 15720368
Change-Id: I577f113d64e1f7d302430601c11704a42c65a86e
diff --git a/tests/tests/media/src/android/media/cts/AudioTrackTest.java b/tests/tests/media/src/android/media/cts/AudioTrackTest.java
index b076e6b..c14e42b 100644
--- a/tests/tests/media/src/android/media/cts/AudioTrackTest.java
+++ b/tests/tests/media/src/android/media/cts/AudioTrackTest.java
@@ -1322,6 +1322,16 @@
         return vai;
     }
 
+    public static float[] createSoundDataInFloatArray(int bufferSize, final int sampleRate,
+            double frequency) {
+        final double rad = 2 * Math.PI * frequency / sampleRate;
+        float[] vaf = new float[bufferSize];
+        for (int j = 0; j < vaf.length; j++) {
+            vaf[j] = (float) (Math.sin(j * rad));
+        }
+        return vaf;
+    }
+
     public void testPlayStreamData() throws Exception {
         // constants for test
         final String TEST_NAME = "testPlayStreamData";
@@ -1359,6 +1369,60 @@
         track.release();
     }
 
+    public void testPlayStreamFloat() throws Exception {
+        // constants for test
+        final String TEST_NAME = "testPlayStreamFloat";
+        final int TEST_SR_ARRAY[] = {
+                22050,
+                44100,
+                48000,
+        };
+        final int TEST_CONF_ARRAY[] = {
+                AudioFormat.CHANNEL_OUT_MONO,
+                AudioFormat.CHANNEL_OUT_STEREO,
+        };
+        final int TEST_FORMAT = AudioFormat.ENCODING_PCM_FLOAT;
+        final int TEST_MODE = AudioTrack.MODE_STREAM;
+        final int TEST_STREAM_TYPE = AudioManager.STREAM_MUSIC;
+
+        double frequency = 800; // frequency changes for each test
+        for (int TEST_SR : TEST_SR_ARRAY) {
+            for (int TEST_CONF : TEST_CONF_ARRAY) {
+                // -------- initialization --------------
+                int minBufferSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT);
+                int bufferSize = 3 * minBufferSize;
+                // Note: stereo will have twice the frequency
+                float data[] = createSoundDataInFloatArray(bufferSize, TEST_SR,
+                        frequency);
+                AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR,
+                        TEST_CONF, TEST_FORMAT, minBufferSize, TEST_MODE);
+                // -------- test --------------
+                assertTrue(TEST_NAME, track.getState() == AudioTrack.STATE_INITIALIZED);
+                boolean hasPlayed = false;
+                int written = 0;
+                while (written < data.length) {
+                    if (data.length - written <= minBufferSize) {
+                        written += track.write(data, written, data.length - written,
+                                AudioTrack.WRITE_BLOCKING);
+                    } else {
+                        written += track.write(data, written, minBufferSize,
+                                AudioTrack.WRITE_BLOCKING);
+                        if (!hasPlayed) {
+                            track.play();
+                            hasPlayed = true;
+                        }
+                    }
+                }
+                Thread.sleep(WAIT_MSEC);
+                track.stop();
+                Thread.sleep(WAIT_MSEC);
+                // -------- tear down --------------
+                track.release();
+                frequency += 200; // increment test tone frequency
+            }
+        }
+    }
+
     public void testGetTimestamp() throws Exception {
         // constants for test
         final String TEST_NAME = "testGetTimestamp";