Refactor Tuner JNI and move the interaction with ILnb into LnbClient
Test: atest android.media.tv.tuner.cts on Cuttlefish
Bug: 174095851
Change-Id: I3903f62949aec0dac61388b356e7d7850a5a044c
diff --git a/media/jni/tuner/FrontendClient.cpp b/media/jni/tuner/FrontendClient.cpp
index b6225cf..9dd4df7 100644
--- a/media/jni/tuner/FrontendClient.cpp
+++ b/media/jni/tuner/FrontendClient.cpp
@@ -99,6 +99,21 @@
return Result::INVALID_STATE;
}
+Result FrontendClient::setLnb(sp<LnbClient> lnbClient) {
+ if (mTunerFrontend != NULL) {
+ // TODO: handle error message.
+ /*mTunerFrontend->setLnb(lnbClient->getAidlLnb());
+ return Result::SUCCESS;*/
+ }
+
+ if (mFrontend != NULL) {
+ Result result = mFrontend->setLnb(lnbClient->getId());
+ return result;
+ }
+
+ return Result::INVALID_STATE;
+}
+
Result FrontendClient::close() {
if (mTunerFrontend != NULL) {
// TODO: handle error message.
diff --git a/media/jni/tuner/FrontendClient.h b/media/jni/tuner/FrontendClient.h
index 265e14f..b24f944 100644
--- a/media/jni/tuner/FrontendClient.h
+++ b/media/jni/tuner/FrontendClient.h
@@ -24,6 +24,7 @@
#include <android/hardware/tv/tuner/1.1/types.h>
#include "FrontendClientCallback.h"
+#include "LnbClient.h"
using Status = ::ndk::ScopedAStatus;
@@ -127,6 +128,11 @@
Result stopTune();
/**
+ * Sets Low-Noise Block downconverter (LNB) for satellite frontend.
+ */
+ Result setLnb(sp<LnbClient> lnbClient);
+
+ /**
* Close Frontend.
*/
Result close();
diff --git a/media/jni/tuner/LnbClient.cpp b/media/jni/tuner/LnbClient.cpp
index c9f9f84..7f3916f 100644
--- a/media/jni/tuner/LnbClient.cpp
+++ b/media/jni/tuner/LnbClient.cpp
@@ -30,11 +30,13 @@
// TODO: pending aidl interface
LnbClient::LnbClient() {
//mTunerLnb = tunerLnb;
+ mId = -1;
}
LnbClient::~LnbClient() {
//mTunerLnb = NULL;
mLnb = NULL;
+ mId = -1;
}
// TODO: remove after migration to Tuner Service is done.
@@ -42,28 +44,66 @@
mLnb = lnb;
}
-Result LnbClient::setCallback(sp<LnbClientCallback> /*cb*/) {
- return Result::SUCCESS;
+Result LnbClient::setCallback(sp<LnbClientCallback> cb) {
+ // TODO: pending aidl interface
+ /*if (mTunerFrontend != NULL) {
+ mAidlCallback = ::ndk::SharedRefBase::make<TunerLnbCallback>(cb);
+ mTunerLnb->setCallback(mAidlCallback);
+ return Result::SUCCESS;
+ }*/
+
+ mHidlCallback = new HidlLnbCallback(cb);
+ return mLnb->setCallback(mHidlCallback);
}
-Result LnbClient::setVoltage(int /*voltage*/) {
- return Result::SUCCESS;
+Result LnbClient::setVoltage(LnbVoltage voltage) {
+ // TODO: pending aidl interface
+
+ if (mLnb != NULL) {
+ return mLnb->setVoltage(voltage);
+ }
+
+ return Result::INVALID_STATE;
}
-Result LnbClient::setTone(int /*tone*/) {
- return Result::SUCCESS;
+Result LnbClient::setTone(LnbTone tone) {
+ // TODO: pending aidl interface
+
+ if (mLnb != NULL) {
+ return mLnb->setTone(tone);
+ }
+
+ return Result::INVALID_STATE;
}
-Result LnbClient::setSatellitePosition(int /*position*/) {
- return Result::SUCCESS;
+Result LnbClient::setSatellitePosition(LnbPosition position) {
+ // TODO: pending aidl interface
+
+ if (mLnb != NULL) {
+ return mLnb->setSatellitePosition(position);
+ }
+
+ return Result::INVALID_STATE;
}
-Result LnbClient::sendDiseqcMessage(vector<uint8_t> /*diseqcMessage*/) {
- return Result::SUCCESS;
+Result LnbClient::sendDiseqcMessage(vector<uint8_t> diseqcMessage) {
+ // TODO: pending aidl interface
+
+ if (mLnb != NULL) {
+ return mLnb->sendDiseqcMessage(diseqcMessage);
+ }
+
+ return Result::INVALID_STATE;
}
Result LnbClient::close() {
- return Result::SUCCESS;
+ // TODO: pending aidl interface
+
+ if (mLnb != NULL) {
+ return mLnb->close();
+ }
+
+ return Result::INVALID_STATE;
}
/////////////// ILnbCallback ///////////////////////
diff --git a/media/jni/tuner/LnbClient.h b/media/jni/tuner/LnbClient.h
index c548777..533a996 100644
--- a/media/jni/tuner/LnbClient.h
+++ b/media/jni/tuner/LnbClient.h
@@ -31,6 +31,10 @@
using ::android::hardware::hidl_vec;
using ::android::hardware::tv::tuner::V1_0::ILnb;
using ::android::hardware::tv::tuner::V1_0::ILnbCallback;
+using ::android::hardware::tv::tuner::V1_0::LnbId;
+using ::android::hardware::tv::tuner::V1_0::LnbPosition;
+using ::android::hardware::tv::tuner::V1_0::LnbTone;
+using ::android::hardware::tv::tuner::V1_0::LnbVoltage;
using ::android::hardware::tv::tuner::V1_0::Result;
using namespace std;
@@ -79,17 +83,17 @@
/**
* Set the lnb's power voltage.
*/
- Result setVoltage(int voltage);
+ Result setVoltage(LnbVoltage voltage);
/**
* Set the lnb's tone mode.
*/
- Result setTone(int tone);
+ Result setTone(LnbTone tone);
/**
* Select the lnb's position.
*/
- Result setSatellitePosition(int position);
+ Result setSatellitePosition(LnbPosition position);
/**
* Sends DiSEqC (Digital Satellite Equipment Control) message.
@@ -101,6 +105,10 @@
*/
Result close();
+ //shared_ptr<ITunerLnb> getAidlLnb() { return mTunerLnb; }
+ void setId(LnbId id) { mId = id; }
+ LnbId getId() { return mId; }
+
private:
/**
* An AIDL Tuner Lnb Singleton assigned at the first time the Tuner Client
@@ -115,6 +123,11 @@
* Default null when the HAL service does not exist.
*/
sp<ILnb> mLnb;
+
+ //shared_ptr<TunerLnbCallback> mAidlCallback;
+ sp<HidlLnbCallback> mHidlCallback;
+
+ LnbId mId;
};
} // namespace android
diff --git a/media/jni/tuner/TunerClient.cpp b/media/jni/tuner/TunerClient.cpp
index 67a559c..69cd3d3 100644
--- a/media/jni/tuner/TunerClient.cpp
+++ b/media/jni/tuner/TunerClient.cpp
@@ -180,11 +180,49 @@
return NULL;
}
-sp<LnbClient> TunerClient::openLnb(int /*lnbHandle*/) {
+sp<LnbClient> TunerClient::openLnb(int lnbHandle) {
+ if (mTunerService != NULL) {
+ // TODO: handle error code
+ /*shared_ptr<ITunerLnb> tunerLnb;
+ mTunerService->openLnb(demuxHandle, &tunerLnb);
+ return new LnbClient(tunerLnb);*/
+ }
+
+ if (mTuner != NULL) {
+ int id = getResourceIdFromHandle(lnbHandle, LNB);
+ // TODO: pending aidl interface
+ sp<LnbClient> lnbClient = new LnbClient();
+ sp<ILnb> hidlLnb = openHidlLnbById(id);
+ if (hidlLnb != NULL) {
+ lnbClient->setHidlLnb(hidlLnb);
+ lnbClient->setId(id);
+ return lnbClient;
+ }
+ }
+
return NULL;
}
-sp<LnbClient> TunerClient::openLnbByName(string /*lnbName*/) {
+sp<LnbClient> TunerClient::openLnbByName(string lnbName) {
+ if (mTunerService != NULL) {
+ // TODO: handle error code
+ /*shared_ptr<ITunerLnb> tunerLnb;
+ mTunerService->openLnbByName(lnbName, &tunerLnb);
+ return new LnbClient(tunerLnb);*/
+ }
+
+ if (mTuner != NULL) {
+ // TODO: pending aidl interface
+ sp<LnbClient> lnbClient = new LnbClient();
+ LnbId id;
+ sp<ILnb> hidlLnb = openHidlLnbByName(lnbName, id);
+ if (hidlLnb != NULL) {
+ lnbClient->setHidlLnb(hidlLnb);
+ lnbClient->setId(id);
+ return lnbClient;
+ }
+ }
+
return NULL;
}
@@ -249,6 +287,37 @@
return demux;
}
+sp<ILnb> TunerClient::openHidlLnbById(int id) {
+ sp<ILnb> lnb;
+ Result res;
+
+ mTuner->openLnbById(id, [&](Result r, const sp<ILnb>& lnbSp) {
+ res = r;
+ lnb = lnbSp;
+ });
+ if (res != Result::SUCCESS || lnb == nullptr) {
+ ALOGE("Failed to open lnb by id");
+ return NULL;
+ }
+ return lnb;
+}
+
+sp<ILnb> TunerClient::openHidlLnbByName(string name, LnbId& lnbId) {
+ sp<ILnb> lnb;
+ Result res;
+
+ mTuner->openLnbByName(name, [&](Result r, LnbId id, const sp<ILnb>& lnbSp) {
+ res = r;
+ lnb = lnbSp;
+ lnbId = id;
+ });
+ if (res != Result::SUCCESS || lnb == nullptr) {
+ ALOGE("Failed to open lnb by name");
+ return NULL;
+ }
+ return lnb;
+}
+
FrontendInfo TunerClient::FrontendInfoAidlToHidl(TunerServiceFrontendInfo aidlFrontendInfo) {
FrontendInfo hidlFrontendInfo {
.type = static_cast<FrontendType>(aidlFrontendInfo.type),
diff --git a/media/jni/tuner/TunerClient.h b/media/jni/tuner/TunerClient.h
index 98ae24d..06ba7a5 100644
--- a/media/jni/tuner/TunerClient.h
+++ b/media/jni/tuner/TunerClient.h
@@ -133,6 +133,8 @@
sp<IFrontend> openHidlFrontendById(int id);
sp<IDemux> openHidlDemux();
Result getHidlFrontendInfo(int id, FrontendInfo& info);
+ sp<ILnb> openHidlLnbById(int id);
+ sp<ILnb> openHidlLnbByName(string name, LnbId& lnbId);
FrontendInfo FrontendInfoAidlToHidl(TunerServiceFrontendInfo aidlFrontendInfo);
int getResourceIdFromHandle(int handle, int resourceType);