Refine tuner aidl hal threads.
Bug: 197763854
Test: VtsHalTvTunerTargetTest
Test: atest android.media.tv.tuner.cts
Test: sampletunertvinput
Change-Id: Id707438178ed93731919f0155cab805436147f86
diff --git a/tv/tuner/aidl/default/Demux.cpp b/tv/tuner/aidl/default/Demux.cpp
index 3937c6a..8e83d06 100644
--- a/tv/tuner/aidl/default/Demux.cpp
+++ b/tv/tuner/aidl/default/Demux.cpp
@@ -37,8 +37,7 @@
}
Demux::~Demux() {
- mFrontendInputThreadRunning = false;
- std::lock_guard<std::mutex> lock(mFrontendInputThreadLock);
+ close();
}
::ndk::ScopedAStatus Demux::setFrontendDataSource(int32_t in_frontendId) {
@@ -171,6 +170,8 @@
::ndk::ScopedAStatus Demux::close() {
ALOGV("%s", __FUNCTION__);
+ stopFrontendInput();
+
set<int64_t>::iterator it;
for (it = mPlaybackFilterIds.begin(); it != mPlaybackFilterIds.end(); it++) {
mDvrPlayback->removePlaybackFilter(*it);
@@ -180,8 +181,6 @@
mFilters.clear();
mLastUsedFilterId = -1;
mTuner->removeDemux(mDemuxId);
- mFrontendInputThreadRunning = false;
- std::lock_guard<std::mutex> lock(mFrontendInputThreadLock);
return ::ndk::ScopedAStatus::ok();
}
@@ -345,14 +344,7 @@
void Demux::startFrontendInputLoop() {
mFrontendInputThreadRunning = true;
- pthread_create(&mFrontendInputThread, NULL, __threadLoopFrontend, this);
- pthread_setname_np(mFrontendInputThread, "frontend_input_thread");
-}
-
-void* Demux::__threadLoopFrontend(void* user) {
- Demux* const self = static_cast<Demux*>(user);
- self->frontendInputThreadLoop();
- return 0;
+ mFrontendInputThread = std::thread(&Demux::frontendInputThreadLoop, this);
}
void Demux::frontendInputThreadLoop() {
@@ -360,7 +352,6 @@
return;
}
- std::lock_guard<std::mutex> lock(mFrontendInputThreadLock);
if (!mDvrPlayback) {
ALOGW("[Demux] No software Frontend input configured. Ending Frontend thread loop.");
mFrontendInputThreadRunning = false;
@@ -402,7 +393,9 @@
ALOGD("[Demux] stop frontend on demux");
mKeepFetchingDataFromFrontend = false;
mFrontendInputThreadRunning = false;
- std::lock_guard<std::mutex> lock(mFrontendInputThreadLock);
+ if (mFrontendInputThread.joinable()) {
+ mFrontendInputThread.join();
+ }
}
void Demux::setIsRecording(bool isRecording) {