Wait for all the thread loop to exit to finish the filter/dvr/frontend
close/stop API Call
Test: atest android.media.tv.tuner.cts
Bug: 180641600
Change-Id: I0925e8ffe5604d2c6a48871897871f5ac51c572e
diff --git a/tv/tuner/1.1/default/Dvr.cpp b/tv/tuner/1.1/default/Dvr.cpp
index 3a4ef1b..93bb6a8 100644
--- a/tv/tuner/1.1/default/Dvr.cpp
+++ b/tv/tuner/1.1/default/Dvr.cpp
@@ -37,7 +37,10 @@
mDemux = demux;
}
-Dvr::~Dvr() {}
+Dvr::~Dvr() {
+ mDvrThreadRunning = false;
+ lock_guard<mutex> lock(mDvrThreadLock);
+}
Return<void> Dvr::getQueueDesc(getQueueDesc_cb _hidl_cb) {
ALOGV("%s", __FUNCTION__);
@@ -118,6 +121,9 @@
Return<Result> Dvr::start() {
ALOGV("%s", __FUNCTION__);
+ if (mDvrThreadRunning) {
+ return Result::SUCCESS;
+ }
if (!mCallback) {
return Result::NOT_INITIALIZED;
@@ -128,6 +134,7 @@
}
if (mType == DvrType::PLAYBACK) {
+ mDvrThreadRunning = true;
pthread_create(&mDvrThread, NULL, __threadLoopPlayback, this);
pthread_setname_np(mDvrThread, "playback_waiting_loop");
} else if (mType == DvrType::RECORD) {
@@ -144,7 +151,6 @@
ALOGV("%s", __FUNCTION__);
mDvrThreadRunning = false;
-
lock_guard<mutex> lock(mDvrThreadLock);
mIsRecordStarted = false;
@@ -164,6 +170,8 @@
Return<Result> Dvr::close() {
ALOGV("%s", __FUNCTION__);
+ mDvrThreadRunning = false;
+ lock_guard<mutex> lock(mDvrThreadLock);
return Result::SUCCESS;
}
@@ -199,7 +207,6 @@
void Dvr::playbackThreadLoop() {
ALOGD("[Dvr] playback threadLoop start.");
lock_guard<mutex> lock(mDvrThreadLock);
- mDvrThreadRunning = true;
while (mDvrThreadRunning) {
uint32_t efState = 0;