hal: Add a2dp state check for device routing

- During a2dp to sco transition multiple session
  open failures are seen due to a2dp start failure

- Check a2dp streaming state with BT lib before
  routing audio on a2dp device.
  If a2dp is not ready for streaming, force drop
  audio packets for a2dp path similar to BT HAL

Change-Id: If9fdd2184943c2e25a091067477cf0bcc5dce278
diff --git a/hal/audio_extn/a2dp.c b/hal/audio_extn/a2dp.c
index 3dc00fb..40632bc 100644
--- a/hal/audio_extn/a2dp.c
+++ b/hal/audio_extn/a2dp.c
@@ -79,6 +79,7 @@
 typedef void (*clear_a2dpsuspend_flag_t)(void);
 typedef void * (*audio_get_codec_config_t)(uint8_t *multicast_status,uint8_t *num_dev,
                                audio_format_t *codec_type);
+typedef int (*audio_check_a2dp_ready_t)(void);
 
 enum A2DP_STATE {
     A2DP_STATE_CONNECTED,
@@ -102,6 +103,7 @@
     audio_handoff_triggered_t audio_handoff_triggered;
     clear_a2dpsuspend_flag_t clear_a2dpsuspend_flag;
     audio_get_codec_config_t audio_get_codec_config;
+    audio_check_a2dp_ready_t audio_check_a2dp_ready;
     enum A2DP_STATE bt_state;
     audio_format_t bt_encoder_format;
     uint32_t enc_sampling_rate;
@@ -244,6 +246,8 @@
                           dlsym(a2dp.bt_lib_handle, "audio_stop_stream");
             a2dp.audio_stream_close = (audio_stream_close_t)
                           dlsym(a2dp.bt_lib_handle, "audio_stream_close");
+            a2dp.audio_check_a2dp_ready = (audio_check_a2dp_ready_t)
+                        dlsym(a2dp.bt_lib_handle,"audio_check_a2dp_ready");
         }
     }
 
@@ -279,27 +283,17 @@
         ALOGE("a2dp handle is not identified, Ignoring close request");
         return -ENOSYS;
     }
-    if ((a2dp.bt_state == A2DP_STATE_CONNECTED) &&
-        (a2dp.bt_state == A2DP_STATE_STARTED) &&
-        (a2dp.bt_state == A2DP_STATE_STOPPED)) {
+    if (a2dp.bt_state != A2DP_STATE_DISCONNECTED) {
         ALOGD("calling BT stream close");
         if(a2dp.audio_stream_close() == false)
             ALOGE("failed close a2dp control path from BT library");
-        a2dp.a2dp_started = false;
-        a2dp.a2dp_total_active_session_request = 0;
-        a2dp.a2dp_suspended = false;
-        a2dp.bt_encoder_format = AUDIO_FORMAT_INVALID;
-        a2dp.enc_sampling_rate = 48000;
-        a2dp.bt_state = A2DP_STATE_DISCONNECTED;
-    } else {
-        ALOGD("close a2dp called in improper state");
-        a2dp.a2dp_started = false;
-        a2dp.a2dp_total_active_session_request = 0;
-        a2dp.a2dp_suspended = false;
-        a2dp.bt_encoder_format = AUDIO_FORMAT_INVALID;
-        a2dp.enc_sampling_rate = 48000;
-        a2dp.bt_state = A2DP_STATE_DISCONNECTED;
     }
+    a2dp.a2dp_started = false;
+    a2dp.a2dp_total_active_session_request = 0;
+    a2dp.a2dp_suspended = false;
+    a2dp.bt_encoder_format = AUDIO_FORMAT_INVALID;
+    a2dp.enc_sampling_rate = 48000;
+    a2dp.bt_state = A2DP_STATE_DISCONNECTED;
 
     return 0;
 }
@@ -631,7 +625,6 @@
         if (ret != 0 ) {
            ALOGE("BT controller start failed");
            a2dp.a2dp_started = false;
-           ret = -ETIMEDOUT;
         } else {
            if(configure_a2dp_encoder_format() == true) {
                 a2dp.a2dp_started = true;
@@ -692,7 +685,7 @@
         return -ENOSYS;
     }
 
-    if (a2dp.a2dp_started && (a2dp.a2dp_total_active_session_request > 0))
+    if (a2dp.a2dp_total_active_session_request > 0)
         a2dp.a2dp_total_active_session_request--;
 
     if ( a2dp.a2dp_started && !a2dp.a2dp_total_active_session_request) {
@@ -810,6 +803,17 @@
         *bit_width = 16;
     *sample_rate = a2dp.enc_sampling_rate;
 }
+
+bool audio_extn_a2dp_is_ready()
+{
+    bool ret = false;
+
+    if ((a2dp.is_a2dp_offload_supported) &&
+        (a2dp.audio_check_a2dp_ready))
+           ret = a2dp.audio_check_a2dp_ready();
+    return ret;
+}
+
 void audio_extn_a2dp_init (void *adev)
 {
   a2dp.adev = (struct audio_device*)adev;