hal: update error handling for pcm_prepare failures

Return any errors from pcm_prepare in start input
or output streams and ensure the pcm device is closed.

Change-Id: I7d8d5ab967e514fc9df6dc8d7ae3374ad963f3df
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index d44eeb4..e63d039 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -837,8 +837,14 @@
         break;
     }
 
-    ALOGV("%s: pcm_prepare start", __func__);
-    pcm_prepare(in->pcm);
+    ALOGV("%s: pcm_prepare", __func__);
+    ret = pcm_prepare(in->pcm);
+    if (ret < 0) {
+        ALOGE("%s: pcm_prepare returned %d", __func__, ret);
+        pcm_close(in->pcm);
+        in->pcm = NULL;
+        goto error_open;
+    }
 
     audio_extn_perf_lock_release();
 
@@ -1196,10 +1202,16 @@
             }
             break;
         }
-        ALOGV("%s: pcm_prepare start", __func__);
-        if (pcm_is_ready(out->pcm))
-            pcm_prepare(out->pcm);
-
+        ALOGV("%s: pcm_prepare", __func__);
+        if (pcm_is_ready(out->pcm)) {
+            ret = pcm_prepare(out->pcm);
+            if (ret < 0) {
+                ALOGE("%s: pcm_prepare returned %d", __func__, ret);
+                pcm_close(out->pcm);
+                out->pcm = NULL;
+                goto error_open;
+            }
+        }
     } else {
         out->pcm = NULL;
         out->compr = compress_open(adev->snd_card, out->pcm_device_id,