From 497eb0e7a3293722b049c36e42272a8a428a6a15 Mon Sep 17 00:00:00 2001 From: Hansong Zhang Date: Thu, 21 Mar 2019 11:21:31 -0700 Subject: [PATCH] Hearing aid: use new common/Timer Previously osi/alarm cannot be cancelled or freed while in a callback. Replace it with common/Timer. It's safe to be cancelled in a callback and well tested. Bug: 119533256 Test: manual Change-Id: I73c7c98d683c85ec8f0f4256c3e4bccf3e11b56a --- bta/hearing_aid/hearing_aid_audio_source.cc | 36 ++++++++++++++++------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/bta/hearing_aid/hearing_aid_audio_source.cc b/bta/hearing_aid/hearing_aid_audio_source.cc index fe44e4c14..e966d0182 100644 --- a/bta/hearing_aid/hearing_aid_audio_source.cc +++ b/bta/hearing_aid/hearing_aid_audio_source.cc @@ -20,12 +20,13 @@ #include "audio_hearing_aid_hw/include/audio_hearing_aid_hw.h" #include "bta_hearing_aid_api.h" #include "btu.h" -#include "osi/include/alarm.h" +#include "osi/include/wakelock.h" #include "uipc.h" #include #include +#include "common/repeating_timer.h" #include "common/time_util.h" using base::FilePath; @@ -36,7 +37,7 @@ int bit_rate = -1; int sample_rate = -1; int data_interval_ms = -1; int num_channels = 2; -alarm_t* audio_timer = nullptr; +bluetooth::common::RepeatingTimer audio_timer; HearingAidAudioReceiver* localAudioReceiver; std::unique_ptr uipc_hearing_aid; @@ -59,7 +60,7 @@ AudioHalStats stats; bool hearing_aid_on_resume_req(bool start_media_task); bool hearing_aid_on_suspend_req(); -void send_audio_data(void*) { +void send_audio_data() { uint32_t bytes_per_tick = (num_channels * sample_rate * data_interval_ms * (bit_rate / 8)) / 1000; @@ -93,6 +94,17 @@ void hearing_aid_send_ack(tHEARING_AID_CTRL_ACK status) { UIPC_Send(*uipc_hearing_aid, UIPC_CH_ID_AV_CTRL, 0, &ack, sizeof(ack)); } +void start_audio_ticks() { + wakelock_acquire(); + audio_timer.SchedulePeriodic(get_main_thread()->GetWeakPtr(), FROM_HERE, base::Bind(&send_audio_data), + base::TimeDelta::FromMilliseconds(data_interval_ms)); +} + +void stop_audio_ticks() { + audio_timer.CancelAndWait(); + wakelock_release(); +} + void hearing_aid_data_cb(tUIPC_CH_ID, tUIPC_EVENT event) { DVLOG(2) << "Hearing Aid audio data event: " << event; switch (event) { @@ -112,16 +124,12 @@ void hearing_aid_data_cb(tUIPC_CH_ID, tUIPC_EVENT event) { LOG(FATAL) << " Unsupported data interval: " << data_interval_ms; } - audio_timer = alarm_new_periodic("hearing_aid_data_timer"); - alarm_set_on_mloop(audio_timer, data_interval_ms, send_audio_data, - nullptr); + start_audio_ticks(); break; case UIPC_CLOSE_EVT: LOG(INFO) << __func__ << ": UIPC_CLOSE_EVT"; hearing_aid_send_ack(HEARING_AID_CTRL_ACK_SUCCESS); - if (audio_timer) { - alarm_cancel(audio_timer); - } + stop_audio_ticks(); break; default: LOG(ERROR) << "Hearing Aid audio data event not recognized:" << event; @@ -326,16 +334,14 @@ bool hearing_aid_on_resume_req(bool start_media_task) { LOG(FATAL) << " Unsupported data interval: " << data_interval_ms; data_interval_ms = HA_INTERVAL_10_MS; } - if (audio_timer == nullptr) - audio_timer = alarm_new_periodic("hearing_aid_data_timer"); - alarm_set_on_mloop(audio_timer, data_interval_ms, send_audio_data, nullptr); + start_audio_ticks(); } return true; } bool hearing_aid_on_suspend_req() { // hearing_aid_recv_ctrl_data(HEARING_AID_CTRL_CMD_SUSPEND): stop_media_task - if (audio_timer) alarm_cancel(audio_timer); + stop_audio_ticks(); if (localAudioReceiver) { // Call OnAudioSuspend and block till it returns. std::promise do_suspend_promise; @@ -381,9 +387,7 @@ void HearingAidAudioSource::Stop() { bluetooth::audio::hearing_aid::end_session(); } - if (audio_timer) { - alarm_cancel(audio_timer); - } + stop_audio_ticks(); } void HearingAidAudioSource::Initialize() { -- 2.11.0