policy_hal: adjust bitrate restriction for wma

Adjust bitrate restriction for wma std.

Change-Id: Ia6ede71a8702fd04f06d701602473bc0146843f3
CRs-Fixed: 2044358
diff --git a/policy_hal/AudioPolicyManager.cpp b/policy_hal/AudioPolicyManager.cpp
index c258a39..fb14616 100644
--- a/policy_hal/AudioPolicyManager.cpp
+++ b/policy_hal/AudioPolicyManager.cpp
@@ -571,11 +571,35 @@
         return false;
     }
 
-    if ((((offloadInfo.format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_WMA) && (offloadInfo.bit_rate > MAX_BITRATE_WMA)) ||
-        (((offloadInfo.format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_WMA_PRO) && (offloadInfo.bit_rate > MAX_BITRATE_WMA_PRO)) ||
-        (((offloadInfo.format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_WMA_PRO) && (offloadInfo.bit_rate > MAX_BITRATE_WMA_LOSSLESS))){
-        //Safely choose the min bitrate as threshold and leave the restriction to NT decoder as we can't distinguish wma pro and wma lossless here.
-        ALOGD("offload disabled for WMA/WMA_PRO/WMA_LOSSLESS clips with bit rate over maximum supported value");
+    // check against wma std bit rate restriction
+    if ((offloadInfo.format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_WMA) {
+        int32_t sr_id = -1;
+        uint32_t min_bitrate, max_bitrate;
+        for (int i = 0; i < WMA_STD_NUM_FREQ; i++) {
+            if (offloadInfo.sample_rate == wmaStdSampleRateTbl[i]) {
+                sr_id = i;
+                break;
+            }
+        }
+        if ((sr_id < 0) || (popcount(offloadInfo.channel_mask) > 2)
+                || (popcount(offloadInfo.channel_mask) <= 0)) {
+            ALOGE("invalid sample rate or channel count");
+            return false;
+        }
+
+        min_bitrate = wmaStdMinAvgByteRateTbl[sr_id][popcount(offloadInfo.channel_mask) - 1];
+        max_bitrate = wmaStdMaxAvgByteRateTbl[sr_id][popcount(offloadInfo.channel_mask) - 1];
+        if ((offloadInfo.bit_rate > max_bitrate) || (offloadInfo.bit_rate < min_bitrate)) {
+            ALOGD("offload disabled for WMA clips with unsupported bit rate");
+            ALOGD("bit_rate %d, max_bitrate %d, min_bitrate %d", offloadInfo.bit_rate, max_bitrate, min_bitrate);
+            return false;
+        }
+    }
+
+    // Safely choose the min bitrate as threshold and leave the restriction to NT decoder as we can't distinguish wma pro and wma lossless here.
+    if ((((offloadInfo.format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_WMA_PRO) && (offloadInfo.bit_rate > MAX_BITRATE_WMA_PRO)) ||
+        (((offloadInfo.format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_WMA_PRO) && (offloadInfo.bit_rate > MAX_BITRATE_WMA_LOSSLESS))) {
+        ALOGD("offload disabled for WMA_PRO/WMA_LOSSLESS clips with bit rate over maximum supported value");
         return false;
     }
 #endif
diff --git a/policy_hal/AudioPolicyManager.h b/policy_hal/AudioPolicyManager.h
index 3c01172..45e090e 100644
--- a/policy_hal/AudioPolicyManager.h
+++ b/policy_hal/AudioPolicyManager.h
@@ -32,6 +32,38 @@
 #define AUDIO_FORMAT_APE 0x1D000000UL
 #endif
 
+#define WMA_STD_NUM_FREQ     7
+#define WMA_STD_NUM_CHANNELS 2
+static uint32_t wmaStdSampleRateTbl[WMA_STD_NUM_FREQ] =
+{
+    8000, 11025, 16000, 22050, 32000, 44100, 48000
+};
+
+static uint32_t wmaStdMinAvgByteRateTbl[WMA_STD_NUM_FREQ][WMA_STD_NUM_CHANNELS] =
+{
+    {128, 12000},
+    {8016, 8016},
+    {10000, 16000},
+    {16016, 20008},
+    {20000, 24000},
+    {20008, 31960},
+    {63000, 63000}
+};
+
+static uint32_t wmaStdMaxAvgByteRateTbl[WMA_STD_NUM_FREQ][WMA_STD_NUM_CHANNELS] =
+{
+    {8000, 12000},
+    {10168, 10168},
+    {16000, 20000},
+    {20008, 32048},
+    {20000, 48000},
+    {48024, 320032},
+    {256008, 256008}
+};
+
+#define MAX_BITRATE_WMA_PRO      1536000
+#define MAX_BITRATE_WMA_LOSSLESS 1152000
+
 #ifndef AAC_ADTS_OFFLOAD_ENABLED
 #define AUDIO_FORMAT_AAC_ADTS 0x1E000000UL
 #endif
@@ -40,9 +72,6 @@
 #define AUDIO_DEVICE_OUT_PROXY 0x1000000
 #endif
 
-#define MAX_BITRATE_WMA          384000
-#define MAX_BITRATE_WMA_PRO      1536000
-#define MAX_BITRATE_WMA_LOSSLESS 1152000
 // ----------------------------------------------------------------------------
 
 class AudioPolicyManagerCustom: public AudioPolicyManager