1 /* 2 * Copyright 2021 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #define LOG_TAG "DemuxClient" 18 19 #include "DemuxClient.h" 20 21 #include <aidl/android/hardware/tv/tuner/Constant.h> 22 #include <aidl/android/hardware/tv/tuner/Constant64Bit.h> 23 #include <android-base/logging.h> 24 #include <utils/Log.h> 25 26 using ::aidl::android::hardware::tv::tuner::Constant; 27 using ::aidl::android::hardware::tv::tuner::Constant64Bit; 28 29 namespace android { 30 /////////////// DemuxClient /////////////////////// DemuxClient(shared_ptr<ITunerDemux> tunerDemux)31 DemuxClient::DemuxClient(shared_ptr<ITunerDemux> tunerDemux) { 32 mTunerDemux = tunerDemux; 33 } 34 ~DemuxClient()35 DemuxClient::~DemuxClient() { 36 mTunerDemux = nullptr; 37 } 38 setFrontendDataSource(sp<FrontendClient> frontendClient)39 Result DemuxClient::setFrontendDataSource(sp<FrontendClient> frontendClient) { 40 if (frontendClient == nullptr) { 41 return Result::INVALID_ARGUMENT; 42 } 43 44 if (mTunerDemux != nullptr) { 45 Status s = mTunerDemux->setFrontendDataSource(frontendClient->getAidlFrontend()); 46 return ClientHelper::getServiceSpecificErrorCode(s); 47 } 48 49 return Result::INVALID_STATE; 50 } 51 setFrontendDataSourceById(int frontendId)52 Result DemuxClient::setFrontendDataSourceById(int frontendId) { 53 if (mTunerDemux != nullptr) { 54 Status s = mTunerDemux->setFrontendDataSourceById(frontendId); 55 return ClientHelper::getServiceSpecificErrorCode(s); 56 } 57 58 return Result::INVALID_STATE; 59 } 60 openFilter(const DemuxFilterType & type,int32_t bufferSize,sp<FilterClientCallback> cb)61 sp<FilterClient> DemuxClient::openFilter(const DemuxFilterType& type, int32_t bufferSize, 62 sp<FilterClientCallback> cb) { 63 if (cb == nullptr) { 64 return nullptr; 65 } 66 67 if (mTunerDemux != nullptr) { 68 shared_ptr<ITunerFilter> tunerFilter; 69 shared_ptr<TunerFilterCallback> callback = 70 ::ndk::SharedRefBase::make<TunerFilterCallback>(cb); 71 Status s = mTunerDemux->openFilter(type, bufferSize, callback, &tunerFilter); 72 if (!s.isOk()) { 73 return nullptr; 74 } 75 return new FilterClient(type, tunerFilter); 76 } 77 78 return nullptr; 79 } 80 openTimeFilter()81 sp<TimeFilterClient> DemuxClient::openTimeFilter() { 82 if (mTunerDemux != nullptr) { 83 shared_ptr<ITunerTimeFilter> tunerTimeFilter; 84 Status s = mTunerDemux->openTimeFilter(&tunerTimeFilter); 85 if (!s.isOk()) { 86 return nullptr; 87 } 88 return new TimeFilterClient(tunerTimeFilter); 89 } 90 91 return nullptr; 92 } 93 getAvSyncHwId(sp<FilterClient> filterClient)94 int32_t DemuxClient::getAvSyncHwId(sp<FilterClient> filterClient) { 95 if (filterClient == nullptr) { 96 return static_cast<int32_t>(Constant::INVALID_AV_SYNC_ID); 97 } 98 99 if (mTunerDemux != nullptr) { 100 int32_t hwId; 101 Status s = mTunerDemux->getAvSyncHwId(filterClient->getAidlFilter(), &hwId); 102 if (!s.isOk()) { 103 return static_cast<int32_t>(Constant::INVALID_AV_SYNC_ID); 104 } 105 return hwId; 106 } 107 108 return static_cast<int32_t>(Constant::INVALID_AV_SYNC_ID); 109 } 110 getAvSyncTime(int32_t avSyncHwId)111 int64_t DemuxClient::getAvSyncTime(int32_t avSyncHwId) { 112 if (mTunerDemux != nullptr) { 113 int64_t time; 114 Status s = mTunerDemux->getAvSyncTime(avSyncHwId, &time); 115 if (!s.isOk()) { 116 return static_cast<int64_t>(Constant64Bit::INVALID_PRESENTATION_TIME_STAMP); 117 } 118 return time; 119 } 120 121 return static_cast<int64_t>(Constant64Bit::INVALID_PRESENTATION_TIME_STAMP); 122 } 123 openDvr(DvrType dvbType,int32_t bufferSize,sp<DvrClientCallback> cb)124 sp<DvrClient> DemuxClient::openDvr(DvrType dvbType, int32_t bufferSize, sp<DvrClientCallback> cb) { 125 if (cb == nullptr) { 126 return nullptr; 127 } 128 129 if (mTunerDemux != nullptr) { 130 shared_ptr<ITunerDvr> tunerDvr; 131 shared_ptr<TunerDvrCallback> callback = 132 ::ndk::SharedRefBase::make<TunerDvrCallback>(cb); 133 Status s = mTunerDemux->openDvr(dvbType, bufferSize, callback, &tunerDvr); 134 if (!s.isOk()) { 135 return nullptr; 136 } 137 return new DvrClient(tunerDvr); 138 } 139 140 return nullptr; 141 } 142 connectCiCam(int32_t ciCamId)143 Result DemuxClient::connectCiCam(int32_t ciCamId) { 144 if (mTunerDemux != nullptr) { 145 Status s = mTunerDemux->connectCiCam(ciCamId); 146 return ClientHelper::getServiceSpecificErrorCode(s); 147 } 148 149 return Result::INVALID_STATE; 150 } 151 disconnectCiCam()152 Result DemuxClient::disconnectCiCam() { 153 if (mTunerDemux != nullptr) { 154 Status s = mTunerDemux->disconnectCiCam(); 155 return ClientHelper::getServiceSpecificErrorCode(s); 156 } 157 158 return Result::INVALID_STATE; 159 } 160 close()161 Result DemuxClient::close() { 162 if (mTunerDemux != nullptr) { 163 Status s = mTunerDemux->close(); 164 mTunerDemux = nullptr; 165 return ClientHelper::getServiceSpecificErrorCode(s); 166 } 167 168 return Result::INVALID_STATE; 169 } 170 171 } // namespace android 172