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

Commit b1baabb5 authored by Amy Zhang's avatar Amy Zhang
Browse files

Fix issues in Tuner Service implementation

This CL fixes the following bugs:
1. Missing Tuner HAL version check API
2. hidl_array init issue when converting ip settings
3. Missing handling the aidl service binding error

Test: atest android.media.tv.tuner.cts
Bug: 159067322
Change-Id: Ib43cedccb062e7849b5133e03c74c58c9e082437
parent f543afb2
Loading
Loading
Loading
Loading
+6 −7
Original line number Diff line number Diff line
@@ -285,6 +285,7 @@ void TunerFilter::getHidlIpSettings(
        .srcPort = static_cast<uint16_t>(ipConf.ipAddr.srcPort),
        .dstPort = static_cast<uint16_t>(ipConf.ipAddr.dstPort),
    };

    ipConf.ipAddr.srcIpAddress.isIpV6
            ? ipAddr.srcIpAddress.v6(getIpV6Address(ipConf.ipAddr.srcIpAddress))
            : ipAddr.srcIpAddress.v4(getIpV4Address(ipConf.ipAddr.srcIpAddress));
@@ -314,7 +315,7 @@ void TunerFilter::getHidlIpSettings(
}

hidl_array<uint8_t, IP_V6_LENGTH> TunerFilter::getIpV6Address(TunerDemuxIpAddress addr) {
    hidl_array<uint8_t, IP_V6_LENGTH> ip = {0};
    hidl_array<uint8_t, IP_V6_LENGTH> ip;
    if (addr.addr.size() != IP_V6_LENGTH) {
        return ip;
    }
@@ -323,7 +324,7 @@ hidl_array<uint8_t, IP_V6_LENGTH> TunerFilter::getIpV6Address(TunerDemuxIpAddres
}

hidl_array<uint8_t, IP_V4_LENGTH> TunerFilter::getIpV4Address(TunerDemuxIpAddress addr) {
    hidl_array<uint8_t, IP_V4_LENGTH> ip = {0};
    hidl_array<uint8_t, IP_V4_LENGTH> ip;
    if (addr.addr.size() != IP_V4_LENGTH) {
        return ip;
    }
@@ -620,16 +621,17 @@ void TunerFilter::FilterCallback::getAidlFilterEvent(vector<DemuxFilterEvent::Ev
        switch (eventExt.getDiscriminator()) {
            case DemuxFilterEventExt::Event::hidl_discriminator::monitorEvent: {
                getMonitorEvent(eventsExt, tunerEvent);
                break;
                return;
            }
            case DemuxFilterEventExt::Event::hidl_discriminator::startId: {
                getRestartEvent(eventsExt, tunerEvent);
                break;
                return;
            }
            default: {
                break;
            }
        }
        return;
    }

    if (!events.empty()) {
@@ -889,9 +891,6 @@ void TunerFilter::FilterCallback::getMonitorEvent(
            tunerMonitor.set<TunerFilterMonitorEvent::cid>(static_cast<int>(monitorEvent.cid()));
            break;
        }
        default: {
            break;
        }
    }

    TunerFilterEvent tunerEvent;
+3 −3
Original line number Diff line number Diff line
@@ -804,13 +804,13 @@ void TunerFrontend::getAidlFrontendStatusExt(
            case FrontendStatusExt1_1::hidl_discriminator::rollOff: {
                switch (s.rollOff().getDiscriminator()) {
                    case FrontendRollOff::hidl_discriminator::dvbs:
                        status.set<TunerFrontendStatus::interleaving>((int)s.rollOff().dvbs());
                        status.set<TunerFrontendStatus::rollOff>((int)s.rollOff().dvbs());
                        break;
                    case FrontendRollOff::hidl_discriminator::isdbs:
                        status.set<TunerFrontendStatus::interleaving>((int)s.rollOff().isdbs());
                        status.set<TunerFrontendStatus::rollOff>((int)s.rollOff().isdbs());
                        break;
                    case FrontendRollOff::hidl_discriminator::isdbs3:
                        status.set<TunerFrontendStatus::interleaving>((int)s.rollOff().isdbs3());
                        status.set<TunerFrontendStatus::rollOff>((int)s.rollOff().isdbs3());
                        break;
                }
                aidlStatus.push_back(status);
+17 −14
Original line number Diff line number Diff line
@@ -52,10 +52,10 @@ namespace android {
TunerService::TunerService() {}
TunerService::~TunerService() {}

void TunerService::instantiate() {
binder_status_t TunerService::instantiate() {
    shared_ptr<TunerService> service =
            ::ndk::SharedRefBase::make<TunerService>();
    AServiceManager_addService(service->asBinder().get(), getServiceName());
    return AServiceManager_addService(service->asBinder().get(), getServiceName());
}

bool TunerService::hasITuner() {
@@ -68,23 +68,20 @@ bool TunerService::hasITuner() {
        ALOGE("Failed to get ITuner service");
        return false;
    }
    mTunerVersion = TUNER_HAL_VERSION_1_0;
    mTuner_1_1 = ::android::hardware::tv::tuner::V1_1::ITuner::castFrom(mTuner);
    if (mTuner_1_1 != nullptr) {
        mTunerVersion = TUNER_HAL_VERSION_1_1;
    } else {
        ALOGE("Failed to get ITuner_1_1 service");
    }
    return true;
}

bool TunerService::hasITuner_1_1() {
    ALOGD("hasITuner_1_1");
    if (mTuner_1_1 != nullptr) {
        return true;
    }
    if (!hasITuner()) {
        return false;
    }
    mTuner_1_1 = ::android::hardware::tv::tuner::V1_1::ITuner::castFrom(mTuner);
    if (mTuner_1_1 == nullptr) {
        ALOGE("Failed to get ITuner_1_1 service");
        return false;
    }
    return true;
    hasITuner();
    return (mTunerVersion == TUNER_HAL_VERSION_1_1);
}

Status TunerService::openDemux(
@@ -300,6 +297,12 @@ Status TunerService::updateTunerResources() {
    return Status::ok();
}

Status TunerService::getTunerHalVersion(int* _aidl_return) {
    hasITuner();
    *_aidl_return = mTunerVersion;
    return Status::ok();
}

void TunerService::updateFrontendResources() {
    hidl_vec<FrontendId> ids;
    Result res = getHidlFrontendIds(ids);
+8 −1
Original line number Diff line number Diff line
@@ -69,6 +69,10 @@ using namespace std;

namespace android {

const static int TUNER_HAL_VERSION_UNKNOWN = 0;
const static int TUNER_HAL_VERSION_1_0 = 1 << 16;
const static int TUNER_HAL_VERSION_1_1 = (1 << 16) | 1;

typedef enum {
    FRONTEND,
    LNB,
@@ -93,7 +97,7 @@ class TunerService : public BnTunerService {

public:
    static char const *getServiceName() { return "media.tuner"; }
    static void instantiate();
    static binder_status_t instantiate();
    TunerService();
    virtual ~TunerService();

@@ -110,6 +114,7 @@ public:
    Status openDescrambler(int32_t descramblerHandle,
            std::shared_ptr<ITunerDescrambler>* _aidl_return) override;
    Status updateTunerResources() override;
    Status getTunerHalVersion(int* _aidl_return) override;

    // TODO: create a map between resource id and handles.
    static int getResourceIdFromHandle(int resourceHandle, int /*type*/) {
@@ -141,6 +146,8 @@ private:

    shared_ptr<ITunerResourceManager> mTunerResourceManager;
    int mResourceRequestCount = 0;

    int mTunerVersion = TUNER_HAL_VERSION_UNKNOWN;
};

} // namespace android
+7 −0
Original line number Diff line number Diff line
@@ -101,4 +101,11 @@ interface ITunerService {
     */
    // TODO: b/178124017 update TRM in TunerService independently.
    void updateTunerResources();

    /**
     * Get an integer that carries the Tuner HIDL version. The high 16 bits are the
     * major version number while the low 16 bits are the minor version. Default
     * value is unknown version 0.
     */
    int getTunerHalVersion();
}
Loading