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.
CRs-Fixed: 914347
Change-Id: I168cad151ed3fa0d0d3281ec7aceb99ef58bc753
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index f969de2..c55cd13 100755
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -429,7 +429,7 @@
audio_extn_utils_send_audio_calibration(adev, usecase);
strlcpy(mixer_path, use_case_table[usecase->id], MIXER_PATH_MAX_LENGTH);
platform_add_backend_name(mixer_path, snd_device, usecase);
- ALOGV("%s: apply mixer and update path: %s", __func__, mixer_path);
+ ALOGD("%s: apply mixer and update path: %s", __func__, mixer_path);
audio_route_apply_and_update_path(adev->audio_route, mixer_path);
ALOGV("%s: exit", __func__);
return 0;
@@ -451,7 +451,7 @@
snd_device = usecase->out_snd_device;
strlcpy(mixer_path, use_case_table[usecase->id], MIXER_PATH_MAX_LENGTH);
platform_add_backend_name(mixer_path, snd_device, usecase);
- ALOGV("%s: reset and update mixer path: %s", __func__, mixer_path);
+ ALOGD("%s: reset and update mixer path: %s", __func__, mixer_path);
audio_route_reset_and_update_path(adev->audio_route, mixer_path);
audio_extn_sound_trigger_update_stream_status(usecase, ST_EVENT_STREAM_FREE);
audio_extn_listen_update_stream_status(usecase, LISTEN_EVENT_STREAM_FREE);
@@ -508,8 +508,7 @@
return -EINVAL;
}
} else {
- ALOGV("%s: snd_device(%d: %s)", __func__,
- snd_device, device_name);
+ ALOGD("%s: snd_device(%d: %s)", __func__, snd_device, device_name);
/* due to the possibility of calibration overwrite between listen
and audio, notify listen hal before audio calibration is sent */
audio_extn_sound_trigger_update_device_status(snd_device,
@@ -553,8 +552,7 @@
}
if (adev->snd_dev_ref_cnt[snd_device] == 0) {
- ALOGV("%s: snd_device(%d: %s)", __func__,
- snd_device, device_name);
+ ALOGD("%s: snd_device(%d: %s)", __func__, snd_device, device_name);
/* exit usb play back thread */
if(SND_DEVICE_OUT_USB_HEADSET == snd_device ||
SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET == snd_device)
@@ -1138,11 +1136,19 @@
}
break;
}
+
+ 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();
- ALOGV("%s: pcm_prepare start", __func__);
- pcm_prepare(in->pcm);
- ALOGV("%s: exit", __func__);
+ ALOGD("%s: exit", __func__);
return ret;
@@ -1638,10 +1644,16 @@
platform_set_stream_channel_map(adev->platform, out->channel_mask,
out->pcm_device_id);
- 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 {
platform_set_stream_channel_map(adev->platform, out->channel_mask,
out->pcm_device_id);
@@ -1688,7 +1700,7 @@
}
}
- ALOGV("%s: exit", __func__);
+ ALOGD("%s: exit", __func__);
return 0;
error_open: