hal: parse wav header based on chunksize

Parse wav header based on chunksize.

Change-Id: I217f72be4471fbe998f7d684b3c08399729725a3
diff --git a/qahw_api/test/qahw_playback_test.c b/qahw_api/test/qahw_playback_test.c
index 5ff1f9a..223726d 100644
--- a/qahw_api/test/qahw_playback_test.c
+++ b/qahw_api/test/qahw_playback_test.c
@@ -46,6 +46,7 @@
 #define ID_DATA 0x61746164
 
 #define FORMAT_PCM 1
+#define WAV_HEADER_LENGTH_MAX 46
 
 static thread_data_t *ethread_data = NULL;
 static cmd_data_t cmd_data;
@@ -656,15 +657,46 @@
     printf("                                          -> sound effect equalizer enabled\n\n");
 }
 
+static int get_wav_header_length (FILE* file_stream)
+{
+    int subchunk_size = 0, wav_header_len = 0;
+
+    fseek(file_stream, 16, SEEK_SET);
+    if(fread(&subchunk_size, 4, 1, file_stream) != 1) {
+        fprintf(stdout, "Unable to read subchunk:\n");
+        exit (1);
+    }
+    if(subchunk_size < 16) {
+        fprintf(stdout, "This is not a valid wav file \n");
+    } else {
+          switch (subchunk_size) {
+          case 16:
+              fprintf(stdout, "44-byte wav header \n");
+              wav_header_len = 44;
+              break;
+          case 18:
+              fprintf(stdout, "46-byte wav header \n");
+              wav_header_len = 46;
+              break;
+          default:
+              fprintf(stdout, "Header contains extra data and is larger than 46 bytes: subchunk_size=%d \n", subchunk_size);
+              wav_header_len = subchunk_size;
+              break;
+          }
+    }
+    return wav_header_len;
+}
+
+
 int main(int argc, char* argv[]) {
 
     FILE *file_stream = NULL;
-    char header[44] = {0};
+    char header[WAV_HEADER_LENGTH_MAX] = {0};
     char* filename = nullptr;
     qahw_module_handle_t *qahw_mod_handle = NULL;
     const char *mod_name = "audio.primary";
     qahw_stream_handle_t* out_handle = nullptr;
-    int rc = 0;
+    int rc = 0, wav_header_len = 0;
     char *kvpair_values = NULL;
     char kvpair[1000] = {0};
     struct proxy_data proxy_params;
@@ -874,7 +906,12 @@
             /*
              * Read the wave header
              */
-            rc = fread (header, 44 , 1, file_stream);
+            if((wav_header_len = get_wav_header_length(file_stream)) <= 0) {
+                fprintf(stdout, "wav header length is invalid:%d\n", wav_header_len);
+                exit(1);
+            }
+            fseek(file_stream, 0, SEEK_SET);
+            rc = fread (header, wav_header_len, 1, file_stream);
             if (rc != 1) {
                fprintf(stdout, "Error .Fread failed\n");
                exit(0);