1*ec779b8eSAndroid Build Coastguard Worker /**
2*ec779b8eSAndroid Build Coastguard Worker * Copyright 2021, The Android Open Source Project
3*ec779b8eSAndroid Build Coastguard Worker *
4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*ec779b8eSAndroid Build Coastguard Worker *
8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*ec779b8eSAndroid Build Coastguard Worker *
10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License.
15*ec779b8eSAndroid Build Coastguard Worker */
16*ec779b8eSAndroid Build Coastguard Worker
17*ec779b8eSAndroid Build Coastguard Worker #define LOG_TAG "TunerHidlDvr"
18*ec779b8eSAndroid Build Coastguard Worker
19*ec779b8eSAndroid Build Coastguard Worker #include "TunerHidlDvr.h"
20*ec779b8eSAndroid Build Coastguard Worker
21*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/hardware/tv/tuner/DataFormat.h>
22*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/hardware/tv/tuner/PlaybackStatus.h>
23*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/hardware/tv/tuner/RecordStatus.h>
24*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/hardware/tv/tuner/Result.h>
25*ec779b8eSAndroid Build Coastguard Worker #include <fmq/ConvertMQDescriptors.h>
26*ec779b8eSAndroid Build Coastguard Worker
27*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::tv::tuner::DataFormat;
28*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::tv::tuner::PlaybackStatus;
29*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::tv::tuner::RecordStatus;
30*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::tv::tuner::Result;
31*ec779b8eSAndroid Build Coastguard Worker using ::android::unsafeHidlToAidlMQDescriptor;
32*ec779b8eSAndroid Build Coastguard Worker using ::android::hardware::MessageQueue;
33*ec779b8eSAndroid Build Coastguard Worker using ::android::hardware::MQDescriptorSync;
34*ec779b8eSAndroid Build Coastguard Worker
35*ec779b8eSAndroid Build Coastguard Worker using HidlDataFormat = ::android::hardware::tv::tuner::V1_0::DataFormat;
36*ec779b8eSAndroid Build Coastguard Worker using HidlResult = ::android::hardware::tv::tuner::V1_0::Result;
37*ec779b8eSAndroid Build Coastguard Worker using MQDesc = MQDescriptorSync<uint8_t>;
38*ec779b8eSAndroid Build Coastguard Worker
39*ec779b8eSAndroid Build Coastguard Worker using namespace std;
40*ec779b8eSAndroid Build Coastguard Worker
41*ec779b8eSAndroid Build Coastguard Worker namespace aidl {
42*ec779b8eSAndroid Build Coastguard Worker namespace android {
43*ec779b8eSAndroid Build Coastguard Worker namespace media {
44*ec779b8eSAndroid Build Coastguard Worker namespace tv {
45*ec779b8eSAndroid Build Coastguard Worker namespace tuner {
46*ec779b8eSAndroid Build Coastguard Worker
TunerHidlDvr(sp<HidlIDvr> dvr,DvrType type)47*ec779b8eSAndroid Build Coastguard Worker TunerHidlDvr::TunerHidlDvr(sp<HidlIDvr> dvr, DvrType type) {
48*ec779b8eSAndroid Build Coastguard Worker mDvr = dvr;
49*ec779b8eSAndroid Build Coastguard Worker mType = type;
50*ec779b8eSAndroid Build Coastguard Worker }
51*ec779b8eSAndroid Build Coastguard Worker
~TunerHidlDvr()52*ec779b8eSAndroid Build Coastguard Worker TunerHidlDvr::~TunerHidlDvr() {
53*ec779b8eSAndroid Build Coastguard Worker mDvr = nullptr;
54*ec779b8eSAndroid Build Coastguard Worker }
55*ec779b8eSAndroid Build Coastguard Worker
getQueueDesc(AidlMQDesc * _aidl_return)56*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerHidlDvr::getQueueDesc(AidlMQDesc* _aidl_return) {
57*ec779b8eSAndroid Build Coastguard Worker MQDesc dvrMQDesc;
58*ec779b8eSAndroid Build Coastguard Worker HidlResult res;
59*ec779b8eSAndroid Build Coastguard Worker mDvr->getQueueDesc([&](HidlResult r, const MQDesc& desc) {
60*ec779b8eSAndroid Build Coastguard Worker dvrMQDesc = desc;
61*ec779b8eSAndroid Build Coastguard Worker res = r;
62*ec779b8eSAndroid Build Coastguard Worker });
63*ec779b8eSAndroid Build Coastguard Worker if (res != HidlResult::SUCCESS) {
64*ec779b8eSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
65*ec779b8eSAndroid Build Coastguard Worker }
66*ec779b8eSAndroid Build Coastguard Worker
67*ec779b8eSAndroid Build Coastguard Worker AidlMQDesc aidlMQDesc;
68*ec779b8eSAndroid Build Coastguard Worker unsafeHidlToAidlMQDescriptor<uint8_t, int8_t, SynchronizedReadWrite>(dvrMQDesc, &aidlMQDesc);
69*ec779b8eSAndroid Build Coastguard Worker *_aidl_return = std::move(aidlMQDesc);
70*ec779b8eSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::ok();
71*ec779b8eSAndroid Build Coastguard Worker }
72*ec779b8eSAndroid Build Coastguard Worker
configure(const DvrSettings & in_settings)73*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerHidlDvr::configure(const DvrSettings& in_settings) {
74*ec779b8eSAndroid Build Coastguard Worker HidlResult res = mDvr->configure(getHidlDvrSettings(in_settings));
75*ec779b8eSAndroid Build Coastguard Worker if (res != HidlResult::SUCCESS) {
76*ec779b8eSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
77*ec779b8eSAndroid Build Coastguard Worker }
78*ec779b8eSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::ok();
79*ec779b8eSAndroid Build Coastguard Worker }
80*ec779b8eSAndroid Build Coastguard Worker
attachFilter(const shared_ptr<ITunerFilter> & in_filter)81*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerHidlDvr::attachFilter(const shared_ptr<ITunerFilter>& in_filter) {
82*ec779b8eSAndroid Build Coastguard Worker if (in_filter == nullptr) {
83*ec779b8eSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::fromServiceSpecificError(
84*ec779b8eSAndroid Build Coastguard Worker static_cast<int32_t>(Result::INVALID_ARGUMENT));
85*ec779b8eSAndroid Build Coastguard Worker }
86*ec779b8eSAndroid Build Coastguard Worker
87*ec779b8eSAndroid Build Coastguard Worker sp<HidlIFilter> hidlFilter = static_cast<TunerHidlFilter*>(in_filter.get())->getHalFilter();
88*ec779b8eSAndroid Build Coastguard Worker if (hidlFilter == nullptr) {
89*ec779b8eSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::fromServiceSpecificError(
90*ec779b8eSAndroid Build Coastguard Worker static_cast<int32_t>(Result::INVALID_ARGUMENT));
91*ec779b8eSAndroid Build Coastguard Worker }
92*ec779b8eSAndroid Build Coastguard Worker
93*ec779b8eSAndroid Build Coastguard Worker HidlResult res = mDvr->attachFilter(hidlFilter);
94*ec779b8eSAndroid Build Coastguard Worker if (res != HidlResult::SUCCESS) {
95*ec779b8eSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
96*ec779b8eSAndroid Build Coastguard Worker }
97*ec779b8eSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::ok();
98*ec779b8eSAndroid Build Coastguard Worker }
99*ec779b8eSAndroid Build Coastguard Worker
detachFilter(const shared_ptr<ITunerFilter> & in_filter)100*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerHidlDvr::detachFilter(const shared_ptr<ITunerFilter>& in_filter) {
101*ec779b8eSAndroid Build Coastguard Worker if (in_filter == nullptr) {
102*ec779b8eSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::fromServiceSpecificError(
103*ec779b8eSAndroid Build Coastguard Worker static_cast<int32_t>(Result::INVALID_ARGUMENT));
104*ec779b8eSAndroid Build Coastguard Worker }
105*ec779b8eSAndroid Build Coastguard Worker
106*ec779b8eSAndroid Build Coastguard Worker sp<HidlIFilter> halFilter = (static_cast<TunerHidlFilter*>(in_filter.get()))->getHalFilter();
107*ec779b8eSAndroid Build Coastguard Worker if (halFilter == nullptr) {
108*ec779b8eSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::fromServiceSpecificError(
109*ec779b8eSAndroid Build Coastguard Worker static_cast<int32_t>(Result::INVALID_ARGUMENT));
110*ec779b8eSAndroid Build Coastguard Worker }
111*ec779b8eSAndroid Build Coastguard Worker
112*ec779b8eSAndroid Build Coastguard Worker HidlResult res = mDvr->detachFilter(halFilter);
113*ec779b8eSAndroid Build Coastguard Worker if (res != HidlResult::SUCCESS) {
114*ec779b8eSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
115*ec779b8eSAndroid Build Coastguard Worker }
116*ec779b8eSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::ok();
117*ec779b8eSAndroid Build Coastguard Worker }
118*ec779b8eSAndroid Build Coastguard Worker
start()119*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerHidlDvr::start() {
120*ec779b8eSAndroid Build Coastguard Worker HidlResult res = mDvr->start();
121*ec779b8eSAndroid Build Coastguard Worker if (res != HidlResult::SUCCESS) {
122*ec779b8eSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
123*ec779b8eSAndroid Build Coastguard Worker }
124*ec779b8eSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::ok();
125*ec779b8eSAndroid Build Coastguard Worker }
126*ec779b8eSAndroid Build Coastguard Worker
stop()127*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerHidlDvr::stop() {
128*ec779b8eSAndroid Build Coastguard Worker HidlResult res = mDvr->stop();
129*ec779b8eSAndroid Build Coastguard Worker if (res != HidlResult::SUCCESS) {
130*ec779b8eSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
131*ec779b8eSAndroid Build Coastguard Worker }
132*ec779b8eSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::ok();
133*ec779b8eSAndroid Build Coastguard Worker }
134*ec779b8eSAndroid Build Coastguard Worker
flush()135*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerHidlDvr::flush() {
136*ec779b8eSAndroid Build Coastguard Worker HidlResult res = mDvr->flush();
137*ec779b8eSAndroid Build Coastguard Worker if (res != HidlResult::SUCCESS) {
138*ec779b8eSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
139*ec779b8eSAndroid Build Coastguard Worker }
140*ec779b8eSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::ok();
141*ec779b8eSAndroid Build Coastguard Worker }
142*ec779b8eSAndroid Build Coastguard Worker
close()143*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerHidlDvr::close() {
144*ec779b8eSAndroid Build Coastguard Worker HidlResult res = mDvr->close();
145*ec779b8eSAndroid Build Coastguard Worker if (res != HidlResult::SUCCESS) {
146*ec779b8eSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
147*ec779b8eSAndroid Build Coastguard Worker }
148*ec779b8eSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::ok();
149*ec779b8eSAndroid Build Coastguard Worker }
150*ec779b8eSAndroid Build Coastguard Worker
setStatusCheckIntervalHint(int64_t)151*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerHidlDvr::setStatusCheckIntervalHint(int64_t /* in_milliseconds */) {
152*ec779b8eSAndroid Build Coastguard Worker HidlResult res = HidlResult::UNAVAILABLE;
153*ec779b8eSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
154*ec779b8eSAndroid Build Coastguard Worker }
155*ec779b8eSAndroid Build Coastguard Worker
getHidlDvrSettings(const DvrSettings & settings)156*ec779b8eSAndroid Build Coastguard Worker HidlDvrSettings TunerHidlDvr::getHidlDvrSettings(const DvrSettings& settings) {
157*ec779b8eSAndroid Build Coastguard Worker HidlDvrSettings s;
158*ec779b8eSAndroid Build Coastguard Worker switch (mType) {
159*ec779b8eSAndroid Build Coastguard Worker case DvrType::PLAYBACK: {
160*ec779b8eSAndroid Build Coastguard Worker s.playback({
161*ec779b8eSAndroid Build Coastguard Worker .statusMask =
162*ec779b8eSAndroid Build Coastguard Worker static_cast<uint8_t>(settings.get<DvrSettings::playback>().statusMask),
163*ec779b8eSAndroid Build Coastguard Worker .lowThreshold =
164*ec779b8eSAndroid Build Coastguard Worker static_cast<uint32_t>(settings.get<DvrSettings::playback>().lowThreshold),
165*ec779b8eSAndroid Build Coastguard Worker .highThreshold =
166*ec779b8eSAndroid Build Coastguard Worker static_cast<uint32_t>(settings.get<DvrSettings::playback>().highThreshold),
167*ec779b8eSAndroid Build Coastguard Worker .dataFormat = static_cast<HidlDataFormat>(
168*ec779b8eSAndroid Build Coastguard Worker settings.get<DvrSettings::playback>().dataFormat),
169*ec779b8eSAndroid Build Coastguard Worker .packetSize =
170*ec779b8eSAndroid Build Coastguard Worker static_cast<uint8_t>(settings.get<DvrSettings::playback>().packetSize),
171*ec779b8eSAndroid Build Coastguard Worker });
172*ec779b8eSAndroid Build Coastguard Worker return s;
173*ec779b8eSAndroid Build Coastguard Worker }
174*ec779b8eSAndroid Build Coastguard Worker case DvrType::RECORD: {
175*ec779b8eSAndroid Build Coastguard Worker s.record({
176*ec779b8eSAndroid Build Coastguard Worker .statusMask = static_cast<uint8_t>(settings.get<DvrSettings::record>().statusMask),
177*ec779b8eSAndroid Build Coastguard Worker .lowThreshold =
178*ec779b8eSAndroid Build Coastguard Worker static_cast<uint32_t>(settings.get<DvrSettings::record>().lowThreshold),
179*ec779b8eSAndroid Build Coastguard Worker .highThreshold =
180*ec779b8eSAndroid Build Coastguard Worker static_cast<uint32_t>(settings.get<DvrSettings::record>().highThreshold),
181*ec779b8eSAndroid Build Coastguard Worker .dataFormat =
182*ec779b8eSAndroid Build Coastguard Worker static_cast<HidlDataFormat>(settings.get<DvrSettings::record>().dataFormat),
183*ec779b8eSAndroid Build Coastguard Worker .packetSize = static_cast<uint8_t>(settings.get<DvrSettings::record>().packetSize),
184*ec779b8eSAndroid Build Coastguard Worker });
185*ec779b8eSAndroid Build Coastguard Worker return s;
186*ec779b8eSAndroid Build Coastguard Worker }
187*ec779b8eSAndroid Build Coastguard Worker default:
188*ec779b8eSAndroid Build Coastguard Worker break;
189*ec779b8eSAndroid Build Coastguard Worker }
190*ec779b8eSAndroid Build Coastguard Worker return s;
191*ec779b8eSAndroid Build Coastguard Worker }
192*ec779b8eSAndroid Build Coastguard Worker
193*ec779b8eSAndroid Build Coastguard Worker /////////////// IDvrCallback ///////////////////////
onRecordStatus(const HidlRecordStatus status)194*ec779b8eSAndroid Build Coastguard Worker Return<void> TunerHidlDvr::DvrCallback::onRecordStatus(const HidlRecordStatus status) {
195*ec779b8eSAndroid Build Coastguard Worker if (mTunerDvrCallback != nullptr) {
196*ec779b8eSAndroid Build Coastguard Worker mTunerDvrCallback->onRecordStatus(static_cast<RecordStatus>(status));
197*ec779b8eSAndroid Build Coastguard Worker }
198*ec779b8eSAndroid Build Coastguard Worker return Void();
199*ec779b8eSAndroid Build Coastguard Worker }
200*ec779b8eSAndroid Build Coastguard Worker
onPlaybackStatus(const HidlPlaybackStatus status)201*ec779b8eSAndroid Build Coastguard Worker Return<void> TunerHidlDvr::DvrCallback::onPlaybackStatus(const HidlPlaybackStatus status) {
202*ec779b8eSAndroid Build Coastguard Worker if (mTunerDvrCallback != nullptr) {
203*ec779b8eSAndroid Build Coastguard Worker mTunerDvrCallback->onPlaybackStatus(static_cast<PlaybackStatus>(status));
204*ec779b8eSAndroid Build Coastguard Worker }
205*ec779b8eSAndroid Build Coastguard Worker return Void();
206*ec779b8eSAndroid Build Coastguard Worker }
207*ec779b8eSAndroid Build Coastguard Worker
208*ec779b8eSAndroid Build Coastguard Worker } // namespace tuner
209*ec779b8eSAndroid Build Coastguard Worker } // namespace tv
210*ec779b8eSAndroid Build Coastguard Worker } // namespace media
211*ec779b8eSAndroid Build Coastguard Worker } // namespace android
212*ec779b8eSAndroid Build Coastguard Worker } // namespace aidl
213