am 81b9b396: am b1995069: qcom/audio/hal: Fix ringtone playback issue on Speaker

* commit '81b9b39666eaa27cc10ed3cd6d075691fde7289b':
  qcom/audio/hal: Fix ringtone playback issue on Speaker
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 15b1be0..3782c32 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -308,7 +308,7 @@
             acdb_dev_type = ACDB_DEV_TYPE_IN;
         adev->acdb_send_audio_cal(acdb_dev_id, acdb_dev_type);
     } else {
-        ALOGW("%s: Could find the symbol acdb_send_audio_cal from %s",
+        ALOGW("%s: Could not find the symbol acdb_send_audio_cal from %s",
               __func__, LIB_ACDB_LOADER);
     }
 
@@ -448,10 +448,10 @@
 }
 
 /* must be called with hw device mutex locked */
-static void read_hdmi_channel_masks(struct stream_out *out)
+static int read_hdmi_channel_masks(struct stream_out *out)
 {
+    int ret = 0;
     int channels = edid_get_max_channels();
-    ALOGV("%s: enter", __func__);
 
     switch (channels) {
         /*
@@ -468,11 +468,11 @@
         out->supported_channel_masks[1] = AUDIO_CHANNEL_OUT_7POINT1;
         break;
     default:
-        ALOGE("Unsupported number of channels (%d)", channels);
+        ALOGE("HDMI does not support multi channel playback");
+        ret = -ENOSYS;
         break;
     }
-
-    ALOGV("%s: exit", __func__);
+    return ret;
 }
 
 static snd_device_t get_output_snd_device(struct audio_device *adev,
@@ -1410,6 +1410,8 @@
     pthread_mutex_unlock(&out->lock);
 
     if (ret != 0) {
+        if (out->pcm)
+            ALOGE("%s: error %d - %s", __func__, ret, pcm_get_error(out->pcm));
         out_standby(&out->stream.common);
         usleep(bytes * 1000000 / audio_stream_frame_size(&out->stream.common) /
                out_get_sample_rate(&out->stream.common));
@@ -1640,16 +1642,24 @@
     /* Init use case and pcm_config */
     if (out->flags & AUDIO_OUTPUT_FLAG_DIRECT &&
         out->devices & AUDIO_DEVICE_OUT_AUX_DIGITAL) {
+        pthread_mutex_lock(&adev->lock);
+        ret = read_hdmi_channel_masks(out);
+        pthread_mutex_unlock(&adev->lock);
+        if (ret != 0) {
+            /* If HDMI does not support multi channel playback, set the default */
+            out->config.channels = popcount(out->channel_mask);
+            set_hdmi_channels(adev->mixer, out->config.channels);
+            goto error_open;
+        }
+
+        if (config->sample_rate == 0)
+            config->sample_rate = DEFAULT_OUTPUT_SAMPLING_RATE;
+        if (config->channel_mask == 0)
+            config->channel_mask = AUDIO_CHANNEL_OUT_5POINT1;
+
+        out->channel_mask = config->channel_mask;
         out->usecase = USECASE_AUDIO_PLAYBACK_MULTI_CH;
         out->config = pcm_config_hdmi_multi;
-
-        pthread_mutex_lock(&adev->lock);
-        read_hdmi_channel_masks(out);
-        pthread_mutex_unlock(&adev->lock);
-
-        if (config->sample_rate == 0) config->sample_rate = DEFAULT_OUTPUT_SAMPLING_RATE;
-        if (config->channel_mask == 0) config->channel_mask = AUDIO_CHANNEL_OUT_5POINT1;
-        out->channel_mask = config->channel_mask;
         out->config.rate = config->sample_rate;
         out->config.channels = popcount(out->channel_mask);
         out->config.period_size = HDMI_MULTI_PERIOD_BYTES / (out->config.channels * 2);
@@ -1667,7 +1677,8 @@
             adev->primary_output = out;
         else {
             ALOGE("%s: Primary output is already opened", __func__);
-            return -EEXIST;
+            ret = -EEXIST;
+            goto error_open;
         }
     }
 
@@ -1675,10 +1686,9 @@
     pthread_mutex_lock(&adev->lock);
     if (get_usecase_from_list(adev, out->usecase) != NULL) {
         ALOGE("%s: Usecase (%d) is already present", __func__, out->usecase);
-        free(out);
-        *stream_out = NULL;
         pthread_mutex_unlock(&adev->lock);
-        return -EEXIST;
+        ret = -EEXIST;
+        goto error_open;
     }
     pthread_mutex_unlock(&adev->lock);
 
@@ -1710,6 +1720,12 @@
     *stream_out = &out->stream;
     ALOGD("%s: exit", __func__);
     return 0;
+
+error_open:
+    free(out);
+    *stream_out = NULL;
+    ALOGD("%s: exit: ret %d", __func__, ret);
+    return ret;
 }
 
 static void adev_close_output_stream(struct audio_hw_device *dev,
diff --git a/hal/audio_hw.h b/hal/audio_hw.h
index 0432106..abe56dd 100644
--- a/hal/audio_hw.h
+++ b/hal/audio_hw.h
@@ -270,6 +270,7 @@
     .period_count = DEEP_BUFFER_OUTPUT_PERIOD_COUNT,
     .format = PCM_FORMAT_S16_LE,
     .start_threshold = DEEP_BUFFER_OUTPUT_PERIOD_SIZE / 4,
+    .stop_threshold = INT_MAX,
     .avail_min = DEEP_BUFFER_OUTPUT_PERIOD_SIZE / 4,
 };
 
@@ -280,6 +281,7 @@
     .period_count = LOW_LATENCY_OUTPUT_PERIOD_COUNT,
     .format = PCM_FORMAT_S16_LE,
     .start_threshold = LOW_LATENCY_OUTPUT_PERIOD_SIZE / 4,
+    .stop_threshold = INT_MAX,
     .avail_min = LOW_LATENCY_OUTPUT_PERIOD_SIZE / 4,
 };
 
@@ -290,6 +292,7 @@
     .period_count = HDMI_MULTI_PERIOD_COUNT,
     .format = PCM_FORMAT_S16_LE,
     .start_threshold = 0,
+    .stop_threshold = INT_MAX,
     .avail_min = 0,
 };