diff options
-rw-r--r-- | hal/audio_hw.c | 15 |
1 files changed, 5 insertions, 10 deletions
diff --git a/hal/audio_hw.c b/hal/audio_hw.c index 5be3f4a3..7c732456 100644 --- a/hal/audio_hw.c +++ b/hal/audio_hw.c @@ -3371,10 +3371,12 @@ static int send_offload_cmd_l(struct stream_out* out, int command) 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) { @@ -3632,11 +3634,9 @@ static int create_offload_callback_thread(struct stream_out *out) 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); @@ -4531,9 +4531,7 @@ static int out_standby(struct audio_stream *stream) 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); @@ -4608,9 +4606,7 @@ static int out_on_error(struct audio_stream *stream) // 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); @@ -4649,9 +4645,7 @@ int out_standby_l(struct audio_stream *stream) 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; @@ -6494,12 +6488,13 @@ static int out_flush(struct audio_stream_out* stream) 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; |