Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 753c1d1e authored by Tomasz Wasilczyk's avatar Tomasz Wasilczyk
Browse files

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
parent a86912c7
Loading
Loading
Loading
Loading
+45 −16
Original line number Original line Diff line number Diff line
@@ -66,6 +66,8 @@ void Tuner::forceClose() {


Return<Result> Tuner::setConfiguration(const BandConfig& config) {
Return<Result> Tuner::setConfiguration(const BandConfig& config) {
    ALOGV("%s", __func__);
    ALOGV("%s", __func__);
    lock_guard<mutex> lk(mMut);
    if (mIsClosed) return Result::NOT_INITIALIZED;


    if (config.lowerLimit >= config.upperLimit) return Result::INVALID_ARGUMENTS;
    if (config.lowerLimit >= config.upperLimit) return Result::INVALID_ARGUMENTS;


@@ -87,14 +89,14 @@ Return<Result> Tuner::setConfiguration(const BandConfig& config) {


Return<void> Tuner::getConfiguration(getConfiguration_cb _hidl_cb) {
Return<void> Tuner::getConfiguration(getConfiguration_cb _hidl_cb) {
    ALOGV("%s", __func__);
    ALOGV("%s", __func__);

    lock_guard<mutex> lk(mMut);
    lock_guard<mutex> lk(mMut);
    if (mIsAmfmConfigSet) {

    if (!mIsClosed && mIsAmfmConfigSet) {
        _hidl_cb(Result::OK, mAmfmConfig);
        _hidl_cb(Result::OK, mAmfmConfig);
    } else {
    } else {
        _hidl_cb(Result::NOT_INITIALIZED, {});
        _hidl_cb(Result::NOT_INITIALIZED, {});
    }
    }
    return Void();
    return {};
}
}


// makes ProgramInfo that points to no program
// makes ProgramInfo that points to no program
@@ -140,6 +142,8 @@ void Tuner::tuneInternalLocked(const ProgramSelector& sel) {
Return<Result> Tuner::scan(Direction direction, bool skipSubChannel __unused) {
Return<Result> Tuner::scan(Direction direction, bool skipSubChannel __unused) {
    ALOGV("%s", __func__);
    ALOGV("%s", __func__);
    lock_guard<mutex> lk(mMut);
    lock_guard<mutex> lk(mMut);
    if (mIsClosed) return Result::NOT_INITIALIZED;

    vector<VirtualProgram> list;
    vector<VirtualProgram> list;


    if (isFmLocked()) {
    if (isFmLocked()) {
@@ -196,9 +200,10 @@ Return<Result> Tuner::scan(Direction direction, bool skipSubChannel __unused) {


Return<Result> Tuner::step(Direction direction, bool skipSubChannel) {
Return<Result> Tuner::step(Direction direction, bool skipSubChannel) {
    ALOGV("%s", __func__);
    ALOGV("%s", __func__);
    ALOGW_IF(!skipSubChannel, "can't step to next frequency without ignoring subChannel");

    lock_guard<mutex> lk(mMut);
    lock_guard<mutex> 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))) {
    if (!utils::isAmFm(utils::getType(mCurrentProgram))) {
        ALOGE("Can't step in anything else than AM/FM");
        ALOGE("Can't step in anything else than AM/FM");
@@ -244,8 +249,8 @@ Return<Result> Tuner::tune(uint32_t channel, uint32_t subChannel) {


Return<Result> Tuner::tune_1_1(const ProgramSelector& sel) {
Return<Result> Tuner::tune_1_1(const ProgramSelector& sel) {
    ALOGV("%s(%s)", __func__, toString(sel).c_str());
    ALOGV("%s(%s)", __func__, toString(sel).c_str());

    lock_guard<mutex> lk(mMut);
    lock_guard<mutex> lk(mMut);
    if (mIsClosed) return Result::NOT_INITIALIZED;


    if (utils::isAmFm(utils::getType(mCurrentProgram))) {
    if (utils::isAmFm(utils::getType(mCurrentProgram))) {
        ALOGW_IF(!mIsAmfmConfigSet, "AM/FM config not set");
        ALOGW_IF(!mIsAmfmConfigSet, "AM/FM config not set");
@@ -269,12 +274,18 @@ Return<Result> Tuner::tune_1_1(const ProgramSelector& sel) {


Return<Result> Tuner::cancel() {
Return<Result> Tuner::cancel() {
    ALOGV("%s", __func__);
    ALOGV("%s", __func__);
    lock_guard<mutex> lk(mMut);
    if (mIsClosed) return Result::NOT_INITIALIZED;

    mThread.cancelAll();
    mThread.cancelAll();
    return Result::OK;
    return Result::OK;
}
}


Return<Result> Tuner::cancelAnnouncement() {
Return<Result> Tuner::cancelAnnouncement() {
    ALOGV("%s", __func__);
    ALOGV("%s", __func__);
    lock_guard<mutex> lk(mMut);
    if (mIsClosed) return Result::NOT_INITIALIZED;

    return Result::OK;
    return Result::OK;
}
}


@@ -287,46 +298,64 @@ Return<void> Tuner::getProgramInformation(getProgramInformation_cb _hidl_cb) {


Return<void> Tuner::getProgramInformation_1_1(getProgramInformation_1_1_cb _hidl_cb) {
Return<void> Tuner::getProgramInformation_1_1(getProgramInformation_1_1_cb _hidl_cb) {
    ALOGV("%s", __func__);
    ALOGV("%s", __func__);

    lock_guard<mutex> lk(mMut);
    lock_guard<mutex> lk(mMut);
    if (mIsTuneCompleted) {

    if (mIsClosed) {
        _hidl_cb(Result::NOT_INITIALIZED, {});
    } else if (mIsTuneCompleted) {
        _hidl_cb(Result::OK, mCurrentProgramInfo);
        _hidl_cb(Result::OK, mCurrentProgramInfo);
    } else {
    } else {
        _hidl_cb(Result::NOT_INITIALIZED, makeDummyProgramInfo(mCurrentProgram));
        _hidl_cb(Result::NOT_INITIALIZED, makeDummyProgramInfo(mCurrentProgram));
    }
    }
    return Void();
    return {};
}
}


Return<ProgramListResult> Tuner::startBackgroundScan() {
Return<ProgramListResult> Tuner::startBackgroundScan() {
    ALOGV("%s", __func__);
    ALOGV("%s", __func__);
    lock_guard<mutex> lk(mMut);
    if (mIsClosed) return ProgramListResult::NOT_INITIALIZED;

    return ProgramListResult::UNAVAILABLE;
    return ProgramListResult::UNAVAILABLE;
}
}


Return<void> Tuner::getProgramList(const hidl_string& filter __unused, getProgramList_cb _hidl_cb) {
Return<void> Tuner::getProgramList(const hidl_string& filter, getProgramList_cb _hidl_cb) {
    ALOGV("%s", __func__);
    ALOGV("%s(%s)", __func__, filter.c_str());
    lock_guard<mutex> lk(mMut);
    lock_guard<mutex> lk(mMut);
    if (mIsClosed) {
        _hidl_cb(ProgramListResult::NOT_INITIALIZED, {});
        return {};
    }


    auto& virtualRadio = mVirtualFm;
    auto& virtualRadio = mVirtualFm;
    if (!isFmLocked()) {
    if (!isFmLocked()) {
        ALOGI("bands other than FM are not supported yet");
        ALOGI("bands other than FM are not supported yet");
        _hidl_cb(ProgramListResult::OK, {});
        _hidl_cb(ProgramListResult::OK, {});
        return Void();
        return {};
    }
    }


    auto list = virtualRadio.getProgramList();
    auto list = virtualRadio.getProgramList();
    ALOGD("returning a list of %zu programs", list.size());
    ALOGD("returning a list of %zu programs", list.size());
    _hidl_cb(ProgramListResult::OK, vector<ProgramInfo>(list.begin(), list.end()));
    _hidl_cb(ProgramListResult::OK, hidl_vec<ProgramInfo>(list.begin(), list.end()));
    return Void();
    return {};
}
}


Return<void> Tuner::isAnalogForced(isAnalogForced_cb _hidl_cb) {
Return<void> Tuner::isAnalogForced(isAnalogForced_cb _hidl_cb) {
    ALOGV("%s", __func__);
    ALOGV("%s", __func__);
    lock_guard<mutex> lk(mMut);

    if (mIsClosed) {
        _hidl_cb(Result::NOT_INITIALIZED, false);
    } else {
        _hidl_cb(Result::OK, mIsAnalogForced);
        _hidl_cb(Result::OK, mIsAnalogForced);
    return Void();
    }
    return {};
}
}


Return<Result> Tuner::setAnalogForced(bool isForced) {
Return<Result> Tuner::setAnalogForced(bool isForced) {
    ALOGV("%s", __func__);
    ALOGV("%s", __func__);
    lock_guard<mutex> lk(mMut);
    if (mIsClosed) return Result::NOT_INITIALIZED;

    mIsAnalogForced = isForced;
    mIsAnalogForced = isForced;
    return Result::OK;
    return Result::OK;
}
}
+1 −1
Original line number Original line Diff line number Diff line
@@ -53,7 +53,7 @@ struct Tuner : public ITuner {
   private:
   private:
    std::mutex mMut;
    std::mutex mMut;
    WorkerThread mThread;
    WorkerThread mThread;
    bool mIsClosed = false;  // TODO(b/36864090): use it
    bool mIsClosed = false;


    const sp<V1_0::ITunerCallback> mCallback;
    const sp<V1_0::ITunerCallback> mCallback;
    const sp<V1_1::ITunerCallback> mCallback1_1;
    const sp<V1_1::ITunerCallback> mCallback1_1;
+1 −1
Original line number Original line Diff line number Diff line
@@ -41,7 +41,7 @@ static MetaData createDemoBitmap(MetadataKey key) {
    if (gHalVersion < 2) {
    if (gHalVersion < 2) {
        bmp.type = MetadataType::RAW;
        bmp.type = MetadataType::RAW;
        bmp.intValue = 0;
        bmp.intValue = 0;
        bmp.rawValue = std::vector<uint8_t>(resources::demoPng, std::end(resources::demoPng));
        bmp.rawValue = hidl_vec<uint8_t>(resources::demoPng, std::end(resources::demoPng));
    }
    }
    return bmp;
    return bmp;
}
}
+3 −1
Original line number Original line Diff line number Diff line
@@ -53,7 +53,9 @@ static bool anyHaveId(const ProgramSelector& a, const ProgramSelector& b,
static bool haveEqualIds(const ProgramSelector& a, const ProgramSelector& b,
static bool haveEqualIds(const ProgramSelector& a, const ProgramSelector& b,
                         const IdentifierType type) {
                         const IdentifierType type) {
    if (!bothHaveId(a, b, type)) return false;
    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 aId = getId(a, type);
    auto bId = getId(b, type);
    auto bId = getId(b, type);
    return aId == bId;
    return aId == bId;