1*d57664e9SAndroid Build Coastguard Worker /*
2*d57664e9SAndroid Build Coastguard Worker * Copyright 2021 The Android Open Source Project
3*d57664e9SAndroid Build Coastguard Worker *
4*d57664e9SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*d57664e9SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*d57664e9SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*d57664e9SAndroid Build Coastguard Worker *
8*d57664e9SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*d57664e9SAndroid Build Coastguard Worker *
10*d57664e9SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*d57664e9SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*d57664e9SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*d57664e9SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*d57664e9SAndroid Build Coastguard Worker * limitations under the License.
15*d57664e9SAndroid Build Coastguard Worker */
16*d57664e9SAndroid Build Coastguard Worker
17*d57664e9SAndroid Build Coastguard Worker //#define LOG_NDEBUG 0
18*d57664e9SAndroid Build Coastguard Worker #define LOG_TAG "DvrClient"
19*d57664e9SAndroid Build Coastguard Worker
20*d57664e9SAndroid Build Coastguard Worker #include "DvrClient.h"
21*d57664e9SAndroid Build Coastguard Worker
22*d57664e9SAndroid Build Coastguard Worker #include <aidl/android/hardware/tv/tuner/DemuxQueueNotifyBits.h>
23*d57664e9SAndroid Build Coastguard Worker #include <android-base/logging.h>
24*d57664e9SAndroid Build Coastguard Worker #include <inttypes.h>
25*d57664e9SAndroid Build Coastguard Worker #include <sys/types.h>
26*d57664e9SAndroid Build Coastguard Worker #include <unistd.h>
27*d57664e9SAndroid Build Coastguard Worker #include <utils/Log.h>
28*d57664e9SAndroid Build Coastguard Worker
29*d57664e9SAndroid Build Coastguard Worker #include "ClientHelper.h"
30*d57664e9SAndroid Build Coastguard Worker
31*d57664e9SAndroid Build Coastguard Worker using ::aidl::android::hardware::tv::tuner::DemuxQueueNotifyBits;
32*d57664e9SAndroid Build Coastguard Worker
33*d57664e9SAndroid Build Coastguard Worker namespace android {
34*d57664e9SAndroid Build Coastguard Worker /////////////// DvrClient ///////////////////////
DvrClient(shared_ptr<ITunerDvr> tunerDvr)35*d57664e9SAndroid Build Coastguard Worker DvrClient::DvrClient(shared_ptr<ITunerDvr> tunerDvr) {
36*d57664e9SAndroid Build Coastguard Worker mTunerDvr = tunerDvr;
37*d57664e9SAndroid Build Coastguard Worker mFd = -1;
38*d57664e9SAndroid Build Coastguard Worker mDvrMQ = nullptr;
39*d57664e9SAndroid Build Coastguard Worker mDvrMQEventFlag = nullptr;
40*d57664e9SAndroid Build Coastguard Worker }
41*d57664e9SAndroid Build Coastguard Worker
~DvrClient()42*d57664e9SAndroid Build Coastguard Worker DvrClient::~DvrClient() {
43*d57664e9SAndroid Build Coastguard Worker mTunerDvr = nullptr;
44*d57664e9SAndroid Build Coastguard Worker mFd = -1;
45*d57664e9SAndroid Build Coastguard Worker mDvrMQ = nullptr;
46*d57664e9SAndroid Build Coastguard Worker mDvrMQEventFlag = nullptr;
47*d57664e9SAndroid Build Coastguard Worker }
48*d57664e9SAndroid Build Coastguard Worker
setFd(int32_t fd)49*d57664e9SAndroid Build Coastguard Worker void DvrClient::setFd(int32_t fd) {
50*d57664e9SAndroid Build Coastguard Worker mFd = fd;
51*d57664e9SAndroid Build Coastguard Worker }
52*d57664e9SAndroid Build Coastguard Worker
readFromFile(int64_t size)53*d57664e9SAndroid Build Coastguard Worker int64_t DvrClient::readFromFile(int64_t size) {
54*d57664e9SAndroid Build Coastguard Worker if (mDvrMQ == nullptr || mDvrMQEventFlag == nullptr) {
55*d57664e9SAndroid Build Coastguard Worker ALOGE("Failed to readFromFile. DVR mq is not configured");
56*d57664e9SAndroid Build Coastguard Worker return -1;
57*d57664e9SAndroid Build Coastguard Worker }
58*d57664e9SAndroid Build Coastguard Worker if (mFd < 0) {
59*d57664e9SAndroid Build Coastguard Worker ALOGE("Failed to readFromFile. File is not configured");
60*d57664e9SAndroid Build Coastguard Worker return -1;
61*d57664e9SAndroid Build Coastguard Worker }
62*d57664e9SAndroid Build Coastguard Worker
63*d57664e9SAndroid Build Coastguard Worker int64_t available = mDvrMQ->availableToWrite();
64*d57664e9SAndroid Build Coastguard Worker int64_t write = min(size, available);
65*d57664e9SAndroid Build Coastguard Worker
66*d57664e9SAndroid Build Coastguard Worker AidlMQ::MemTransaction tx;
67*d57664e9SAndroid Build Coastguard Worker int64_t ret = 0;
68*d57664e9SAndroid Build Coastguard Worker if (mDvrMQ->beginWrite(write, &tx)) {
69*d57664e9SAndroid Build Coastguard Worker auto first = tx.getFirstRegion();
70*d57664e9SAndroid Build Coastguard Worker auto data = first.getAddress();
71*d57664e9SAndroid Build Coastguard Worker int64_t length = first.getLength();
72*d57664e9SAndroid Build Coastguard Worker int64_t firstToWrite = min(length, write);
73*d57664e9SAndroid Build Coastguard Worker ret = read(mFd, data, firstToWrite);
74*d57664e9SAndroid Build Coastguard Worker
75*d57664e9SAndroid Build Coastguard Worker if (ret < 0) {
76*d57664e9SAndroid Build Coastguard Worker ALOGE("Failed to read from FD: %s", strerror(errno));
77*d57664e9SAndroid Build Coastguard Worker return -1;
78*d57664e9SAndroid Build Coastguard Worker }
79*d57664e9SAndroid Build Coastguard Worker if (ret < firstToWrite) {
80*d57664e9SAndroid Build Coastguard Worker ALOGW("file to MQ, first region: %" PRIu64 " bytes to write, but %" PRIu64
81*d57664e9SAndroid Build Coastguard Worker " bytes written",
82*d57664e9SAndroid Build Coastguard Worker firstToWrite, ret);
83*d57664e9SAndroid Build Coastguard Worker } else if (firstToWrite < write) {
84*d57664e9SAndroid Build Coastguard Worker ALOGV("write second region: %" PRIu64 " bytes written, %" PRIu64 " bytes in total", ret,
85*d57664e9SAndroid Build Coastguard Worker write);
86*d57664e9SAndroid Build Coastguard Worker auto second = tx.getSecondRegion();
87*d57664e9SAndroid Build Coastguard Worker data = second.getAddress();
88*d57664e9SAndroid Build Coastguard Worker length = second.getLength();
89*d57664e9SAndroid Build Coastguard Worker int64_t secondToWrite = std::min(length, write - firstToWrite);
90*d57664e9SAndroid Build Coastguard Worker ret += read(mFd, data, secondToWrite);
91*d57664e9SAndroid Build Coastguard Worker }
92*d57664e9SAndroid Build Coastguard Worker ALOGV("file to MQ: %" PRIu64 " bytes need to be written, %" PRIu64 " bytes written", write,
93*d57664e9SAndroid Build Coastguard Worker ret);
94*d57664e9SAndroid Build Coastguard Worker if (!mDvrMQ->commitWrite(ret)) {
95*d57664e9SAndroid Build Coastguard Worker ALOGE("Error: failed to commit write!");
96*d57664e9SAndroid Build Coastguard Worker return -1;
97*d57664e9SAndroid Build Coastguard Worker }
98*d57664e9SAndroid Build Coastguard Worker } else {
99*d57664e9SAndroid Build Coastguard Worker ALOGE("dvrMq.beginWrite failed");
100*d57664e9SAndroid Build Coastguard Worker }
101*d57664e9SAndroid Build Coastguard Worker
102*d57664e9SAndroid Build Coastguard Worker if (ret > 0) {
103*d57664e9SAndroid Build Coastguard Worker mDvrMQEventFlag->wake(static_cast<uint32_t>(DemuxQueueNotifyBits::DATA_READY));
104*d57664e9SAndroid Build Coastguard Worker }
105*d57664e9SAndroid Build Coastguard Worker return ret;
106*d57664e9SAndroid Build Coastguard Worker }
107*d57664e9SAndroid Build Coastguard Worker
readFromBuffer(int8_t * buffer,int64_t size)108*d57664e9SAndroid Build Coastguard Worker int64_t DvrClient::readFromBuffer(int8_t* buffer, int64_t size) {
109*d57664e9SAndroid Build Coastguard Worker if (mDvrMQ == nullptr || mDvrMQEventFlag == nullptr) {
110*d57664e9SAndroid Build Coastguard Worker ALOGE("Failed to readFromBuffer. DVR mq is not configured");
111*d57664e9SAndroid Build Coastguard Worker return -1;
112*d57664e9SAndroid Build Coastguard Worker }
113*d57664e9SAndroid Build Coastguard Worker if (buffer == nullptr) {
114*d57664e9SAndroid Build Coastguard Worker ALOGE("Failed to readFromBuffer. Buffer can't be null");
115*d57664e9SAndroid Build Coastguard Worker return -1;
116*d57664e9SAndroid Build Coastguard Worker }
117*d57664e9SAndroid Build Coastguard Worker
118*d57664e9SAndroid Build Coastguard Worker int64_t available = mDvrMQ->availableToWrite();
119*d57664e9SAndroid Build Coastguard Worker size = min(size, available);
120*d57664e9SAndroid Build Coastguard Worker
121*d57664e9SAndroid Build Coastguard Worker if (mDvrMQ->write(buffer, size)) {
122*d57664e9SAndroid Build Coastguard Worker mDvrMQEventFlag->wake(static_cast<uint32_t>(DemuxQueueNotifyBits::DATA_READY));
123*d57664e9SAndroid Build Coastguard Worker } else {
124*d57664e9SAndroid Build Coastguard Worker ALOGD("Failed to write FMQ");
125*d57664e9SAndroid Build Coastguard Worker return -1;
126*d57664e9SAndroid Build Coastguard Worker }
127*d57664e9SAndroid Build Coastguard Worker return size;
128*d57664e9SAndroid Build Coastguard Worker }
129*d57664e9SAndroid Build Coastguard Worker
writeToFile(int64_t size)130*d57664e9SAndroid Build Coastguard Worker int64_t DvrClient::writeToFile(int64_t size) {
131*d57664e9SAndroid Build Coastguard Worker if (mDvrMQ == nullptr || mDvrMQEventFlag == nullptr) {
132*d57664e9SAndroid Build Coastguard Worker ALOGE("Failed to writeToFile. DVR mq is not configured");
133*d57664e9SAndroid Build Coastguard Worker return -1;
134*d57664e9SAndroid Build Coastguard Worker }
135*d57664e9SAndroid Build Coastguard Worker if (mFd < 0) {
136*d57664e9SAndroid Build Coastguard Worker ALOGE("Failed to writeToFile. File is not configured");
137*d57664e9SAndroid Build Coastguard Worker return -1;
138*d57664e9SAndroid Build Coastguard Worker }
139*d57664e9SAndroid Build Coastguard Worker
140*d57664e9SAndroid Build Coastguard Worker int64_t available = mDvrMQ->availableToRead();
141*d57664e9SAndroid Build Coastguard Worker int64_t toRead = min(size, available);
142*d57664e9SAndroid Build Coastguard Worker
143*d57664e9SAndroid Build Coastguard Worker int64_t ret = 0;
144*d57664e9SAndroid Build Coastguard Worker AidlMQ::MemTransaction tx;
145*d57664e9SAndroid Build Coastguard Worker if (mDvrMQ->beginRead(toRead, &tx)) {
146*d57664e9SAndroid Build Coastguard Worker auto first = tx.getFirstRegion();
147*d57664e9SAndroid Build Coastguard Worker auto data = first.getAddress();
148*d57664e9SAndroid Build Coastguard Worker int64_t length = first.getLength();
149*d57664e9SAndroid Build Coastguard Worker int64_t firstToRead = std::min(length, toRead);
150*d57664e9SAndroid Build Coastguard Worker ret = write(mFd, data, firstToRead);
151*d57664e9SAndroid Build Coastguard Worker
152*d57664e9SAndroid Build Coastguard Worker if (ret < 0) {
153*d57664e9SAndroid Build Coastguard Worker ALOGE("Failed to write to FD: %s", strerror(errno));
154*d57664e9SAndroid Build Coastguard Worker return -1;
155*d57664e9SAndroid Build Coastguard Worker }
156*d57664e9SAndroid Build Coastguard Worker if (ret < firstToRead) {
157*d57664e9SAndroid Build Coastguard Worker ALOGW("MQ to file: %" PRIu64 " bytes read, but %" PRIu64 " bytes written", firstToRead,
158*d57664e9SAndroid Build Coastguard Worker ret);
159*d57664e9SAndroid Build Coastguard Worker } else if (firstToRead < toRead) {
160*d57664e9SAndroid Build Coastguard Worker ALOGV("read second region: %" PRIu64 " bytes read, %" PRIu64 " bytes in total", ret,
161*d57664e9SAndroid Build Coastguard Worker toRead);
162*d57664e9SAndroid Build Coastguard Worker auto second = tx.getSecondRegion();
163*d57664e9SAndroid Build Coastguard Worker data = second.getAddress();
164*d57664e9SAndroid Build Coastguard Worker length = second.getLength();
165*d57664e9SAndroid Build Coastguard Worker int32_t secondToRead = toRead - firstToRead;
166*d57664e9SAndroid Build Coastguard Worker ret += write(mFd, data, secondToRead);
167*d57664e9SAndroid Build Coastguard Worker }
168*d57664e9SAndroid Build Coastguard Worker ALOGV("MQ to file: %" PRIu64 " bytes to be read, %" PRIu64 " bytes written", toRead, ret);
169*d57664e9SAndroid Build Coastguard Worker if (!mDvrMQ->commitRead(ret)) {
170*d57664e9SAndroid Build Coastguard Worker ALOGE("Error: failed to commit read!");
171*d57664e9SAndroid Build Coastguard Worker return 0;
172*d57664e9SAndroid Build Coastguard Worker }
173*d57664e9SAndroid Build Coastguard Worker } else {
174*d57664e9SAndroid Build Coastguard Worker ALOGE("dvrMq.beginRead failed");
175*d57664e9SAndroid Build Coastguard Worker }
176*d57664e9SAndroid Build Coastguard Worker if (ret > 0) {
177*d57664e9SAndroid Build Coastguard Worker mDvrMQEventFlag->wake(static_cast<uint32_t>(DemuxQueueNotifyBits::DATA_CONSUMED));
178*d57664e9SAndroid Build Coastguard Worker }
179*d57664e9SAndroid Build Coastguard Worker
180*d57664e9SAndroid Build Coastguard Worker return ret;
181*d57664e9SAndroid Build Coastguard Worker }
182*d57664e9SAndroid Build Coastguard Worker
writeToBuffer(int8_t * buffer,int64_t size)183*d57664e9SAndroid Build Coastguard Worker int64_t DvrClient::writeToBuffer(int8_t* buffer, int64_t size) {
184*d57664e9SAndroid Build Coastguard Worker if (mDvrMQ == nullptr || mDvrMQEventFlag == nullptr) {
185*d57664e9SAndroid Build Coastguard Worker ALOGE("Failed to writetoBuffer. DVR mq is not configured");
186*d57664e9SAndroid Build Coastguard Worker return -1;
187*d57664e9SAndroid Build Coastguard Worker }
188*d57664e9SAndroid Build Coastguard Worker if (buffer == nullptr) {
189*d57664e9SAndroid Build Coastguard Worker ALOGE("Failed to writetoBuffer. Buffer can't be null");
190*d57664e9SAndroid Build Coastguard Worker return -1;
191*d57664e9SAndroid Build Coastguard Worker }
192*d57664e9SAndroid Build Coastguard Worker
193*d57664e9SAndroid Build Coastguard Worker int64_t available = mDvrMQ->availableToRead();
194*d57664e9SAndroid Build Coastguard Worker size = min(size, available);
195*d57664e9SAndroid Build Coastguard Worker
196*d57664e9SAndroid Build Coastguard Worker if (mDvrMQ->read(buffer, size)) {
197*d57664e9SAndroid Build Coastguard Worker mDvrMQEventFlag->wake(static_cast<uint32_t>(DemuxQueueNotifyBits::DATA_CONSUMED));
198*d57664e9SAndroid Build Coastguard Worker } else {
199*d57664e9SAndroid Build Coastguard Worker ALOGD("Failed to write FMQ");
200*d57664e9SAndroid Build Coastguard Worker return -1;
201*d57664e9SAndroid Build Coastguard Worker }
202*d57664e9SAndroid Build Coastguard Worker return size;
203*d57664e9SAndroid Build Coastguard Worker }
204*d57664e9SAndroid Build Coastguard Worker
seekFile(int64_t pos)205*d57664e9SAndroid Build Coastguard Worker int64_t DvrClient::seekFile(int64_t pos) {
206*d57664e9SAndroid Build Coastguard Worker if (mFd < 0) {
207*d57664e9SAndroid Build Coastguard Worker ALOGE("Failed to seekFile. File is not configured");
208*d57664e9SAndroid Build Coastguard Worker return -1;
209*d57664e9SAndroid Build Coastguard Worker }
210*d57664e9SAndroid Build Coastguard Worker return lseek64(mFd, pos, SEEK_SET);
211*d57664e9SAndroid Build Coastguard Worker }
212*d57664e9SAndroid Build Coastguard Worker
configure(DvrSettings settings)213*d57664e9SAndroid Build Coastguard Worker Result DvrClient::configure(DvrSettings settings) {
214*d57664e9SAndroid Build Coastguard Worker if (mTunerDvr != nullptr) {
215*d57664e9SAndroid Build Coastguard Worker Status s = mTunerDvr->configure(settings);
216*d57664e9SAndroid Build Coastguard Worker Result res = ClientHelper::getServiceSpecificErrorCode(s);
217*d57664e9SAndroid Build Coastguard Worker if (res != Result::SUCCESS) {
218*d57664e9SAndroid Build Coastguard Worker return res;
219*d57664e9SAndroid Build Coastguard Worker }
220*d57664e9SAndroid Build Coastguard Worker
221*d57664e9SAndroid Build Coastguard Worker AidlMQDesc aidlMqDesc;
222*d57664e9SAndroid Build Coastguard Worker s = mTunerDvr->getQueueDesc(&aidlMqDesc);
223*d57664e9SAndroid Build Coastguard Worker res = ClientHelper::getServiceSpecificErrorCode(s);
224*d57664e9SAndroid Build Coastguard Worker if (res != Result::SUCCESS) {
225*d57664e9SAndroid Build Coastguard Worker return res;
226*d57664e9SAndroid Build Coastguard Worker }
227*d57664e9SAndroid Build Coastguard Worker mDvrMQ = new (nothrow) AidlMQ(aidlMqDesc);
228*d57664e9SAndroid Build Coastguard Worker EventFlag::createEventFlag(mDvrMQ->getEventFlagWord(), &mDvrMQEventFlag);
229*d57664e9SAndroid Build Coastguard Worker return res;
230*d57664e9SAndroid Build Coastguard Worker }
231*d57664e9SAndroid Build Coastguard Worker
232*d57664e9SAndroid Build Coastguard Worker return Result::INVALID_STATE;
233*d57664e9SAndroid Build Coastguard Worker }
234*d57664e9SAndroid Build Coastguard Worker
attachFilter(sp<FilterClient> filterClient)235*d57664e9SAndroid Build Coastguard Worker Result DvrClient::attachFilter(sp<FilterClient> filterClient) {
236*d57664e9SAndroid Build Coastguard Worker if (filterClient == nullptr) {
237*d57664e9SAndroid Build Coastguard Worker return Result::INVALID_ARGUMENT;
238*d57664e9SAndroid Build Coastguard Worker }
239*d57664e9SAndroid Build Coastguard Worker
240*d57664e9SAndroid Build Coastguard Worker if (mTunerDvr != nullptr) {
241*d57664e9SAndroid Build Coastguard Worker Status s = mTunerDvr->attachFilter(filterClient->getAidlFilter());
242*d57664e9SAndroid Build Coastguard Worker return ClientHelper::getServiceSpecificErrorCode(s);
243*d57664e9SAndroid Build Coastguard Worker }
244*d57664e9SAndroid Build Coastguard Worker
245*d57664e9SAndroid Build Coastguard Worker return Result::INVALID_STATE;
246*d57664e9SAndroid Build Coastguard Worker }
247*d57664e9SAndroid Build Coastguard Worker
detachFilter(sp<FilterClient> filterClient)248*d57664e9SAndroid Build Coastguard Worker Result DvrClient::detachFilter(sp<FilterClient> filterClient) {
249*d57664e9SAndroid Build Coastguard Worker if (filterClient == nullptr) {
250*d57664e9SAndroid Build Coastguard Worker return Result::INVALID_ARGUMENT;
251*d57664e9SAndroid Build Coastguard Worker }
252*d57664e9SAndroid Build Coastguard Worker
253*d57664e9SAndroid Build Coastguard Worker if (mTunerDvr != nullptr) {
254*d57664e9SAndroid Build Coastguard Worker Status s = mTunerDvr->detachFilter(filterClient->getAidlFilter());
255*d57664e9SAndroid Build Coastguard Worker return ClientHelper::getServiceSpecificErrorCode(s);
256*d57664e9SAndroid Build Coastguard Worker }
257*d57664e9SAndroid Build Coastguard Worker
258*d57664e9SAndroid Build Coastguard Worker return Result::INVALID_STATE;
259*d57664e9SAndroid Build Coastguard Worker }
260*d57664e9SAndroid Build Coastguard Worker
start()261*d57664e9SAndroid Build Coastguard Worker Result DvrClient::start() {
262*d57664e9SAndroid Build Coastguard Worker if (mTunerDvr != nullptr) {
263*d57664e9SAndroid Build Coastguard Worker Status s = mTunerDvr->start();
264*d57664e9SAndroid Build Coastguard Worker return ClientHelper::getServiceSpecificErrorCode(s);
265*d57664e9SAndroid Build Coastguard Worker }
266*d57664e9SAndroid Build Coastguard Worker
267*d57664e9SAndroid Build Coastguard Worker return Result::INVALID_STATE;
268*d57664e9SAndroid Build Coastguard Worker }
269*d57664e9SAndroid Build Coastguard Worker
stop()270*d57664e9SAndroid Build Coastguard Worker Result DvrClient::stop() {
271*d57664e9SAndroid Build Coastguard Worker if (mTunerDvr != nullptr) {
272*d57664e9SAndroid Build Coastguard Worker Status s = mTunerDvr->stop();
273*d57664e9SAndroid Build Coastguard Worker return ClientHelper::getServiceSpecificErrorCode(s);
274*d57664e9SAndroid Build Coastguard Worker }
275*d57664e9SAndroid Build Coastguard Worker
276*d57664e9SAndroid Build Coastguard Worker return Result::INVALID_STATE;
277*d57664e9SAndroid Build Coastguard Worker }
278*d57664e9SAndroid Build Coastguard Worker
flush()279*d57664e9SAndroid Build Coastguard Worker Result DvrClient::flush() {
280*d57664e9SAndroid Build Coastguard Worker if (mTunerDvr != nullptr) {
281*d57664e9SAndroid Build Coastguard Worker Status s = mTunerDvr->flush();
282*d57664e9SAndroid Build Coastguard Worker return ClientHelper::getServiceSpecificErrorCode(s);
283*d57664e9SAndroid Build Coastguard Worker }
284*d57664e9SAndroid Build Coastguard Worker
285*d57664e9SAndroid Build Coastguard Worker return Result::INVALID_STATE;
286*d57664e9SAndroid Build Coastguard Worker }
287*d57664e9SAndroid Build Coastguard Worker
close()288*d57664e9SAndroid Build Coastguard Worker Result DvrClient::close() {
289*d57664e9SAndroid Build Coastguard Worker if (mDvrMQEventFlag != nullptr) {
290*d57664e9SAndroid Build Coastguard Worker EventFlag::deleteEventFlag(&mDvrMQEventFlag);
291*d57664e9SAndroid Build Coastguard Worker mDvrMQEventFlag = nullptr;
292*d57664e9SAndroid Build Coastguard Worker }
293*d57664e9SAndroid Build Coastguard Worker if (mDvrMQ != nullptr) {
294*d57664e9SAndroid Build Coastguard Worker delete mDvrMQ;
295*d57664e9SAndroid Build Coastguard Worker mDvrMQ = nullptr;
296*d57664e9SAndroid Build Coastguard Worker }
297*d57664e9SAndroid Build Coastguard Worker
298*d57664e9SAndroid Build Coastguard Worker if (mTunerDvr != nullptr) {
299*d57664e9SAndroid Build Coastguard Worker Status s = mTunerDvr->close();
300*d57664e9SAndroid Build Coastguard Worker mTunerDvr = nullptr;
301*d57664e9SAndroid Build Coastguard Worker return ClientHelper::getServiceSpecificErrorCode(s);
302*d57664e9SAndroid Build Coastguard Worker }
303*d57664e9SAndroid Build Coastguard Worker
304*d57664e9SAndroid Build Coastguard Worker return Result::INVALID_STATE;
305*d57664e9SAndroid Build Coastguard Worker }
setStatusCheckIntervalHint(int64_t durationInMs)306*d57664e9SAndroid Build Coastguard Worker Result DvrClient::setStatusCheckIntervalHint(int64_t durationInMs) {
307*d57664e9SAndroid Build Coastguard Worker if (mTunerDvr == nullptr) {
308*d57664e9SAndroid Build Coastguard Worker return Result::INVALID_STATE;
309*d57664e9SAndroid Build Coastguard Worker }
310*d57664e9SAndroid Build Coastguard Worker if (durationInMs < 0) {
311*d57664e9SAndroid Build Coastguard Worker return Result::INVALID_ARGUMENT;
312*d57664e9SAndroid Build Coastguard Worker }
313*d57664e9SAndroid Build Coastguard Worker
314*d57664e9SAndroid Build Coastguard Worker Status s = mTunerDvr->setStatusCheckIntervalHint(durationInMs);
315*d57664e9SAndroid Build Coastguard Worker return ClientHelper::getServiceSpecificErrorCode(s);
316*d57664e9SAndroid Build Coastguard Worker }
317*d57664e9SAndroid Build Coastguard Worker /////////////// TunerDvrCallback ///////////////////////
TunerDvrCallback(sp<DvrClientCallback> dvrClientCallback)318*d57664e9SAndroid Build Coastguard Worker TunerDvrCallback::TunerDvrCallback(sp<DvrClientCallback> dvrClientCallback)
319*d57664e9SAndroid Build Coastguard Worker : mDvrClientCallback(dvrClientCallback) {}
320*d57664e9SAndroid Build Coastguard Worker
onRecordStatus(RecordStatus status)321*d57664e9SAndroid Build Coastguard Worker Status TunerDvrCallback::onRecordStatus(RecordStatus status) {
322*d57664e9SAndroid Build Coastguard Worker if (mDvrClientCallback != nullptr) {
323*d57664e9SAndroid Build Coastguard Worker mDvrClientCallback->onRecordStatus(status);
324*d57664e9SAndroid Build Coastguard Worker return Status::ok();
325*d57664e9SAndroid Build Coastguard Worker }
326*d57664e9SAndroid Build Coastguard Worker return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE));
327*d57664e9SAndroid Build Coastguard Worker }
328*d57664e9SAndroid Build Coastguard Worker
onPlaybackStatus(PlaybackStatus status)329*d57664e9SAndroid Build Coastguard Worker Status TunerDvrCallback::onPlaybackStatus(PlaybackStatus status) {
330*d57664e9SAndroid Build Coastguard Worker if (mDvrClientCallback != nullptr) {
331*d57664e9SAndroid Build Coastguard Worker mDvrClientCallback->onPlaybackStatus(status);
332*d57664e9SAndroid Build Coastguard Worker return Status::ok();
333*d57664e9SAndroid Build Coastguard Worker }
334*d57664e9SAndroid Build Coastguard Worker return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE));
335*d57664e9SAndroid Build Coastguard Worker }
336*d57664e9SAndroid Build Coastguard Worker
337*d57664e9SAndroid Build Coastguard Worker } // namespace android
338