From 753c1d1ef27a7f0519c954ffa462fae0cfb18976 Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Tue, 25 Jul 2017 14:55:49 -0700 Subject: Implement closing default radio implementation by invalidating all future calls. Also, use the new hidl_vec range constructor. Bug: b/36864090 Test: VTS Change-Id: I92a22ab7f263edd39e42abb65bc25b3d3dc33a1e --- broadcastradio/1.1/default/Tuner.cpp | 61 ++++++++++++++++++++------- broadcastradio/1.1/default/Tuner.h | 2 +- broadcastradio/1.1/default/VirtualProgram.cpp | 2 +- broadcastradio/1.1/utils/Utils.cpp | 4 +- 4 files changed, 50 insertions(+), 19 deletions(-) (limited to 'broadcastradio') diff --git a/broadcastradio/1.1/default/Tuner.cpp b/broadcastradio/1.1/default/Tuner.cpp index 2985d4237..0723cf776 100644 --- a/broadcastradio/1.1/default/Tuner.cpp +++ b/broadcastradio/1.1/default/Tuner.cpp @@ -66,6 +66,8 @@ void Tuner::forceClose() { Return Tuner::setConfiguration(const BandConfig& config) { ALOGV("%s", __func__); + lock_guard lk(mMut); + if (mIsClosed) return Result::NOT_INITIALIZED; if (config.lowerLimit >= config.upperLimit) return Result::INVALID_ARGUMENTS; @@ -87,14 +89,14 @@ Return Tuner::setConfiguration(const BandConfig& config) { Return Tuner::getConfiguration(getConfiguration_cb _hidl_cb) { ALOGV("%s", __func__); - lock_guard lk(mMut); - if (mIsAmfmConfigSet) { + + if (!mIsClosed && mIsAmfmConfigSet) { _hidl_cb(Result::OK, mAmfmConfig); } else { _hidl_cb(Result::NOT_INITIALIZED, {}); } - return Void(); + return {}; } // makes ProgramInfo that points to no program @@ -140,6 +142,8 @@ void Tuner::tuneInternalLocked(const ProgramSelector& sel) { Return Tuner::scan(Direction direction, bool skipSubChannel __unused) { ALOGV("%s", __func__); lock_guard lk(mMut); + if (mIsClosed) return Result::NOT_INITIALIZED; + vector list; if (isFmLocked()) { @@ -196,9 +200,10 @@ Return Tuner::scan(Direction direction, bool skipSubChannel __unused) { Return Tuner::step(Direction direction, bool skipSubChannel) { ALOGV("%s", __func__); - ALOGW_IF(!skipSubChannel, "can't step to next frequency without ignoring subChannel"); - lock_guard lk(mMut); + if (mIsClosed) return Result::NOT_INITIALIZED; + + ALOGW_IF(!skipSubChannel, "can't step to next frequency without ignoring subChannel"); if (!utils::isAmFm(utils::getType(mCurrentProgram))) { ALOGE("Can't step in anything else than AM/FM"); @@ -244,8 +249,8 @@ Return Tuner::tune(uint32_t channel, uint32_t subChannel) { Return Tuner::tune_1_1(const ProgramSelector& sel) { ALOGV("%s(%s)", __func__, toString(sel).c_str()); - lock_guard lk(mMut); + if (mIsClosed) return Result::NOT_INITIALIZED; if (utils::isAmFm(utils::getType(mCurrentProgram))) { ALOGW_IF(!mIsAmfmConfigSet, "AM/FM config not set"); @@ -269,12 +274,18 @@ Return Tuner::tune_1_1(const ProgramSelector& sel) { Return Tuner::cancel() { ALOGV("%s", __func__); + lock_guard lk(mMut); + if (mIsClosed) return Result::NOT_INITIALIZED; + mThread.cancelAll(); return Result::OK; } Return Tuner::cancelAnnouncement() { ALOGV("%s", __func__); + lock_guard lk(mMut); + if (mIsClosed) return Result::NOT_INITIALIZED; + return Result::OK; } @@ -287,46 +298,64 @@ Return Tuner::getProgramInformation(getProgramInformation_cb _hidl_cb) { Return Tuner::getProgramInformation_1_1(getProgramInformation_1_1_cb _hidl_cb) { ALOGV("%s", __func__); - lock_guard lk(mMut); - if (mIsTuneCompleted) { + + if (mIsClosed) { + _hidl_cb(Result::NOT_INITIALIZED, {}); + } else if (mIsTuneCompleted) { _hidl_cb(Result::OK, mCurrentProgramInfo); } else { _hidl_cb(Result::NOT_INITIALIZED, makeDummyProgramInfo(mCurrentProgram)); } - return Void(); + return {}; } Return Tuner::startBackgroundScan() { ALOGV("%s", __func__); + lock_guard lk(mMut); + if (mIsClosed) return ProgramListResult::NOT_INITIALIZED; + return ProgramListResult::UNAVAILABLE; } -Return Tuner::getProgramList(const hidl_string& filter __unused, getProgramList_cb _hidl_cb) { - ALOGV("%s", __func__); +Return Tuner::getProgramList(const hidl_string& filter, getProgramList_cb _hidl_cb) { + ALOGV("%s(%s)", __func__, filter.c_str()); lock_guard lk(mMut); + if (mIsClosed) { + _hidl_cb(ProgramListResult::NOT_INITIALIZED, {}); + return {}; + } auto& virtualRadio = mVirtualFm; if (!isFmLocked()) { ALOGI("bands other than FM are not supported yet"); _hidl_cb(ProgramListResult::OK, {}); - return Void(); + return {}; } auto list = virtualRadio.getProgramList(); ALOGD("returning a list of %zu programs", list.size()); - _hidl_cb(ProgramListResult::OK, vector(list.begin(), list.end())); - return Void(); + _hidl_cb(ProgramListResult::OK, hidl_vec(list.begin(), list.end())); + return {}; } Return Tuner::isAnalogForced(isAnalogForced_cb _hidl_cb) { ALOGV("%s", __func__); - _hidl_cb(Result::OK, mIsAnalogForced); - return Void(); + lock_guard lk(mMut); + + if (mIsClosed) { + _hidl_cb(Result::NOT_INITIALIZED, false); + } else { + _hidl_cb(Result::OK, mIsAnalogForced); + } + return {}; } Return Tuner::setAnalogForced(bool isForced) { ALOGV("%s", __func__); + lock_guard lk(mMut); + if (mIsClosed) return Result::NOT_INITIALIZED; + mIsAnalogForced = isForced; return Result::OK; } diff --git a/broadcastradio/1.1/default/Tuner.h b/broadcastradio/1.1/default/Tuner.h index 3efbd09eb..c785586ec 100644 --- a/broadcastradio/1.1/default/Tuner.h +++ b/broadcastradio/1.1/default/Tuner.h @@ -53,7 +53,7 @@ struct Tuner : public ITuner { private: std::mutex mMut; WorkerThread mThread; - bool mIsClosed = false; // TODO(b/36864090): use it + bool mIsClosed = false; const sp mCallback; const sp mCallback1_1; diff --git a/broadcastradio/1.1/default/VirtualProgram.cpp b/broadcastradio/1.1/default/VirtualProgram.cpp index 4c6b3b1b5..ef0e124a5 100644 --- a/broadcastradio/1.1/default/VirtualProgram.cpp +++ b/broadcastradio/1.1/default/VirtualProgram.cpp @@ -41,7 +41,7 @@ static MetaData createDemoBitmap(MetadataKey key) { if (gHalVersion < 2) { bmp.type = MetadataType::RAW; bmp.intValue = 0; - bmp.rawValue = std::vector(resources::demoPng, std::end(resources::demoPng)); + bmp.rawValue = hidl_vec(resources::demoPng, std::end(resources::demoPng)); } return bmp; } diff --git a/broadcastradio/1.1/utils/Utils.cpp b/broadcastradio/1.1/utils/Utils.cpp index 8bb769179..50a407c7b 100644 --- a/broadcastradio/1.1/utils/Utils.cpp +++ b/broadcastradio/1.1/utils/Utils.cpp @@ -53,7 +53,9 @@ static bool anyHaveId(const ProgramSelector& a, const ProgramSelector& b, static bool haveEqualIds(const ProgramSelector& a, const ProgramSelector& b, const IdentifierType type) { if (!bothHaveId(a, b, type)) return false; - // TODO(b/36864090): we should check all Ids of a given type (ie. other AF), not just one + /* We should check all Ids of a given type (ie. other AF), + * but it doesn't matter for default implementation. + */ auto aId = getId(a, type); auto bId = getId(b, type); return aId == bId; -- cgit v1.2.3