Fix issues in Tuner Service implementation
This CL fixes the following bugs:
1. Missing Tuner HAL version check API
2. hidl_array init issue when converting ip settings
3. Missing handling the aidl service binding error
Test: atest android.media.tv.tuner.cts
Bug: 159067322
Change-Id: Ib43cedccb062e7849b5133e03c74c58c9e082437
diff --git a/services/tuner/TunerFilter.cpp b/services/tuner/TunerFilter.cpp
index af5a600..aee864d 100644
--- a/services/tuner/TunerFilter.cpp
+++ b/services/tuner/TunerFilter.cpp
@@ -285,6 +285,7 @@
.srcPort = static_cast<uint16_t>(ipConf.ipAddr.srcPort),
.dstPort = static_cast<uint16_t>(ipConf.ipAddr.dstPort),
};
+
ipConf.ipAddr.srcIpAddress.isIpV6
? ipAddr.srcIpAddress.v6(getIpV6Address(ipConf.ipAddr.srcIpAddress))
: ipAddr.srcIpAddress.v4(getIpV4Address(ipConf.ipAddr.srcIpAddress));
@@ -314,7 +315,7 @@
}
hidl_array<uint8_t, IP_V6_LENGTH> TunerFilter::getIpV6Address(TunerDemuxIpAddress addr) {
- hidl_array<uint8_t, IP_V6_LENGTH> ip = {0};
+ hidl_array<uint8_t, IP_V6_LENGTH> ip;
if (addr.addr.size() != IP_V6_LENGTH) {
return ip;
}
@@ -323,7 +324,7 @@
}
hidl_array<uint8_t, IP_V4_LENGTH> TunerFilter::getIpV4Address(TunerDemuxIpAddress addr) {
- hidl_array<uint8_t, IP_V4_LENGTH> ip = {0};
+ hidl_array<uint8_t, IP_V4_LENGTH> ip;
if (addr.addr.size() != IP_V4_LENGTH) {
return ip;
}
@@ -620,16 +621,17 @@
switch (eventExt.getDiscriminator()) {
case DemuxFilterEventExt::Event::hidl_discriminator::monitorEvent: {
getMonitorEvent(eventsExt, tunerEvent);
- break;
+ return;
}
case DemuxFilterEventExt::Event::hidl_discriminator::startId: {
getRestartEvent(eventsExt, tunerEvent);
- break;
+ return;
}
default: {
break;
}
}
+ return;
}
if (!events.empty()) {
@@ -889,9 +891,6 @@
tunerMonitor.set<TunerFilterMonitorEvent::cid>(static_cast<int>(monitorEvent.cid()));
break;
}
- default: {
- break;
- }
}
TunerFilterEvent tunerEvent;
diff --git a/services/tuner/TunerFrontend.cpp b/services/tuner/TunerFrontend.cpp
index b85e58b..68c35f6 100644
--- a/services/tuner/TunerFrontend.cpp
+++ b/services/tuner/TunerFrontend.cpp
@@ -804,13 +804,13 @@
case FrontendStatusExt1_1::hidl_discriminator::rollOff: {
switch (s.rollOff().getDiscriminator()) {
case FrontendRollOff::hidl_discriminator::dvbs:
- status.set<TunerFrontendStatus::interleaving>((int)s.rollOff().dvbs());
+ status.set<TunerFrontendStatus::rollOff>((int)s.rollOff().dvbs());
break;
case FrontendRollOff::hidl_discriminator::isdbs:
- status.set<TunerFrontendStatus::interleaving>((int)s.rollOff().isdbs());
+ status.set<TunerFrontendStatus::rollOff>((int)s.rollOff().isdbs());
break;
case FrontendRollOff::hidl_discriminator::isdbs3:
- status.set<TunerFrontendStatus::interleaving>((int)s.rollOff().isdbs3());
+ status.set<TunerFrontendStatus::rollOff>((int)s.rollOff().isdbs3());
break;
}
aidlStatus.push_back(status);
diff --git a/services/tuner/TunerService.cpp b/services/tuner/TunerService.cpp
index 4f6f16c..b80fd85 100644
--- a/services/tuner/TunerService.cpp
+++ b/services/tuner/TunerService.cpp
@@ -52,10 +52,10 @@
TunerService::TunerService() {}
TunerService::~TunerService() {}
-void TunerService::instantiate() {
+binder_status_t TunerService::instantiate() {
shared_ptr<TunerService> service =
::ndk::SharedRefBase::make<TunerService>();
- AServiceManager_addService(service->asBinder().get(), getServiceName());
+ return AServiceManager_addService(service->asBinder().get(), getServiceName());
}
bool TunerService::hasITuner() {
@@ -68,23 +68,20 @@
ALOGE("Failed to get ITuner service");
return false;
}
+ mTunerVersion = TUNER_HAL_VERSION_1_0;
+ mTuner_1_1 = ::android::hardware::tv::tuner::V1_1::ITuner::castFrom(mTuner);
+ if (mTuner_1_1 != nullptr) {
+ mTunerVersion = TUNER_HAL_VERSION_1_1;
+ } else {
+ ALOGE("Failed to get ITuner_1_1 service");
+ }
return true;
}
bool TunerService::hasITuner_1_1() {
ALOGD("hasITuner_1_1");
- if (mTuner_1_1 != nullptr) {
- return true;
- }
- if (!hasITuner()) {
- return false;
- }
- mTuner_1_1 = ::android::hardware::tv::tuner::V1_1::ITuner::castFrom(mTuner);
- if (mTuner_1_1 == nullptr) {
- ALOGE("Failed to get ITuner_1_1 service");
- return false;
- }
- return true;
+ hasITuner();
+ return (mTunerVersion == TUNER_HAL_VERSION_1_1);
}
Status TunerService::openDemux(
@@ -300,6 +297,12 @@
return Status::ok();
}
+Status TunerService::getTunerHalVersion(int* _aidl_return) {
+ hasITuner();
+ *_aidl_return = mTunerVersion;
+ return Status::ok();
+}
+
void TunerService::updateFrontendResources() {
hidl_vec<FrontendId> ids;
Result res = getHidlFrontendIds(ids);
diff --git a/services/tuner/TunerService.h b/services/tuner/TunerService.h
index ce085cb..cc65b39 100644
--- a/services/tuner/TunerService.h
+++ b/services/tuner/TunerService.h
@@ -69,6 +69,10 @@
namespace android {
+const static int TUNER_HAL_VERSION_UNKNOWN = 0;
+const static int TUNER_HAL_VERSION_1_0 = 1 << 16;
+const static int TUNER_HAL_VERSION_1_1 = (1 << 16) | 1;
+
typedef enum {
FRONTEND,
LNB,
@@ -93,7 +97,7 @@
public:
static char const *getServiceName() { return "media.tuner"; }
- static void instantiate();
+ static binder_status_t instantiate();
TunerService();
virtual ~TunerService();
@@ -110,6 +114,7 @@
Status openDescrambler(int32_t descramblerHandle,
std::shared_ptr<ITunerDescrambler>* _aidl_return) override;
Status updateTunerResources() override;
+ Status getTunerHalVersion(int* _aidl_return) override;
// TODO: create a map between resource id and handles.
static int getResourceIdFromHandle(int resourceHandle, int /*type*/) {
@@ -141,6 +146,8 @@
shared_ptr<ITunerResourceManager> mTunerResourceManager;
int mResourceRequestCount = 0;
+
+ int mTunerVersion = TUNER_HAL_VERSION_UNKNOWN;
};
} // namespace android
diff --git a/services/tuner/aidl/android/media/tv/tuner/ITunerService.aidl b/services/tuner/aidl/android/media/tv/tuner/ITunerService.aidl
index bea8811..f1651b9 100644
--- a/services/tuner/aidl/android/media/tv/tuner/ITunerService.aidl
+++ b/services/tuner/aidl/android/media/tv/tuner/ITunerService.aidl
@@ -101,4 +101,11 @@
*/
// TODO: b/178124017 update TRM in TunerService independently.
void updateTunerResources();
+
+ /**
+ * Get an integer that carries the Tuner HIDL version. The high 16 bits are the
+ * major version number while the low 16 bits are the minor version. Default
+ * value is unknown version 0.
+ */
+ int getTunerHalVersion();
}
diff --git a/services/tuner/main_tunerservice.cpp b/services/tuner/main_tunerservice.cpp
index a0e7a9f..586a0e2 100644
--- a/services/tuner/main_tunerservice.cpp
+++ b/services/tuner/main_tunerservice.cpp
@@ -32,7 +32,11 @@
sp<IServiceManager> sm = defaultServiceManager();
ALOGD("ServiceManager: %p", sm.get());
- TunerService::instantiate();
+ binder_status_t status = TunerService::instantiate();
+ if (status != STATUS_OK) {
+ ALOGD("Failed to add tuner service as AIDL interface");
+ return -1;
+ }
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();