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

Commit efadc19b authored by Tomasz Wasilczyk's avatar Tomasz Wasilczyk
Browse files

Make virtual radio space generic, not only FM-exclusive.

Bug: b/36864090
Test: VTS, instrumentalization
Change-Id: I2764d09f56a397a1b80914a2634d6bad4b3bd3d2
parent 5be4c2b6
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -143,7 +143,7 @@ Return<void> BroadcastRadio::openTuner(const BandConfig& config, bool audio __un
        mTuner = nullptr;
        mTuner = nullptr;
    }
    }


    sp<Tuner> newTuner = new Tuner(callback);
    sp<Tuner> newTuner = new Tuner(mClassId, callback);
    mTuner = newTuner;
    mTuner = newTuner;
    if (mClassId == Class::AM_FM) {
    if (mClassId == Class::AM_FM) {
        auto ret = newTuner->setConfiguration(config);
        auto ret = newTuner->setConfiguration(config);
+18 −27
Original line number Original line Diff line number Diff line
@@ -33,6 +33,7 @@ using namespace std::chrono_literals;


using V1_0::Band;
using V1_0::Band;
using V1_0::BandConfig;
using V1_0::BandConfig;
using V1_0::Class;
using V1_0::Direction;
using V1_0::Direction;
using utils::HalRevision;
using utils::HalRevision;


@@ -50,10 +51,11 @@ const struct {
    milliseconds tune = 150ms;
    milliseconds tune = 150ms;
} gDefaultDelay;
} gDefaultDelay;


Tuner::Tuner(const sp<V1_0::ITunerCallback>& callback)
Tuner::Tuner(V1_0::Class classId, const sp<V1_0::ITunerCallback>& callback)
    : mCallback(callback),
    : mClassId(classId),
      mCallback(callback),
      mCallback1_1(ITunerCallback::castFrom(callback).withDefault(nullptr)),
      mCallback1_1(ITunerCallback::castFrom(callback).withDefault(nullptr)),
      mVirtualFm(make_fm_radio()),
      mVirtualRadio(getRadio(classId)),
      mIsAnalogForced(false) {}
      mIsAnalogForced(false) {}


void Tuner::forceClose() {
void Tuner::forceClose() {
@@ -66,6 +68,10 @@ Return<Result> Tuner::setConfiguration(const BandConfig& config) {
    ALOGV("%s", __func__);
    ALOGV("%s", __func__);
    lock_guard<mutex> lk(mMut);
    lock_guard<mutex> lk(mMut);
    if (mIsClosed) return Result::NOT_INITIALIZED;
    if (mIsClosed) return Result::NOT_INITIALIZED;
    if (mClassId != Class::AM_FM) {
        ALOGE("Can't set AM/FM configuration on SAT/DT radio tuner");
        return Result::INVALID_STATE;
    }


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


@@ -77,6 +83,12 @@ Return<Result> Tuner::setConfiguration(const BandConfig& config) {
        mAmfmConfig.antennaConnected = true;
        mAmfmConfig.antennaConnected = true;
        mCurrentProgram = utils::make_selector(mAmfmConfig.type, mAmfmConfig.lowerLimit);
        mCurrentProgram = utils::make_selector(mAmfmConfig.type, mAmfmConfig.lowerLimit);


        if (mAmfmConfig.type == Band::FM_HD || mAmfmConfig.type == Band::FM) {
            mVirtualRadio = std::ref(getFmRadio());
        } else {
            mVirtualRadio = std::ref(getAmRadio());
        }

        mIsAmfmConfigSet = true;
        mIsAmfmConfigSet = true;
        mCallback->configChange(Result::OK, mAmfmConfig);
        mCallback->configChange(Result::OK, mAmfmConfig);
    };
    };
@@ -117,19 +129,9 @@ HalRevision Tuner::getHalRev() const {
    }
    }
}
}


bool Tuner::isFmLocked() {
    if (!utils::isAmFm(utils::getType(mCurrentProgram))) return false;
    return mAmfmConfig.type == Band::FM_HD || mAmfmConfig.type == Band::FM;
}

