Loading services/tuner/Android.bp +4 −0 Original line number Diff line number Diff line Loading @@ -79,6 +79,8 @@ cc_library { "libmedia", "libutils", "tv_tuner_aidl_interface-ndk_platform", "tv_tuner_resource_manager_aidl_interface-ndk_platform", "tv_tuner_resource_manager_aidl_interface-cpp", ], static_libs: [ Loading Loading @@ -113,6 +115,8 @@ cc_binary { "liblog", "libtunerservice", "libutils", "tv_tuner_resource_manager_aidl_interface-ndk_platform", "tv_tuner_resource_manager_aidl_interface-cpp", ], static_libs: [ Loading services/tuner/TunerService.cpp +100 −23 Original line number Diff line number Diff line Loading @@ -34,7 +34,6 @@ 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::DemuxFilterAvSettings; using ::android::hardware::tv::tuner::V1_0::DemuxFilterMainType; using ::android::hardware::tv::tuner::V1_0::DemuxFilterSettings; Loading Loading @@ -77,13 +76,10 @@ Status TunerService::openDemux( if (!getITuner()) { return Status::fromServiceSpecificError(static_cast<int32_t>(Result::NOT_INITIALIZED)); } if (mDemux != nullptr) { *_aidl_return = mDemux->ref<ITunerDemux>(); return Status::ok(); } Result res; uint32_t id; sp<IDemux> demuxSp = nullptr; shared_ptr<ITunerDemux> tunerDemux = nullptr; mTuner->openDemux([&](Result r, uint32_t demuxId, const sp<IDemux>& demux) { demuxSp = demux; id = demuxId; Loading @@ -91,13 +87,12 @@ Status TunerService::openDemux( ALOGD("open demux, id = %d", demuxId); }); if (res == Result::SUCCESS) { mDemux = ::ndk::SharedRefBase::make<TunerDemux>(demuxSp, id); *_aidl_return = mDemux->ref<ITunerDemux>(); tunerDemux = ::ndk::SharedRefBase::make<TunerDemux>(demuxSp, id); *_aidl_return = tunerDemux->ref<ITunerDemux>(); return Status::ok(); } ALOGD("open demux failed, res = %d", res); mDemux = nullptr; return Status::fromServiceSpecificError(static_cast<int32_t>(res)); } Loading Loading @@ -141,17 +136,13 @@ Result TunerService::configFilter() { return getQueueDescResult; } Status TunerService::getFrontendIds(vector<int32_t>* ids, int32_t* /* _aidl_return */) { Status TunerService::getFrontendIds(vector<int32_t>* ids) { if (!getITuner()) { return Status::fromServiceSpecificError( static_cast<int32_t>(Result::NOT_INITIALIZED)); } hidl_vec<FrontendId> feIds; Result res; mTuner->getFrontendIds([&](Result r, const hidl_vec<FrontendId>& frontendIds) { feIds = frontendIds; res = r; }); Result res = getHidlFrontendIds(feIds); if (res != Result::SUCCESS) { return Status::fromServiceSpecificError(static_cast<int32_t>(res)); } Loading @@ -169,13 +160,9 @@ Status TunerService::getFrontendInfo( static_cast<int32_t>(Result::UNAVAILABLE)); } Result res; FrontendInfo info; int feId = getResourceIdFromHandle(frontendHandle, FRONTEND); mTuner->getFrontendInfo(feId, [&](Result r, const FrontendInfo& feInfo) { info = feInfo; res = r; }); Result res = getHidlFrontendInfo(feId, info); if (res != Result::SUCCESS) { return Status::fromServiceSpecificError(static_cast<int32_t>(res)); } Loading Loading @@ -224,8 +211,8 @@ Status TunerService::getFmqSyncReadWrite( } Status TunerService::openLnb(int lnbHandle, shared_ptr<ITunerLnb>* _aidl_return) { if (mTuner == nullptr) { ALOGE("ITuner service is not init."); if (!getITuner()) { ALOGD("get ITuner failed"); return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE)); } Loading @@ -245,8 +232,8 @@ Status TunerService::openLnb(int lnbHandle, shared_ptr<ITunerLnb>* _aidl_return) } Status TunerService::openLnbByName(const string& lnbName, shared_ptr<ITunerLnb>* _aidl_return) { if (mTuner == nullptr) { ALOGE("ITuner service is not init."); if (!getITuner()) { ALOGE("get ITuner failed"); return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE)); } Loading @@ -266,6 +253,96 @@ Status TunerService::openLnbByName(const string& lnbName, shared_ptr<ITunerLnb>* return Status::ok(); } Status TunerService::updateTunerResources() { if (!getITuner()) { return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE)); } // Connect with Tuner Resource Manager. ::ndk::SpAIBinder binder(AServiceManager_getService("tv_tuner_resource_mgr")); mTunerResourceManager = ITunerResourceManager::fromBinder(binder); updateFrontendResources(); updateLnbResources(); // TODO: update Demux, Descrambler. return Status::ok(); } void TunerService::updateFrontendResources() { hidl_vec<FrontendId> ids; Result res = getHidlFrontendIds(ids); if (res != Result::SUCCESS) { return; } vector<TunerFrontendInfo> infos; for (int i = 0; i < ids.size(); i++) { FrontendInfo frontendInfo; Result res = getHidlFrontendInfo((int)ids[i], frontendInfo); if (res != Result::SUCCESS) { continue; } TunerFrontendInfo tunerFrontendInfo{ .handle = getResourceHandleFromId((int)ids[i], FRONTEND), .type = static_cast<int>(frontendInfo.type), .exclusiveGroupId = static_cast<int>(frontendInfo.exclusiveGroupId), }; infos.push_back(tunerFrontendInfo); } mTunerResourceManager->setFrontendInfoList(infos); } void TunerService::updateLnbResources() { vector<int> handles = getLnbHandles(); if (handles.size() == 0) { return; } mTunerResourceManager->setLnbInfoList(handles); } vector<int> TunerService::getLnbHandles() { vector<int> lnbHandles; if (mTuner != NULL) { Result res; vector<LnbId> lnbIds; mTuner->getLnbIds([&](Result r, const hardware::hidl_vec<LnbId>& ids) { lnbIds = ids; res = r; }); if (res != Result::SUCCESS || lnbIds.size() == 0) { } else { for (int i = 0; i < lnbIds.size(); i++) { lnbHandles.push_back(getResourceHandleFromId((int)lnbIds[i], LNB)); } } } return lnbHandles; } Result TunerService::getHidlFrontendIds(hidl_vec<FrontendId>& ids) { if (mTuner == NULL) { return Result::NOT_INITIALIZED; } Result res; mTuner->getFrontendIds([&](Result r, const hidl_vec<FrontendId>& frontendIds) { ids = frontendIds; res = r; }); return res; } Result TunerService::getHidlFrontendInfo(int id, FrontendInfo& info) { if (mTuner == NULL) { return Result::NOT_INITIALIZED; } Result res; mTuner->getFrontendInfo(id, [&](Result r, const FrontendInfo& feInfo) { info = feInfo; res = r; }); return res; } TunerFrontendInfo TunerService::convertToAidlFrontendInfo(FrontendInfo halInfo) { TunerFrontendInfo info{ .type = (int)halInfo.type, Loading services/tuner/TunerService.h +25 −4 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ #ifndef ANDROID_MEDIA_TUNERSERVICE_H #define ANDROID_MEDIA_TUNERSERVICE_H #include <aidl/android/media/tv/tunerresourcemanager/ITunerResourceManager.h> #include <aidl/android/media/tv/tuner/BnTunerService.h> #include <android/hardware/tv/tuner/1.0/ITuner.h> #include <fmq/AidlMessageQueue.h> Loading @@ -31,10 +32,12 @@ using ::aidl::android::media::tv::tuner::ITunerDemux; using ::aidl::android::media::tv::tuner::ITunerFrontend; using ::aidl::android::media::tv::tuner::ITunerLnb; using ::aidl::android::media::tv::tuner::TunerFrontendInfo; using ::aidl::android::media::tv::tunerresourcemanager::ITunerResourceManager; using ::android::hardware::details::logError; using ::android::hardware::EventFlag; using ::android::hardware::hidl_vec; using ::android::hardware::kSynchronizedReadWrite; using ::android::hardware::EventFlag; using ::android::hardware::MessageQueue; using ::android::hardware::MQDescriptorSync; using ::android::hardware::Return; Loading Loading @@ -94,7 +97,14 @@ public: return (resourceHandle & 0x00ff0000) >> 16; } Status getFrontendIds(vector<int32_t>* ids, int32_t* _aidl_return) override; int getResourceHandleFromId(int id, int resourceType) { // TODO: build up randomly generated id to handle mapping return (resourceType & 0x000000ff) << 24 | (id << 16) | (mResourceRequestCount++ & 0xffff); } Status getFrontendIds(vector<int32_t>* ids) override; Status getFrontendInfo(int32_t frontendHandle, TunerFrontendInfo* _aidl_return) override; Status openFrontend( int32_t frontendHandle, shared_ptr<ITunerFrontend>* _aidl_return) override; Loading @@ -103,19 +113,30 @@ public: Status openLnb(int lnbHandle, shared_ptr<ITunerLnb>* _aidl_return) override; Status openLnbByName(const string& lnbName, shared_ptr<ITunerLnb>* _aidl_return) override; Status openDemux(int32_t demuxHandle, std::shared_ptr<ITunerDemux>* _aidl_return) override; Status updateTunerResources() override; private: bool getITuner(); Result configFilter(); void updateFrontendResources(); void updateLnbResources(); Result getHidlFrontendIds(hidl_vec<FrontendId>& ids); Result getHidlFrontendInfo(int id, FrontendInfo& info); vector<int> getLnbHandles(); TunerFrontendInfo convertToAidlFrontendInfo(FrontendInfo halInfo); sp<ITuner> mTuner; std::shared_ptr<ITunerDemux> mDemux; sp<IFilter> mFilter; shared_ptr<ITunerResourceManager> mTunerResourceManager; int mResourceRequestCount = 0; AidlMessageQueue* mAidlMq; MQDescriptorSync<uint8_t> mFilterMQDesc; AidlMQDesc mAidlMQDesc; EventFlag* mEventFlag; TunerFrontendInfo convertToAidlFrontendInfo(FrontendInfo halInfo); }; } // namespace android Loading services/tuner/aidl/android/media/tv/tuner/ITunerService.aidl +7 −3 Original line number Diff line number Diff line Loading @@ -34,10 +34,8 @@ interface ITunerService { /** * Gets frontend IDs. * * @return the result code of the operation. */ int getFrontendIds(out int[] ids); void getFrontendIds(out int[] ids); /** * Retrieve the frontend's information. Loading Loading @@ -82,4 +80,10 @@ interface ITunerService { * Create a new instance of Demux. */ ITunerDemux openDemux(in int demuxHandle); /** * Update Tuner Resources in TunerResourceManager. */ // TODO: b/178124017 update TRM in TunerService independently. void updateTunerResources(); } services/tuner/mediatuner.rc +1 −2 Original line number Diff line number Diff line service media.tuner /system/bin/mediatuner class main user media group media ioprio rt 4 task_profiles ProcessCapacityHigh HighPerformance Loading
services/tuner/Android.bp +4 −0 Original line number Diff line number Diff line Loading @@ -79,6 +79,8 @@ cc_library { "libmedia", "libutils", "tv_tuner_aidl_interface-ndk_platform", "tv_tuner_resource_manager_aidl_interface-ndk_platform", "tv_tuner_resource_manager_aidl_interface-cpp", ], static_libs: [ Loading Loading @@ -113,6 +115,8 @@ cc_binary { "liblog", "libtunerservice", "libutils", "tv_tuner_resource_manager_aidl_interface-ndk_platform", "tv_tuner_resource_manager_aidl_interface-cpp", ], static_libs: [ Loading
services/tuner/TunerService.cpp +100 −23 Original line number Diff line number Diff line Loading @@ -34,7 +34,6 @@ 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::DemuxFilterAvSettings; using ::android::hardware::tv::tuner::V1_0::DemuxFilterMainType; using ::android::hardware::tv::tuner::V1_0::DemuxFilterSettings; Loading Loading @@ -77,13 +76,10 @@ Status TunerService::openDemux( if (!getITuner()) { return Status::fromServiceSpecificError(static_cast<int32_t>(Result::NOT_INITIALIZED)); } if (mDemux != nullptr) { *_aidl_return = mDemux->ref<ITunerDemux>(); return Status::ok(); } Result res; uint32_t id; sp<IDemux> demuxSp = nullptr; shared_ptr<ITunerDemux> tunerDemux = nullptr; mTuner->openDemux([&](Result r, uint32_t demuxId, const sp<IDemux>& demux) { demuxSp = demux; id = demuxId; Loading @@ -91,13 +87,12 @@ Status TunerService::openDemux( ALOGD("open demux, id = %d", demuxId); }); if (res == Result::SUCCESS) { mDemux = ::ndk::SharedRefBase::make<TunerDemux>(demuxSp, id); *_aidl_return = mDemux->ref<ITunerDemux>(); tunerDemux = ::ndk::SharedRefBase::make<TunerDemux>(demuxSp, id); *_aidl_return = tunerDemux->ref<ITunerDemux>(); return Status::ok(); } ALOGD("open demux failed, res = %d", res); mDemux = nullptr; return Status::fromServiceSpecificError(static_cast<int32_t>(res)); } Loading Loading @@ -141,17 +136,13 @@ Result TunerService::configFilter() { return getQueueDescResult; } Status TunerService::getFrontendIds(vector<int32_t>* ids, int32_t* /* _aidl_return */) { Status TunerService::getFrontendIds(vector<int32_t>* ids) { if (!getITuner()) { return Status::fromServiceSpecificError( static_cast<int32_t>(Result::NOT_INITIALIZED)); } hidl_vec<FrontendId> feIds; Result res; mTuner->getFrontendIds([&](Result r, const hidl_vec<FrontendId>& frontendIds) { feIds = frontendIds; res = r; }); Result res = getHidlFrontendIds(feIds); if (res != Result::SUCCESS) { return Status::fromServiceSpecificError(static_cast<int32_t>(res)); } Loading @@ -169,13 +160,9 @@ Status TunerService::getFrontendInfo( static_cast<int32_t>(Result::UNAVAILABLE)); } Result res; FrontendInfo info; int feId = getResourceIdFromHandle(frontendHandle, FRONTEND); mTuner->getFrontendInfo(feId, [&](Result r, const FrontendInfo& feInfo) { info = feInfo; res = r; }); Result res = getHidlFrontendInfo(feId, info); if (res != Result::SUCCESS) { return Status::fromServiceSpecificError(static_cast<int32_t>(res)); } Loading Loading @@ -224,8 +211,8 @@ Status TunerService::getFmqSyncReadWrite( } Status TunerService::openLnb(int lnbHandle, shared_ptr<ITunerLnb>* _aidl_return) { if (mTuner == nullptr) { ALOGE("ITuner service is not init."); if (!getITuner()) { ALOGD("get ITuner failed"); return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE)); } Loading @@ -245,8 +232,8 @@ Status TunerService::openLnb(int lnbHandle, shared_ptr<ITunerLnb>* _aidl_return) } Status TunerService::openLnbByName(const string& lnbName, shared_ptr<ITunerLnb>* _aidl_return) { if (mTuner == nullptr) { ALOGE("ITuner service is not init."); if (!getITuner()) { ALOGE("get ITuner failed"); return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE)); } Loading @@ -266,6 +253,96 @@ Status TunerService::openLnbByName(const string& lnbName, shared_ptr<ITunerLnb>* return Status::ok(); } Status TunerService::updateTunerResources() { if (!getITuner()) { return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE)); } // Connect with Tuner Resource Manager. ::ndk::SpAIBinder binder(AServiceManager_getService("tv_tuner_resource_mgr")); mTunerResourceManager = ITunerResourceManager::fromBinder(binder); updateFrontendResources(); updateLnbResources(); // TODO: update Demux, Descrambler. return Status::ok(); } void TunerService::updateFrontendResources() { hidl_vec<FrontendId> ids; Result res = getHidlFrontendIds(ids); if (res != Result::SUCCESS) { return; } vector<TunerFrontendInfo> infos; for (int i = 0; i < ids.size(); i++) { FrontendInfo frontendInfo; Result res = getHidlFrontendInfo((int)ids[i], frontendInfo); if (res != Result::SUCCESS) { continue; } TunerFrontendInfo tunerFrontendInfo{ .handle = getResourceHandleFromId((int)ids[i], FRONTEND), .type = static_cast<int>(frontendInfo.type), .exclusiveGroupId = static_cast<int>(frontendInfo.exclusiveGroupId), }; infos.push_back(tunerFrontendInfo); } mTunerResourceManager->setFrontendInfoList(infos); } void TunerService::updateLnbResources() { vector<int> handles = getLnbHandles(); if (handles.size() == 0) { return; } mTunerResourceManager->setLnbInfoList(handles); } vector<int> TunerService::getLnbHandles() { vector<int> lnbHandles; if (mTuner != NULL) { Result res; vector<LnbId> lnbIds; mTuner->getLnbIds([&](Result r, const hardware::hidl_vec<LnbId>& ids) { lnbIds = ids; res = r; }); if (res != Result::SUCCESS || lnbIds.size() == 0) { } else { for (int i = 0; i < lnbIds.size(); i++) { lnbHandles.push_back(getResourceHandleFromId((int)lnbIds[i], LNB)); } } } return lnbHandles; } Result TunerService::getHidlFrontendIds(hidl_vec<FrontendId>& ids) { if (mTuner == NULL) { return Result::NOT_INITIALIZED; } Result res; mTuner->getFrontendIds([&](Result r, const hidl_vec<FrontendId>& frontendIds) { ids = frontendIds; res = r; }); return res; } Result TunerService::getHidlFrontendInfo(int id, FrontendInfo& info) { if (mTuner == NULL) { return Result::NOT_INITIALIZED; } Result res; mTuner->getFrontendInfo(id, [&](Result r, const FrontendInfo& feInfo) { info = feInfo; res = r; }); return res; } TunerFrontendInfo TunerService::convertToAidlFrontendInfo(FrontendInfo halInfo) { TunerFrontendInfo info{ .type = (int)halInfo.type, Loading
services/tuner/TunerService.h +25 −4 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ #ifndef ANDROID_MEDIA_TUNERSERVICE_H #define ANDROID_MEDIA_TUNERSERVICE_H #include <aidl/android/media/tv/tunerresourcemanager/ITunerResourceManager.h> #include <aidl/android/media/tv/tuner/BnTunerService.h> #include <android/hardware/tv/tuner/1.0/ITuner.h> #include <fmq/AidlMessageQueue.h> Loading @@ -31,10 +32,12 @@ using ::aidl::android::media::tv::tuner::ITunerDemux; using ::aidl::android::media::tv::tuner::ITunerFrontend; using ::aidl::android::media::tv::tuner::ITunerLnb; using ::aidl::android::media::tv::tuner::TunerFrontendInfo; using ::aidl::android::media::tv::tunerresourcemanager::ITunerResourceManager; using ::android::hardware::details::logError; using ::android::hardware::EventFlag; using ::android::hardware::hidl_vec; using ::android::hardware::kSynchronizedReadWrite; using ::android::hardware::EventFlag; using ::android::hardware::MessageQueue; using ::android::hardware::MQDescriptorSync; using ::android::hardware::Return; Loading Loading @@ -94,7 +97,14 @@ public: return (resourceHandle & 0x00ff0000) >> 16; } Status getFrontendIds(vector<int32_t>* ids, int32_t* _aidl_return) override; int getResourceHandleFromId(int id, int resourceType) { // TODO: build up randomly generated id to handle mapping return (resourceType & 0x000000ff) << 24 | (id << 16) | (mResourceRequestCount++ & 0xffff); } Status getFrontendIds(vector<int32_t>* ids) override; Status getFrontendInfo(int32_t frontendHandle, TunerFrontendInfo* _aidl_return) override; Status openFrontend( int32_t frontendHandle, shared_ptr<ITunerFrontend>* _aidl_return) override; Loading @@ -103,19 +113,30 @@ public: Status openLnb(int lnbHandle, shared_ptr<ITunerLnb>* _aidl_return) override; Status openLnbByName(const string& lnbName, shared_ptr<ITunerLnb>* _aidl_return) override; Status openDemux(int32_t demuxHandle, std::shared_ptr<ITunerDemux>* _aidl_return) override; Status updateTunerResources() override; private: bool getITuner(); Result configFilter(); void updateFrontendResources(); void updateLnbResources(); Result getHidlFrontendIds(hidl_vec<FrontendId>& ids); Result getHidlFrontendInfo(int id, FrontendInfo& info); vector<int> getLnbHandles(); TunerFrontendInfo convertToAidlFrontendInfo(FrontendInfo halInfo); sp<ITuner> mTuner; std::shared_ptr<ITunerDemux> mDemux; sp<IFilter> mFilter; shared_ptr<ITunerResourceManager> mTunerResourceManager; int mResourceRequestCount = 0; AidlMessageQueue* mAidlMq; MQDescriptorSync<uint8_t> mFilterMQDesc; AidlMQDesc mAidlMQDesc; EventFlag* mEventFlag; TunerFrontendInfo convertToAidlFrontendInfo(FrontendInfo halInfo); }; } // namespace android Loading
services/tuner/aidl/android/media/tv/tuner/ITunerService.aidl +7 −3 Original line number Diff line number Diff line Loading @@ -34,10 +34,8 @@ interface ITunerService { /** * Gets frontend IDs. * * @return the result code of the operation. */ int getFrontendIds(out int[] ids); void getFrontendIds(out int[] ids); /** * Retrieve the frontend's information. Loading Loading @@ -82,4 +80,10 @@ interface ITunerService { * Create a new instance of Demux. */ ITunerDemux openDemux(in int demuxHandle); /** * Update Tuner Resources in TunerResourceManager. */ // TODO: b/178124017 update TRM in TunerService independently. void updateTunerResources(); }
services/tuner/mediatuner.rc +1 −2 Original line number Diff line number Diff line service media.tuner /system/bin/mediatuner class main user media group media ioprio rt 4 task_profiles ProcessCapacityHigh HighPerformance