hal: Fix true mode native playback on internal codec

- Update check to ensure that native playback is supported
on non-tasha variants as well if the platform supports it.
-Configure ADM with correct sample rate for native
playback.

Change-Id: I7c95171b6afd3727f114be1223e09d40c674a428
diff --git a/hal/audio_extn/utils.c b/hal/audio_extn/utils.c
index 81dfbd1..b12ab8e 100644
--- a/hal/audio_extn/utils.c
+++ b/hal/audio_extn/utils.c
@@ -830,15 +830,6 @@
     }
 
     if ((usecase->type == PCM_PLAYBACK) && (usecase->stream.out != NULL)) {
-        if (usecase->stream.out->devices & AUDIO_DEVICE_OUT_SPEAKER) {
-            usecase->stream.out->app_type_cfg.sample_rate = DEFAULT_OUTPUT_SAMPLING_RATE;
-        } else if ((usecase->stream.out->app_type_cfg.sample_rate == OUTPUT_SAMPLING_RATE_44100 &&
-                     !(audio_is_this_native_usecase(usecase))) ||
-                     (usecase->stream.out->sample_rate < OUTPUT_SAMPLING_RATE_44100)) {
-                   usecase->stream.out->app_type_cfg.sample_rate = DEFAULT_OUTPUT_SAMPLING_RATE;
-        }
-
-        sample_rate = usecase->stream.out->app_type_cfg.sample_rate;
 
         property_get("audio.playback.mch.downsample",value,"");
         if (!strncmp("true", value, sizeof("true"))) {
@@ -848,8 +839,7 @@
                sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
         }
 
-        if ((24 == usecase->stream.out->bit_width) &&
-            (usecase->stream.out->devices & AUDIO_DEVICE_OUT_SPEAKER)) {
+        if (usecase->stream.out->devices & AUDIO_DEVICE_OUT_SPEAKER) {
             usecase->stream.out->app_type_cfg.sample_rate = DEFAULT_OUTPUT_SAMPLING_RATE;
         } else if ((snd_device == SND_DEVICE_OUT_HDMI ||
                     snd_device == SND_DEVICE_OUT_USB_HEADSET ||
@@ -863,9 +853,11 @@
               platform_check_and_update_copp_sample_rate(adev->platform, snd_device,
                                       usecase->stream.out->sample_rate,
                                       &usecase->stream.out->app_type_cfg.sample_rate);
-        } else if ((snd_device != SND_DEVICE_OUT_HEADPHONES_44_1 &&
+        } else if (((snd_device != SND_DEVICE_OUT_HEADPHONES_44_1 &&
+                     !audio_is_this_native_usecase(usecase)) &&
             usecase->stream.out->sample_rate == OUTPUT_SAMPLING_RATE_44100) ||
             (usecase->stream.out->sample_rate < OUTPUT_SAMPLING_RATE_44100)) {
+            /* Reset to default if no native stream is active*/
             usecase->stream.out->app_type_cfg.sample_rate = DEFAULT_OUTPUT_SAMPLING_RATE;
         }
         sample_rate = usecase->stream.out->app_type_cfg.sample_rate;
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 595e72b..6f33acf 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -1656,7 +1656,8 @@
             platform_check_and_update_copp_sample_rate(adev->platform, out_snd_device,
                     usecase->stream.out->sample_rate,
                     &usecase->stream.out->app_type_cfg.sample_rate);
-        } else if ((out_snd_device != SND_DEVICE_OUT_HEADPHONES_44_1 &&
+        } else if (((out_snd_device != SND_DEVICE_OUT_HEADPHONES_44_1 &&
+                     !audio_is_true_native_stream_active(adev)) &&
                     usecase->stream.out->sample_rate == OUTPUT_SAMPLING_RATE_44100) ||
                     (usecase->stream.out->sample_rate < OUTPUT_SAMPLING_RATE_44100)) {
             usecase->stream.out->app_type_cfg.sample_rate = DEFAULT_OUTPUT_SAMPLING_RATE;
diff --git a/hal/msm8916/platform.c b/hal/msm8916/platform.c
index fc461ce..43869a2 100644
--- a/hal/msm8916/platform.c
+++ b/hal/msm8916/platform.c
@@ -239,7 +239,7 @@
     char     *channels_mixer_ctl;
 } codec_backend_cfg_t;
 
-static native_audio_prop na_props = {0, 0, 0};
+static native_audio_prop na_props = {0, 0, NATIVE_AUDIO_MODE_INVALID};
 static bool supports_true_32_bit = false;
 
 struct meta_key_list {
@@ -2460,17 +2460,15 @@
                       __func__);
                 platform_set_native_support(NATIVE_AUDIO_MODE_SRC);
             }
-        } else {
-            platform_set_native_support(NATIVE_AUDIO_MODE_INVALID);
+        }
+        if (strstr(snd_card_name, "tavil")) {
+            ALOGD("%s:DSD playback is supported", __func__);
+            my_data->is_dsd_supported = true;
+            my_data->is_asrc_supported = true;
+            platform_set_native_support(NATIVE_AUDIO_MODE_MULTIPLE_44_1);
         }
     }
 
-    if(strstr(snd_card_name, "tavil")) {
-        ALOGD("%s:DSD playback is supported", __func__);
-        my_data->is_dsd_supported = true;
-        my_data->is_asrc_supported = true;
-        platform_set_native_support(NATIVE_AUDIO_MODE_MULTIPLE_44_1);
-    }
     my_data->edid_info = NULL;
     return my_data;
 }
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index f161f7e..93b28ca 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -214,7 +214,7 @@
     char     *channels_mixer_ctl;
 } codec_backend_cfg_t;
 
-static native_audio_prop na_props = {0, 0, 0};
+static native_audio_prop na_props = {0, 0, NATIVE_AUDIO_MODE_INVALID};
 static bool supports_true_32_bit = false;
 typedef int (*acdb_send_gain_dep_cal_t)(int, int, int, int, int);
 
@@ -2134,16 +2134,13 @@
                       __func__);
                 platform_set_native_support(NATIVE_AUDIO_MODE_SRC);
             }
-        } else {
-            platform_set_native_support(NATIVE_AUDIO_MODE_INVALID);
         }
-    }
-
-    if(strstr(snd_card_name, "tavil")) {
-        ALOGD("%s:DSD playback is supported", __func__);
-        my_data->is_dsd_supported = true;
-        my_data->is_asrc_supported = true;
-        platform_set_native_support(NATIVE_AUDIO_MODE_MULTIPLE_44_1);
+        if (strstr(snd_card_name, "tavil")) {
+            ALOGD("%s:DSD playback is supported", __func__);
+            my_data->is_dsd_supported = true;
+            my_data->is_asrc_supported = true;
+            platform_set_native_support(NATIVE_AUDIO_MODE_MULTIPLE_44_1);
+        }
     }
 
     my_data->current_backend_cfg[HEADPHONE_BACKEND].bitwidth_mixer_ctl =