Promotion of av-userspace.lnx.1.0-00037.

CRs      Change ID                                   Subject
--------------------------------------------------------------------------------------------------------------
955740   Iaeb53fb362852416603cd57ba15da37b30973c0f   hal: Set sampling rate for stream_out
967679   I6df10e0033ebbe46f339fb934ca6c2df3622c901   hal: Remove alac, ape from hardware decoder list

Change-Id: Ic450e8addb78f86e9bf5444f9a04d992c6c8d7e4
CRs-Fixed: 955740, 967679
diff --git a/hal/msm8916/platform.c b/hal/msm8916/platform.c
index f630270..4839451 100644
--- a/hal/msm8916/platform.c
+++ b/hal/msm8916/platform.c
@@ -137,6 +137,7 @@
 #define EVENT_EXTERNAL_SPK_2 "qc_ext_spk_2"
 #define EVENT_EXTERNAL_MIC   "qc_ext_mic"
 #define MAX_CAL_NAME 20
+#define MAX_MIME_TYPE_LENGTH 30
 
 char cal_name_info[WCD9XXX_MAX_CAL][MAX_CAL_NAME] = {
         [WCD9XXX_ANC_CAL] = "anc_cal",
@@ -148,7 +149,7 @@
 
 #define  AUDIO_PARAMETER_IS_HW_DECODER_SESSION_AVAILABLE  "is_hw_dec_session_available"
 
-char * dsp_only_decoders_mime[] = {
+char dsp_only_decoders_mime[][MAX_MIME_TYPE_LENGTH] = {
     "audio/x-ms-wma" /* wma*/ ,
     "audio/x-ms-wma-lossless" /* wma lossless */ ,
     "audio/x-ms-wma-pro" /* wma prop */ ,
@@ -1077,10 +1078,6 @@
     audio_devices_t out_device)
 {
     struct platform_data *my_data = (struct platform_data *)adev->platform;
-    snd_device_t snd_device = SND_DEVICE_NONE;
-    struct stream_out out;
-
-    out.devices = out_device;
 
     if (strcmp(my_data->ec_ref_mixer_path, "")) {
         ALOGV("%s: disabling %s", __func__, my_data->ec_ref_mixer_path);
@@ -1089,13 +1086,10 @@
     }
 
     if (enable) {
-        snd_device = platform_get_output_snd_device(adev->platform, &out);
-
         if (adev->snd_dev_ref_cnt[SND_DEVICE_OUT_HEADPHONES_44_1] > 0)
             strlcpy(my_data->ec_ref_mixer_path, "echo-reference headphones-44.1",
                 sizeof(my_data->ec_ref_mixer_path));
-        else if ((snd_device == SND_DEVICE_OUT_SPEAKER_VBAT) ||
-                 (snd_device == SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT))
+        else if (adev->snd_dev_ref_cnt[SND_DEVICE_OUT_SPEAKER_VBAT] > 0)
             strlcpy(my_data->ec_ref_mixer_path, "vbat-speaker echo-reference",
                 sizeof(my_data->ec_ref_mixer_path));
         else
@@ -1273,7 +1267,11 @@
 
 static void set_platform_defaults()
 {
-    int32_t dev;
+    int32_t dev, count = 0;
+    char dsp_decoder_property[PROPERTY_VALUE_MAX];
+    const char *MEDIA_MIMETYPE_AUDIO_ALAC = "audio/alac";
+    const char *MEDIA_MIMETYPE_AUDIO_APE = "audio/x-ape";
+
     for (dev = 0; dev < SND_DEVICE_MAX; dev++) {
         backend_table[dev] = NULL;
     }
@@ -1302,6 +1300,27 @@
     backend_table[SND_DEVICE_OUT_TRANSMISSION_FM] = strdup("transmission-fm");
     backend_table[SND_DEVICE_OUT_HEADPHONES_44_1] = strdup("headphones-44.1");
     backend_table[SND_DEVICE_OUT_VOICE_SPEAKER_VBAT] = strdup("vbat-voice-speaker");
+
+    /*remove ALAC & APE from DSP decoder list based on software decoder availability*/
+    for (count = 0; count < sizeof(dsp_only_decoders_mime)/sizeof(dsp_only_decoders_mime[0]);
+            count++) {
+
+        if (!strncmp(MEDIA_MIMETYPE_AUDIO_ALAC, dsp_only_decoders_mime[count],
+             strlen(dsp_only_decoders_mime[count]))) {
+
+            if(property_get_bool("use.qti.sw.alac.decoder", false)) {
+                ALOGD("Alac software decoder is available...removing alac from DSP decoder list");
+                strncpy(dsp_only_decoders_mime[count],"none",5);
+            }
+        } else if (!strncmp(MEDIA_MIMETYPE_AUDIO_APE, dsp_only_decoders_mime[count],
+             strlen(dsp_only_decoders_mime[count]))) {
+
+            if(property_get_bool("use.qti.sw.ape.decoder", false)) {
+                ALOGD("APE software decoder is available...removing ape from DSP decoder list");
+                strncpy(dsp_only_decoders_mime[count],"none",5);
+           }
+        }
+    }
 }
 
 void get_cvd_version(char *cvd_version, struct audio_device *adev)
@@ -3463,6 +3482,7 @@
               cal.snd_dev_id = platform_get_input_snd_device(platform, cal.dev_id);
           } else {
               out.devices = cal.dev_id;
+              out.sample_rate = cal.sampling_rate;
               cal.snd_dev_id = platform_get_output_snd_device(platform, &out);
           }
         }
@@ -3697,6 +3717,7 @@
         cal.snd_dev_id = platform_get_input_snd_device(platform, cal.dev_id);
     } else if(cal.dev_id) {
         out.devices = cal.dev_id;
+        out.sample_rate = cal.sampling_rate;
         cal.snd_dev_id = platform_get_output_snd_device(platform, &out);
     }
     cal.acdb_dev_id =  platform_get_snd_device_acdb_id(cal.snd_dev_id);
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index 8822339..e091547 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -128,6 +128,7 @@
 #define EVENT_EXTERNAL_SPK_2 "qc_ext_spk_2"
 #define EVENT_EXTERNAL_MIC   "qc_ext_mic"
 #define MAX_CAL_NAME 20
+#define MAX_MIME_TYPE_LENGTH 30
 
 char cal_name_info[WCD9XXX_MAX_CAL][MAX_CAL_NAME] = {
         [WCD9XXX_ANC_CAL] = "anc_cal",
@@ -137,7 +138,7 @@
 
 #define  AUDIO_PARAMETER_IS_HW_DECODER_SESSION_ALLOWED  "is_hw_dec_session_allowed"
 
-char * dsp_only_decoders_mime[] = {
+char dsp_only_decoders_mime[][MAX_MIME_TYPE_LENGTH] = {
     "audio/x-ms-wma" /* wma*/ ,
     "audio/x-ms-wma-lossless" /* wma lossless */ ,
     "audio/x-ms-wma-pro" /* wma prop */ ,
@@ -830,10 +831,6 @@
                                  audio_devices_t out_device)
 {
     struct platform_data *my_data = (struct platform_data *)adev->platform;
-    snd_device_t snd_device = SND_DEVICE_NONE;
-    struct stream_out out;
-
-    out.devices = out_device;
 
     if (strcmp(my_data->ec_ref_mixer_path, "")) {
         ALOGV("%s: disabling %s", __func__, my_data->ec_ref_mixer_path);
@@ -842,8 +839,6 @@
     }
 
     if (enable) {
-        snd_device = platform_get_output_snd_device(adev->platform, &out);
-
         /*
          * If native audio device reference count > 0, then apply codec EC otherwise
          * fallback to Speakers with VBat if enabled or default
@@ -851,8 +846,7 @@
         if (adev->snd_dev_ref_cnt[SND_DEVICE_OUT_HEADPHONES_44_1] > 0)
             strlcpy(my_data->ec_ref_mixer_path, "echo-reference headphones-44.1",
                     sizeof(my_data->ec_ref_mixer_path));
-        else if ((snd_device == SND_DEVICE_OUT_SPEAKER_VBAT) ||
-                 (snd_device == SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT))
+        else if (adev->snd_dev_ref_cnt[SND_DEVICE_OUT_SPEAKER_VBAT] > 0)
             strlcpy(my_data->ec_ref_mixer_path, "echo-reference speaker-vbat",
                     sizeof(my_data->ec_ref_mixer_path));
         else
@@ -1035,7 +1029,11 @@
 
 static void set_platform_defaults()
 {
-    int32_t dev;
+    int32_t dev, count = 0;
+    char dsp_decoder_property[PROPERTY_VALUE_MAX];
+    const char *MEDIA_MIMETYPE_AUDIO_ALAC = "audio/alac";
+    const char *MEDIA_MIMETYPE_AUDIO_APE = "audio/x-ape";
+
     for (dev = 0; dev < SND_DEVICE_MAX; dev++) {
         backend_table[dev] = NULL;
     }
@@ -1066,6 +1064,28 @@
     backend_table[SND_DEVICE_OUT_HEADPHONES] = strdup("headphones");
     backend_table[SND_DEVICE_OUT_HEADPHONES_44_1] = strdup("headphones-44.1");
     backend_table[SND_DEVICE_OUT_VOICE_SPEAKER_VBAT] = strdup("voice-speaker-vbat");
+
+
+     /*remove ALAC & APE from DSP decoder list based on software decoder availability*/
+     for (count = 0; count < sizeof(dsp_only_decoders_mime)/sizeof(dsp_only_decoders_mime[0]);
+            count++) {
+
+         if (!strncmp(MEDIA_MIMETYPE_AUDIO_ALAC, dsp_only_decoders_mime[count],
+              strlen(dsp_only_decoders_mime[count]))) {
+
+             if(property_get_bool("use.qti.sw.alac.decoder", false)) {
+                 ALOGD("Alac software decoder is available...removing alac from DSP decoder list");
+                 strncpy(dsp_only_decoders_mime[count],"none",5);
+             }
+         } else if (!strncmp(MEDIA_MIMETYPE_AUDIO_APE, dsp_only_decoders_mime[count],
+              strlen(dsp_only_decoders_mime[count]))) {
+
+             if(property_get_bool("use.qti.sw.ape.decoder", false)) {
+                 ALOGD("APE software decoder is available...removing ape from DSP decoder list");
+                 strncpy(dsp_only_decoders_mime[count],"none",5);
+             }
+         }
+     }
 }
 
 void get_cvd_version(char *cvd_version, struct audio_device *adev)
@@ -3109,6 +3129,7 @@
               cal.snd_dev_id = platform_get_input_snd_device(platform, cal.dev_id);
           } else {
               out.devices = cal.dev_id;
+              out.sample_rate = cal.sampling_rate;
               cal.snd_dev_id = platform_get_output_snd_device(platform, &out);
           }
         }
@@ -3409,6 +3430,7 @@
         cal.snd_dev_id = platform_get_input_snd_device(platform, cal.dev_id);
     } else if(cal.dev_id) {
         out.devices = cal.dev_id;
+        out.sample_rate = cal.sampling_rate;
         cal.snd_dev_id = platform_get_output_snd_device(platform, &out);
     }
     cal.acdb_dev_id =  platform_get_snd_device_acdb_id(cal.snd_dev_id);