void Tuner::tuneInternalLocked(const ProgramSelector& sel) {
void Tuner::tuneInternalLocked(const ProgramSelector& sel) {
    VirtualRadio* virtualRadio = nullptr;
    if (isFmLocked()) {
        virtualRadio = &mVirtualFm;
    }

    VirtualProgram virtualProgram;
    VirtualProgram virtualProgram;
    if (virtualRadio != nullptr && virtualRadio->getProgram(sel, virtualProgram)) {
    if (mVirtualRadio.get().getProgram(sel, virtualProgram)) {
        mCurrentProgram = virtualProgram.selector;
        mCurrentProgram = virtualProgram.selector;
        mCurrentProgramInfo = virtualProgram.getProgramInfo(getHalRev());
        mCurrentProgramInfo = virtualProgram.getProgramInfo(getHalRev());
    } else {
    } else {
@@ -150,11 +152,7 @@ Return<Result> Tuner::scan(Direction direction, bool skipSubChannel __unused) {
    lock_guard<mutex> lk(mMut);
    lock_guard<mutex> lk(mMut);
    if (mIsClosed) return Result::NOT_INITIALIZED;
    if (mIsClosed) return Result::NOT_INITIALIZED;


    vector<VirtualProgram> list;
    auto list = mVirtualRadio.get().getProgramList();

    if (isFmLocked()) {
        list = mVirtualFm.getProgramList();
    }


    if (list.empty()) {
    if (list.empty()) {
        mIsTuneCompleted = false;
        mIsTuneCompleted = false;
@@ -332,14 +330,7 @@ Return<void> Tuner::getProgramList(const hidl_string& filter, getProgramList_cb
        return {};
        return {};
    }
    }


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

    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, getProgramInfoVector(list, getHalRev()));
    _hidl_cb(ProgramListResult::OK, getProgramInfoVector(list, getHalRev()));
    return {};
    return {};
+3 −4
Original line number Original line Diff line number Diff line
@@ -29,7 +29,7 @@ namespace V1_1 {
namespace implementation {
namespace implementation {


struct Tuner : public ITuner {
struct Tuner : public ITuner {
    Tuner(const sp<V1_0::ITunerCallback>& callback);
    Tuner(V1_0::Class classId, const sp<V1_0::ITunerCallback>& callback);


    void forceClose();
    void forceClose();


@@ -55,11 +55,11 @@ struct Tuner : public ITuner {
    WorkerThread mThread;
    WorkerThread mThread;
    bool mIsClosed = false;
    bool mIsClosed = false;


    V1_0::Class mClassId;
    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;


    VirtualRadio mVirtualFm;
    std::reference_wrapper<VirtualRadio> mVirtualRadio;

    bool mIsAmfmConfigSet = false;
    bool mIsAmfmConfigSet = false;
    V1_0::BandConfig mAmfmConfig;
    V1_0::BandConfig mAmfmConfig;
    bool mIsTuneCompleted = false;
    bool mIsTuneCompleted = false;
@@ -69,7 +69,6 @@ struct Tuner : public ITuner {


    utils::HalRevision getHalRev() const;
    utils::HalRevision getHalRev() const;
    void tuneInternalLocked(const ProgramSelector& sel);
    void tuneInternalLocked(const ProgramSelector& sel);
    bool isFmLocked();  // TODO(b/36864090): make it generic, not FM only
};
};


}  // namespace implementation
}  // namespace implementation
+6 −0
Original line number Original line Diff line number Diff line
@@ -25,6 +25,12 @@ namespace broadcastradio {
namespace V1_1 {
namespace V1_1 {
namespace implementation {
namespace implementation {


/**
 * A radio program mock.
 *
 * This represents broadcast waves flying over the air,
 * not an entry for a captured station in the radio tuner memory.
 */
struct VirtualProgram {
struct VirtualProgram {
    ProgramSelector selector;
    ProgramSelector selector;


+36 −4
Original line number Original line Diff line number Diff line
@@ -13,9 +13,13 @@
 * See the License for the specific language governing permissions and
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * limitations under the License.
 */
 */
#define LOG_TAG "BroadcastRadioDefault.VirtualRadio"
//#define LOG_NDEBUG 0

#include "VirtualRadio.h"
#include "VirtualRadio.h"


#include <broadcastradio-utils/Utils.h>
#include <broadcastradio-utils/Utils.h>
#include <log/log.h>


namespace android {
namespace android {
namespace hardware {
namespace hardware {
@@ -24,6 +28,7 @@ namespace V1_1 {
namespace implementation {
namespace implementation {


using V1_0::Band;
using V1_0::Band;
using V1_0::Class;


using std::lock_guard;
using std::lock_guard;
using std::move;
using std::move;
@@ -32,7 +37,7 @@ using std::vector;


using utils::make_selector;
using utils::make_selector;


const vector<VirtualProgram> gInitialFmPrograms{
static const vector<VirtualProgram> gInitialFmPrograms{
    {make_selector(Band::FM, 94900), "Wild 94.9", "Drake ft. Rihanna", "Too Good"},
    {make_selector(Band::FM, 94900), "Wild 94.9", "Drake ft. Rihanna", "Too Good"},
    {make_selector(Band::FM, 96500), "KOIT", "Celine Dion", "All By Myself"},
    {make_selector(Band::FM, 96500), "KOIT", "Celine Dion", "All By Myself"},
    {make_selector(Band::FM, 97300), "Alice@97.3", "Drops of Jupiter", "Train"},
    {make_selector(Band::FM, 97300), "Alice@97.3", "Drops of Jupiter", "Train"},
@@ -42,7 +47,8 @@ const vector<VirtualProgram> gInitialFmPrograms{
    {make_selector(Band::FM, 106100), "106 KMEL", "Drake", "Marvins Room"},
    {make_selector(Band::FM, 106100), "106 KMEL", "Drake", "Marvins Room"},
};
};


VirtualRadio::VirtualRadio(VirtualRadio&& o) : mPrograms(move(o.mPrograms)) {}
static VirtualRadio gEmptyRadio({});
static VirtualRadio gFmRadio(gInitialFmPrograms);


VirtualRadio::VirtualRadio(const vector<VirtualProgram> initialList) : mPrograms(initialList) {}
VirtualRadio::VirtualRadio(const vector<VirtualProgram> initialList) : mPrograms(initialList) {}


@@ -62,8 +68,34 @@ bool VirtualRadio::getProgram(const ProgramSelector& selector, VirtualProgram& p
    return false;
    return false;
}
}


VirtualRadio make_fm_radio() {
VirtualRadio& getRadio(V1_0::Class classId) {
    return VirtualRadio(gInitialFmPrograms);
    switch (classId) {
        case Class::AM_FM:
            return getFmRadio();
        case Class::SAT:
            return getSatRadio();
        case Class::DT:
            return getDigitalRadio();
        default:
            ALOGE("Invalid class ID");
            return gEmptyRadio;
    }
}

VirtualRadio& getAmRadio() {
    return gEmptyRadio;
}

VirtualRadio& getFmRadio() {
    return gFmRadio;
}

VirtualRadio& getSatRadio() {
    return gEmptyRadio;
}

VirtualRadio& getDigitalRadio() {
    return gEmptyRadio;
}
}


}  // namespace implementation
}  // namespace implementation
Loading