Merge "hal: deadlock with pause and SSR for compressed offload"
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 94241ac..ebfcd52 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -3419,10 +3419,12 @@
return 0;
}
-/* must be called with out->lock and latch lock */
+/* must be called with out->lock */
static void stop_compressed_output_l(struct stream_out *out)
{
+ pthread_mutex_lock(&out->latch_lock);
out->offload_state = OFFLOAD_STATE_IDLE;
+ pthread_mutex_unlock(&out->latch_lock);
out->playback_started = 0;
out->send_new_metadata = 1;
if (out->compr != NULL) {
@@ -3680,11 +3682,9 @@
static int destroy_offload_callback_thread(struct stream_out *out)
{
lock_output_stream(out);
- pthread_mutex_lock(&out->latch_lock);
stop_compressed_output_l(out);
send_offload_cmd_l(out, OFFLOAD_CMD_EXIT);
- pthread_mutex_unlock(&out->latch_lock);
pthread_mutex_unlock(&out->lock);
pthread_join(out->offload_thread, (void **) NULL);
pthread_cond_destroy(&out->offload_cond);
@@ -4582,9 +4582,7 @@
adev->adm_deregister_stream(adev->adm_data, out->handle);
if (is_offload_usecase(out->usecase)) {
- pthread_mutex_lock(&out->latch_lock);
stop_compressed_output_l(out);
- pthread_mutex_unlock(&out->latch_lock);
}
pthread_mutex_lock(&adev->lock);
@@ -4659,9 +4657,7 @@
// is needed e.g. when SSR happens within compress_open
// since the stream is active, offload_callback_thread is also active.
if (out->flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) {
- pthread_mutex_lock(&out->latch_lock);
stop_compressed_output_l(out);
- pthread_mutex_unlock(&out->latch_lock);
}
pthread_mutex_unlock(&out->lock);
@@ -4700,9 +4696,7 @@
adev->adm_deregister_stream(adev->adm_data, out->handle);
if (is_offload_usecase(out->usecase)) {
- pthread_mutex_lock(&out->latch_lock);
stop_compressed_output_l(out);
- pthread_mutex_unlock(&out->latch_lock);
}
out->standby = true;
@@ -6546,12 +6540,13 @@
lock_output_stream(out);
pthread_mutex_lock(&out->latch_lock);
if (out->offload_state == OFFLOAD_STATE_PAUSED) {
+ pthread_mutex_unlock(&out->latch_lock);
stop_compressed_output_l(out);
} else {
ALOGW("%s called in invalid state %d", __func__, out->offload_state);
+ pthread_mutex_unlock(&out->latch_lock);
}
out->written = 0;
- pthread_mutex_unlock(&out->latch_lock);
pthread_mutex_unlock(&out->lock);
ALOGD("copl(%p):out of compress flush", out);
return 0;