hal : non-ms12 fmt support in qaf

Support for non-ms12 formats after qaf extension is enabled, by routing
it back to primary hal. Also added changes to cache volume levels and
apply them later.

Change-Id: I9e90be203b86e20466a946f5b5726ccbd95bfec3
diff --git a/hal/audio_extn/qaf.c b/hal/audio_extn/qaf.c
index 9739201..32af216 100644
--- a/hal/audio_extn/qaf.c
+++ b/hal/audio_extn/qaf.c
@@ -148,11 +148,29 @@
     bool main_output_active;
     bool assoc_output_active;
     bool qaf_msmd_enabled;
+    float vol_left;
+    float vol_right;
 };
 
 static struct qaf *qaf_mod = NULL;
 static int qaf_stream_set_param(struct stream_out *out, const char *kv_pair) __attribute__ ((unused));
 
+static bool is_ms12_format(audio_format_t format)
+{
+    if((format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_AC3)
+        return true;
+    if((format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_E_AC3)
+        return true;
+    if((format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_AAC)
+        return true;
+    if((format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_AAC_ADTS)
+        return true;
+    if(format == AUDIO_FORMAT_PCM_16_BIT)
+        return true;
+
+    return false;
+}
+
 static void lock_output_stream(struct stream_out *out)
 {
     pthread_mutex_lock(&out->pre_lock);
@@ -293,6 +311,12 @@
 static int qaf_out_set_volume(struct audio_stream_out *stream __unused, float left,
                           float right)
 {
+    /* For ms12 formats, qaf_mod->qaf_compr_offload_out is allocated during the first
+     * call of notify_event_callback(). Therefore, the volume levels set during session
+     * open have to be cached and applied later */
+    qaf_mod->vol_left = left;
+    qaf_mod->vol_right = right;
+
     if (qaf_mod->qaf_compr_offload_out != NULL) {
         return qaf_mod->qaf_compr_offload_out->stream.set_volume(
             (struct audio_stream_out *)qaf_mod->qaf_compr_offload_out, left, right);
@@ -765,6 +789,8 @@
                 qaf_mod->qaf_compr_offload_out->info.channel_mask = config.offload_info.channel_mask;
                 qaf_mod->qaf_compr_offload_out->info.format = config.offload_info.format;
                 qaf_mod->qaf_compr_offload_out->info.sample_rate = config.offload_info.sample_rate;
+
+                qaf_mod->qaf_compr_offload_out->stream.set_volume((struct audio_stream_out *)qaf_mod->qaf_compr_offload_out, qaf_mod->vol_left, qaf_mod->vol_right);
             }
 
             if (!qaf_mod->hdmi_connect && (qaf_mod->qaf_compr_passthrough_out || qaf_mod->qaf_compr_offload_out_mch)) {
@@ -1258,6 +1284,11 @@
         goto error_open;
     }
 
+    if ( false == is_ms12_format(config->format) ) {
+        ALOGV("%s: exiting qaf for non-ms12 format %x", __func__, config->format);
+        return ret;
+    }
+
     out = (struct stream_out *) *stream_out;
 
     /* Override function pointers based on qaf definitions */