Merge tag android-5.1.0_r1 into AOSP_5.1_MERGE

Change-Id: Id618d136ddb2f5e3a2cb2dc0aaba94b75ca34064
diff --git a/tinyplay.c b/tinyplay.c
index f4fac9f..5ca8e84 100644
--- a/tinyplay.c
+++ b/tinyplay.c
@@ -59,6 +59,7 @@
 };
 
 static int close = 0;
+static int data_sz = 0;
 
 void play_sample(FILE *file, unsigned int card, unsigned int device, unsigned int channels,
                  unsigned int rate, unsigned int bits, unsigned int period_size,
@@ -117,6 +118,7 @@
             break;
         case ID_DATA:
             /* Stop looking for chunks */
+            data_sz = chunk_header.sz;
             more_chunks = 0;
             break;
         default:
@@ -217,6 +219,7 @@
     char *buffer;
     int size;
     int num_read;
+    int remaining_data;
 
     config.channels = channels;
     config.rate = rate;
@@ -250,6 +253,8 @@
         return;
     }
 
+    remaining_data = data_sz;
+
     printf("Playing sample: %u ch, %u hz, %u bit\n", channels, rate, bits);
 
     /* catch ctrl-c to shutdown cleanly */
@@ -262,8 +267,13 @@
                 fprintf(stderr, "Error playing sample\n");
                 break;
             }
+            if (remaining_data) {
+                remaining_data -= size;
+                if (remaining_data < size)
+                    size = remaining_data;
+            }
         }
-    } while (!close && num_read > 0);
+    } while (!close && num_read > 0 && !(remaining_data <= 0));
 
     free(buffer);
     pcm_close(pcm);