Loading services/tuner/TunerService.cpp +154 −0 Original line number Diff line number Diff line Loading @@ -20,8 +20,19 @@ #include <utils/Log.h> #include "TunerService.h" using ::aidl::android::media::tv::tuner::TunerFrontendAnalogCapabilities; using ::aidl::android::media::tv::tuner::TunerFrontendAtsc3Capabilities; using ::aidl::android::media::tv::tuner::TunerFrontendAtscCapabilities; using ::aidl::android::media::tv::tuner::TunerFrontendCableCapabilities; using ::aidl::android::media::tv::tuner::TunerFrontendCapabilities; using ::aidl::android::media::tv::tuner::TunerFrontendDvbsCapabilities; using ::aidl::android::media::tv::tuner::TunerFrontendDvbtCapabilities; using ::aidl::android::media::tv::tuner::TunerFrontendIsdbs3Capabilities; using ::aidl::android::media::tv::tuner::TunerFrontendIsdbsCapabilities; using ::aidl::android::media::tv::tuner::TunerFrontendIsdbtCapabilities; using ::android::hardware::hidl_vec; using ::android::hardware::tv::tuner::V1_0::FrontendId; using ::android::hardware::tv::tuner::V1_0::FrontendType; using ::android::hardware::tv::tuner::V1_0::Result; namespace android { Loading Loading @@ -62,4 +73,147 @@ Status TunerService::getFrontendIds(std::vector<int32_t>* ids, int32_t* /* _aidl return ::ndk::ScopedAStatus::ok(); } Status TunerService::getFrontendInfo( int32_t frontendHandle, TunerServiceFrontendInfo* _aidl_return) { if (mTuner == nullptr) { // TODO: create a method for init. mTuner = ITuner::getService(); if (mTuner == nullptr) { ALOGE("Failed to get ITuner service."); return ::ndk::ScopedAStatus::fromServiceSpecificError( static_cast<int32_t>(Result::UNAVAILABLE)); } } Result res; FrontendInfo info; int feId = getResourceIdFromHandle(frontendHandle); mTuner->getFrontendInfo(feId, [&](Result r, const FrontendInfo& feInfo) { info = feInfo; res = r; }); if (res != Result::SUCCESS) { return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res)); } TunerServiceFrontendInfo tunerInfo = convertToAidlFrontendInfo(feId, info); *_aidl_return = tunerInfo; return ::ndk::ScopedAStatus::ok(); } TunerServiceFrontendInfo TunerService::convertToAidlFrontendInfo(int feId, FrontendInfo halInfo) { TunerServiceFrontendInfo info{ .id = feId, .type = (int)halInfo.type, .minFrequency = (int)halInfo.minFrequency, .maxFrequency = (int)halInfo.maxFrequency, .minSymbolRate = (int)halInfo.minSymbolRate, .maxSymbolRate = (int)halInfo.maxSymbolRate, .acquireRange = (int)halInfo.acquireRange, .exclusiveGroupId = (int)halInfo.exclusiveGroupId, }; for (int i = 0; i < halInfo.statusCaps.size(); i++) { info.statusCaps.push_back((int)halInfo.statusCaps[i]); } TunerFrontendCapabilities caps; switch (halInfo.type) { case FrontendType::ANALOG: { TunerFrontendAnalogCapabilities analogCaps{ .typeCap = (int)halInfo.frontendCaps.analogCaps().typeCap, .sifStandardCap = (int)halInfo.frontendCaps.analogCaps().sifStandardCap, }; caps.set<TunerFrontendCapabilities::analogCaps>(analogCaps); break; } case FrontendType::ATSC: { TunerFrontendAtscCapabilities atscCaps{ .modulationCap = (int)halInfo.frontendCaps.atscCaps().modulationCap, }; caps.set<TunerFrontendCapabilities::atscCaps>(atscCaps); break; } case FrontendType::ATSC3: { TunerFrontendAtsc3Capabilities atsc3Caps{ .bandwidthCap = (int)halInfo.frontendCaps.atsc3Caps().bandwidthCap, .modulationCap = (int)halInfo.frontendCaps.atsc3Caps().modulationCap, .timeInterleaveModeCap = (int)halInfo.frontendCaps.atsc3Caps().timeInterleaveModeCap, .codeRateCap = (int)halInfo.frontendCaps.atsc3Caps().codeRateCap, .demodOutputFormatCap = (int)halInfo.frontendCaps.atsc3Caps().demodOutputFormatCap, .fecCap = (int)halInfo.frontendCaps.atsc3Caps().fecCap, }; caps.set<TunerFrontendCapabilities::atsc3Caps>(atsc3Caps); break; } case FrontendType::DVBC: { TunerFrontendCableCapabilities cableCaps{ .modulationCap = (int)halInfo.frontendCaps.dvbcCaps().modulationCap, .codeRateCap = (int)halInfo.frontendCaps.dvbcCaps().fecCap, .annexCap = (int)halInfo.frontendCaps.dvbcCaps().annexCap, }; caps.set<TunerFrontendCapabilities::cableCaps>(cableCaps); break; } case FrontendType::DVBS: { TunerFrontendDvbsCapabilities dvbsCaps{ .modulationCap = (int)halInfo.frontendCaps.dvbsCaps().modulationCap, .codeRateCap = (long)halInfo.frontendCaps.dvbsCaps().innerfecCap, .standard = (int)halInfo.frontendCaps.dvbsCaps().standard, }; caps.set<TunerFrontendCapabilities::dvbsCaps>(dvbsCaps); break; } case FrontendType::DVBT: { TunerFrontendDvbtCapabilities dvbtCaps{ .transmissionModeCap = (int)halInfo.frontendCaps.dvbtCaps().transmissionModeCap, .bandwidthCap = (int)halInfo.frontendCaps.dvbtCaps().bandwidthCap, .constellationCap = (int)halInfo.frontendCaps.dvbtCaps().constellationCap, .codeRateCap = (int)halInfo.frontendCaps.dvbtCaps().coderateCap, .hierarchyCap = (int)halInfo.frontendCaps.dvbtCaps().hierarchyCap, .guardIntervalCap = (int)halInfo.frontendCaps.dvbtCaps().guardIntervalCap, .isT2Supported = (bool)halInfo.frontendCaps.dvbtCaps().isT2Supported, .isMisoSupported = (bool)halInfo.frontendCaps.dvbtCaps().isMisoSupported, }; caps.set<TunerFrontendCapabilities::dvbtCaps>(dvbtCaps); break; } case FrontendType::ISDBS: { TunerFrontendIsdbsCapabilities isdbsCaps{ .modulationCap = (int)halInfo.frontendCaps.isdbsCaps().modulationCap, .codeRateCap = (int)halInfo.frontendCaps.isdbsCaps().coderateCap, }; caps.set<TunerFrontendCapabilities::isdbsCaps>(isdbsCaps); break; } case FrontendType::ISDBS3: { TunerFrontendIsdbs3Capabilities isdbs3Caps{ .modulationCap = (int)halInfo.frontendCaps.isdbs3Caps().modulationCap, .codeRateCap = (int)halInfo.frontendCaps.isdbs3Caps().coderateCap, }; caps.set<TunerFrontendCapabilities::isdbs3Caps>(isdbs3Caps); break; } case FrontendType::ISDBT: { TunerFrontendIsdbtCapabilities isdbtCaps{ .modeCap = (int)halInfo.frontendCaps.isdbtCaps().modeCap, .bandwidthCap = (int)halInfo.frontendCaps.isdbtCaps().bandwidthCap, .modulationCap = (int)halInfo.frontendCaps.isdbtCaps().modulationCap, .codeRateCap = (int)halInfo.frontendCaps.isdbtCaps().coderateCap, .guardIntervalCap = (int)halInfo.frontendCaps.isdbtCaps().guardIntervalCap, }; caps.set<TunerFrontendCapabilities::isdbtCaps>(isdbtCaps); break; } default: break; } info.caps = caps; return info; } int TunerService::getResourceIdFromHandle(int resourceHandle) { return (resourceHandle & 0x00ff0000) >> 16; } } // namespace android services/tuner/TunerService.h +7 −0 Original line number Diff line number Diff line Loading @@ -18,10 +18,13 @@ #define ANDROID_MEDIA_TUNERSERVICE_H #include <aidl/android/media/tv/tuner/BnTunerService.h> #include <aidl/android/media/tv/tuner/TunerServiceFrontendInfo.h> #include <android/hardware/tv/tuner/1.0/ITuner.h> using Status = ::ndk::ScopedAStatus; using ::aidl::android::media::tv::tuner::BnTunerService; using ::aidl::android::media::tv::tuner::TunerServiceFrontendInfo; using ::android::hardware::tv::tuner::V1_0::FrontendInfo; using ::android::hardware::tv::tuner::V1_0::ITuner; namespace android { Loading @@ -34,9 +37,13 @@ public: TunerService(); virtual ~TunerService(); Status getFrontendIds(std::vector<int32_t>* ids, int32_t* _aidl_return) override; Status getFrontendInfo(int32_t frontendHandle, TunerServiceFrontendInfo* _aidl_return) override; private: static sp<ITuner> mTuner; int getResourceIdFromHandle(int resourceHandle); TunerServiceFrontendInfo convertToAidlFrontendInfo(int feId, FrontendInfo halInfo); }; } // namespace android Loading services/tuner/aidl/android/media/tv/tuner/ITunerService.aidl +10 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package android.media.tv.tuner; import android.media.tv.tuner.TunerServiceFrontendInfo; /** * TunerService interface handles tuner related operations. * Loading @@ -29,4 +31,12 @@ interface ITunerService { * @return the result code of the operation. */ int getFrontendIds(out int[] ids); /** * Retrieve the frontend's information. * * @param frontendHandle the handle of the frontend granted by TRM. * @return the information for the frontend. */ TunerServiceFrontendInfo getFrontendInfo(in int frontendHandle); } Loading
services/tuner/TunerService.cpp +154 −0 Original line number Diff line number Diff line Loading @@ -20,8 +20,19 @@ #include <utils/Log.h> #include "TunerService.h" using ::aidl::android::media::tv::tuner::TunerFrontendAnalogCapabilities; using ::aidl::android::media::tv::tuner::TunerFrontendAtsc3Capabilities; using ::aidl::android::media::tv::tuner::TunerFrontendAtscCapabilities; using ::aidl::android::media::tv::tuner::TunerFrontendCableCapabilities; using ::aidl::android::media::tv::tuner::TunerFrontendCapabilities; using ::aidl::android::media::tv::tuner::TunerFrontendDvbsCapabilities; using ::aidl::android::media::tv::tuner::TunerFrontendDvbtCapabilities; using ::aidl::android::media::tv::tuner::TunerFrontendIsdbs3Capabilities; using ::aidl::android::media::tv::tuner::TunerFrontendIsdbsCapabilities; using ::aidl::android::media::tv::tuner::TunerFrontendIsdbtCapabilities; using ::android::hardware::hidl_vec; using ::android::hardware::tv::tuner::V1_0::FrontendId; using ::android::hardware::tv::tuner::V1_0::FrontendType; using ::android::hardware::tv::tuner::V1_0::Result; namespace android { Loading Loading @@ -62,4 +73,147 @@ Status TunerService::getFrontendIds(std::vector<int32_t>* ids, int32_t* /* _aidl return ::ndk::ScopedAStatus::ok(); } Status TunerService::getFrontendInfo( int32_t frontendHandle, TunerServiceFrontendInfo* _aidl_return) { if (mTuner == nullptr) { // TODO: create a method for init. mTuner = ITuner::getService(); if (mTuner == nullptr) { ALOGE("Failed to get ITuner service."); return ::ndk::ScopedAStatus::fromServiceSpecificError( static_cast<int32_t>(Result::UNAVAILABLE)); } } Result res; FrontendInfo info; int feId = getResourceIdFromHandle(frontendHandle); mTuner->getFrontendInfo(feId, [&](Result r, const FrontendInfo& feInfo) { info = feInfo; res = r; }); if (res != Result::SUCCESS) { return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res)); } TunerServiceFrontendInfo tunerInfo = convertToAidlFrontendInfo(feId, info); *_aidl_return = tunerInfo; return ::ndk::ScopedAStatus::ok(); } TunerServiceFrontendInfo TunerService::convertToAidlFrontendInfo(int feId, FrontendInfo halInfo) { TunerServiceFrontendInfo info{ .id = feId, .type = (int)halInfo.type, .minFrequency = (int)halInfo.minFrequency, .maxFrequency = (int)halInfo.maxFrequency, .minSymbolRate = (int)halInfo.minSymbolRate, .maxSymbolRate = (int)halInfo.maxSymbolRate, .acquireRange = (int)halInfo.acquireRange, .exclusiveGroupId = (int)halInfo.exclusiveGroupId, }; for (int i = 0; i < halInfo.statusCaps.size(); i++) { info.statusCaps.push_back((int)halInfo.statusCaps[i]); } TunerFrontendCapabilities caps; switch (halInfo.type) { case FrontendType::ANALOG: { TunerFrontendAnalogCapabilities analogCaps{ .typeCap = (int)halInfo.frontendCaps.analogCaps().typeCap, .sifStandardCap = (int)halInfo.frontendCaps.analogCaps().sifStandardCap, }; caps.set<TunerFrontendCapabilities::analogCaps>(analogCaps); break; } case FrontendType::ATSC: { TunerFrontendAtscCapabilities atscCaps{ .modulationCap = (int)halInfo.frontendCaps.atscCaps().modulationCap, }; caps.set<TunerFrontendCapabilities::atscCaps>(atscCaps); break; } case FrontendType::ATSC3: { TunerFrontendAtsc3Capabilities atsc3Caps{ .bandwidthCap = (int)halInfo.frontendCaps.atsc3Caps().bandwidthCap, .modulationCap = (int)halInfo.frontendCaps.atsc3Caps().modulationCap, .timeInterleaveModeCap = (int)halInfo.frontendCaps.atsc3Caps().timeInterleaveModeCap, .codeRateCap = (int)halInfo.frontendCaps.atsc3Caps().codeRateCap, .demodOutputFormatCap = (int)halInfo.frontendCaps.atsc3Caps().demodOutputFormatCap, .fecCap = (int)halInfo.frontendCaps.atsc3Caps().fecCap, }; caps.set<TunerFrontendCapabilities::atsc3Caps>(atsc3Caps); break; } case FrontendType::DVBC: { TunerFrontendCableCapabilities cableCaps{ .modulationCap = (int)halInfo.frontendCaps.dvbcCaps().modulationCap, .codeRateCap = (int)halInfo.frontendCaps.dvbcCaps().fecCap, .annexCap = (int)halInfo.frontendCaps.dvbcCaps().annexCap, }; caps.set<TunerFrontendCapabilities::cableCaps>(cableCaps); break; } case FrontendType::DVBS: { TunerFrontendDvbsCapabilities dvbsCaps{ .modulationCap = (int)halInfo.frontendCaps.dvbsCaps().modulationCap, .codeRateCap = (long)halInfo.frontendCaps.dvbsCaps().innerfecCap, .standard = (int)halInfo.frontendCaps.dvbsCaps().standard, }; caps.set<TunerFrontendCapabilities::dvbsCaps>(dvbsCaps); break; } case FrontendType::DVBT: { TunerFrontendDvbtCapabilities dvbtCaps{ .transmissionModeCap = (int)halInfo.frontendCaps.dvbtCaps().transmissionModeCap, .bandwidthCap = (int)halInfo.frontendCaps.dvbtCaps().bandwidthCap, .constellationCap = (int)halInfo.frontendCaps.dvbtCaps().constellationCap, .codeRateCap = (int)halInfo.frontendCaps.dvbtCaps().coderateCap, .hierarchyCap = (int)halInfo.frontendCaps.dvbtCaps().hierarchyCap, .guardIntervalCap = (int)halInfo.frontendCaps.dvbtCaps().guardIntervalCap, .isT2Supported = (bool)halInfo.frontendCaps.dvbtCaps().isT2Supported, .isMisoSupported = (bool)halInfo.frontendCaps.dvbtCaps().isMisoSupported, }; caps.set<TunerFrontendCapabilities::dvbtCaps>(dvbtCaps); break; } case FrontendType::ISDBS: { TunerFrontendIsdbsCapabilities isdbsCaps{ .modulationCap = (int)halInfo.frontendCaps.isdbsCaps().modulationCap, .codeRateCap = (int)halInfo.frontendCaps.isdbsCaps().coderateCap, }; caps.set<TunerFrontendCapabilities::isdbsCaps>(isdbsCaps); break; } case FrontendType::ISDBS3: { TunerFrontendIsdbs3Capabilities isdbs3Caps{ .modulationCap = (int)halInfo.frontendCaps.isdbs3Caps().modulationCap, .codeRateCap = (int)halInfo.frontendCaps.isdbs3Caps().coderateCap, }; caps.set<TunerFrontendCapabilities::isdbs3Caps>(isdbs3Caps); break; } case FrontendType::ISDBT: { TunerFrontendIsdbtCapabilities isdbtCaps{ .modeCap = (int)halInfo.frontendCaps.isdbtCaps().modeCap, .bandwidthCap = (int)halInfo.frontendCaps.isdbtCaps().bandwidthCap, .modulationCap = (int)halInfo.frontendCaps.isdbtCaps().modulationCap, .codeRateCap = (int)halInfo.frontendCaps.isdbtCaps().coderateCap, .guardIntervalCap = (int)halInfo.frontendCaps.isdbtCaps().guardIntervalCap, }; caps.set<TunerFrontendCapabilities::isdbtCaps>(isdbtCaps); break; } default: break; } info.caps = caps; return info; } int TunerService::getResourceIdFromHandle(int resourceHandle) { return (resourceHandle & 0x00ff0000) >> 16; } } // namespace android
services/tuner/TunerService.h +7 −0 Original line number Diff line number Diff line Loading @@ -18,10 +18,13 @@ #define ANDROID_MEDIA_TUNERSERVICE_H #include <aidl/android/media/tv/tuner/BnTunerService.h> #include <aidl/android/media/tv/tuner/TunerServiceFrontendInfo.h> #include <android/hardware/tv/tuner/1.0/ITuner.h> using Status = ::ndk::ScopedAStatus; using ::aidl::android::media::tv::tuner::BnTunerService; using ::aidl::android::media::tv::tuner::TunerServiceFrontendInfo; using ::android::hardware::tv::tuner::V1_0::FrontendInfo; using ::android::hardware::tv::tuner::V1_0::ITuner; namespace android { Loading @@ -34,9 +37,13 @@ public: TunerService(); virtual ~TunerService(); Status getFrontendIds(std::vector<int32_t>* ids, int32_t* _aidl_return) override; Status getFrontendInfo(int32_t frontendHandle, TunerServiceFrontendInfo* _aidl_return) override; private: static sp<ITuner> mTuner; int getResourceIdFromHandle(int resourceHandle); TunerServiceFrontendInfo convertToAidlFrontendInfo(int feId, FrontendInfo halInfo); }; } // namespace android Loading
services/tuner/aidl/android/media/tv/tuner/ITunerService.aidl +10 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package android.media.tv.tuner; import android.media.tv.tuner.TunerServiceFrontendInfo; /** * TunerService interface handles tuner related operations. * Loading @@ -29,4 +31,12 @@ interface ITunerService { * @return the result code of the operation. */ int getFrontendIds(out int[] ids); /** * Retrieve the frontend's information. * * @param frontendHandle the handle of the frontend granted by TRM. * @return the information for the frontend. */ TunerServiceFrontendInfo getFrontendInfo(in int frontendHandle); }