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;