hal: add support for external speaker driver library

Change-Id: I599c96793097ab6202412cbd55c8e9165c226eed

Bug:  17319721
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 1fee1d3..9908b81 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -1005,6 +1005,8 @@
     list_remove(&uc_info->list);
     free(uc_info);
 
+    audio_extn_extspk_update(adev->extspk);
+
     /* Must be called after removing the usecase from list */
     if (out->devices & AUDIO_DEVICE_OUT_AUX_DIGITAL)
         check_and_set_hdmi_channels(adev, DEFAULT_HDMI_OUT_CHANNELS);
@@ -1045,6 +1047,8 @@
 
     select_devices(adev, out->usecase);
 
+    audio_extn_extspk_update(adev->extspk);
+
     ALOGV("%s: Opening PCM device card_id(%d) device_id(%d) format(%#x)",
           __func__, adev->snd_card, out->pcm_device_id, out->config.format);
     if (out->usecase != USECASE_AUDIO_PLAYBACK_OFFLOAD) {
@@ -1353,6 +1357,9 @@
 
         pthread_mutex_unlock(&adev->lock);
         pthread_mutex_unlock(&out->lock);
+
+        /*handles device and call state changes*/
+        audio_extn_extspk_update(adev->extspk);
     }
 
     if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) {
@@ -2280,6 +2287,9 @@
         adev->mode = mode;
     }
     pthread_mutex_unlock(&adev->lock);
+
+    audio_extn_extspk_set_mode(adev->extspk, mode);
+
     return 0;
 }
 
@@ -2566,6 +2576,7 @@
     audio_route_free(adev->audio_route);
     free(adev->snd_dev_ref_cnt);
     platform_deinit(adev->platform);
+    audio_extn_extspk_deinit(adev->extspk);
     for (i = 0; i < ARRAY_SIZE(adev->use_case_table); ++i) {
         pcm_params_free(adev->use_case_table[i]);
     }
@@ -2649,6 +2660,8 @@
         return -EINVAL;
     }
 
+    adev->extspk = audio_extn_extspk_init(adev);
+
     if (access(VISUALIZER_LIBRARY_PATH, R_OK) == 0) {
         adev->visualizer_lib = dlopen(VISUALIZER_LIBRARY_PATH, RTLD_NOW);
         if (adev->visualizer_lib == NULL) {