xref: /aosp_15_r20/frameworks/av/services/tuner/hidl/TunerHidlDvr.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
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