diff --git a/tv/cec/1.0/default/HdmiCecDefault.cpp b/tv/cec/1.0/default/HdmiCecDefault.cpp index 299bcf0c06..18abcada12 100644 --- a/tv/cec/1.0/default/HdmiCecDefault.cpp +++ b/tv/cec/1.0/default/HdmiCecDefault.cpp @@ -16,14 +16,13 @@ #define LOG_TAG "android.hardware.tv.cec@1.0-impl" #include +#include #include #include #include -#include #include #include -#include #include #include @@ -36,18 +35,7 @@ namespace cec { namespace V1_0 { namespace implementation { -// When set to false, all the CEC commands are discarded. True by default after initialization. -bool mCecEnabled; -/* - * When set to false, HAL does not wake up the system upon receiving or - * . True by default after initialization. - */ -bool mWakeupEnabled; - -int mCecFd; -int mExitFd; -pthread_t mEventThread; -sp mCallback; +using android::base::GetUintProperty; HdmiCecDefault::HdmiCecDefault() { mCecFd = -1; @@ -68,7 +56,7 @@ Return HdmiCecDefault::addLogicalAddress(CecLogicalAddress addr) { return Result::FAILURE_INVALID_ARGS; } - struct cec_log_addrs cecLogAddrs; + cec_log_addrs cecLogAddrs; int ret = ioctl(mCecFd, CEC_ADAP_G_LOG_ADDRS, &cecLogAddrs); if (ret) { LOG(ERROR) << "Add logical address failed, Error = " << strerror(errno); @@ -144,7 +132,7 @@ Return HdmiCecDefault::addLogicalAddress(CecLogicalAddress addr) { } Return HdmiCecDefault::clearLogicalAddress() { - struct cec_log_addrs cecLogAddrs; + cec_log_addrs cecLogAddrs; memset(&cecLogAddrs, 0, sizeof(cecLogAddrs)); int ret = ioctl(mCecFd, CEC_ADAP_S_LOG_ADDRS, &cecLogAddrs); if (ret) { @@ -170,7 +158,7 @@ Return HdmiCecDefault::sendMessage(const CecMessage& message) return SendMessageResult::FAIL; } - struct cec_msg cecMsg; + cec_msg cecMsg; memset(&cecMsg, 0, sizeof(cec_msg)); int initiator = static_cast(message.initiator); @@ -233,7 +221,7 @@ Return HdmiCecDefault::getPortInfo(getPortInfo_cb callback) { LOG(ERROR) << "Get port info failed, Error = " << strerror(errno); } - unsigned int type = property_get_int32("ro.hdmi.device_type", CEC_DEVICE_PLAYBACK); + uint32_t type = GetUintProperty("ro.hdmi.device_type", CEC_DEVICE_PLAYBACK); hidl_vec portInfos(1); portInfos[0] = {.type = (type == CEC_DEVICE_TV ? HdmiPortType::INPUT : HdmiPortType::OUTPUT), .portId = 1, @@ -297,7 +285,7 @@ Return HdmiCecDefault::init() { } // Ensure the CEC device supports required capabilities - struct cec_caps caps = {}; + cec_caps caps = {}; int ret = ioctl(mCecFd, CEC_ADAP_G_CAPS, &caps); if (ret) { LOG(ERROR) << "Unable to query cec adapter capabilities, Error = " << strerror(errno); @@ -319,12 +307,7 @@ Return HdmiCecDefault::init() { return Result::FAILURE_NOT_SUPPORTED; } - /* thread loop for receiving cec messages and hotplug events*/ - if (pthread_create(&mEventThread, NULL, event_thread, NULL)) { - LOG(ERROR) << "Can't create event thread: " << strerror(errno); - release(); - return Result::FAILURE_NOT_SUPPORTED; - } + mEventThread = thread(&HdmiCecDefault::event_thread, this); mCecEnabled = true; mWakeupEnabled = true; @@ -335,7 +318,9 @@ Return HdmiCecDefault::release() { if (mExitFd > 0) { uint64_t tmp = 1; write(mExitFd, &tmp, sizeof(tmp)); - pthread_join(mEventThread, NULL); + if (mEventThread.joinable()) { + mEventThread.join(); + } } if (mExitFd > 0) { close(mExitFd); @@ -349,8 +334,8 @@ Return HdmiCecDefault::release() { return Void(); } -void* HdmiCecDefault::event_thread(void*) { - struct pollfd ufds[3] = { +void HdmiCecDefault::event_thread() { + pollfd ufds[3] = { {mCecFd, POLLIN, 0}, {mCecFd, POLLERR, 0}, {mExitFd, POLLIN, 0}, @@ -372,18 +357,18 @@ void* HdmiCecDefault::event_thread(void*) { } if (ufds[1].revents == POLLERR) { /* CEC Event */ - struct cec_event ev; + cec_event ev; ret = ioctl(mCecFd, CEC_DQEVENT, &ev); - if (!mCecEnabled) { - continue; - } - if (ret) { LOG(ERROR) << "CEC_DQEVENT failed, Error = " << strerror(errno); continue; } + if (!mCecEnabled) { + continue; + } + if (ev.event == CEC_EVENT_STATE_CHANGE) { if (mCallback != nullptr) { HotplugEvent hotplugEvent{ @@ -397,13 +382,9 @@ void* HdmiCecDefault::event_thread(void*) { } if (ufds[0].revents == POLLIN) { /* CEC Driver */ - struct cec_msg msg = {}; + cec_msg msg = {}; ret = ioctl(mCecFd, CEC_RECEIVE, &msg); - if (!mCecEnabled) { - continue; - } - if (ret) { LOG(ERROR) << "CEC_RECEIVE failed, Error = " << strerror(errno); continue; @@ -414,6 +395,10 @@ void* HdmiCecDefault::event_thread(void*) { continue; } + if (!mCecEnabled) { + continue; + } + if (!mWakeupEnabled && isWakeupMessage(msg)) { LOG(DEBUG) << "Filter wakeup message"; continue; @@ -435,14 +420,13 @@ void* HdmiCecDefault::event_thread(void*) { } } } - return NULL; } -int HdmiCecDefault::getOpcode(struct cec_msg message) { - return (static_cast(message.msg[1]) & 0xff); +int HdmiCecDefault::getOpcode(cec_msg message) { + return static_cast(message.msg[1]); } -bool HdmiCecDefault::isWakeupMessage(struct cec_msg message) { +bool HdmiCecDefault::isWakeupMessage(cec_msg message) { int opcode = getOpcode(message); switch (opcode) { case CEC_MESSAGE_TEXT_VIEW_ON: diff --git a/tv/cec/1.0/default/HdmiCecDefault.h b/tv/cec/1.0/default/HdmiCecDefault.h index c1bb2c74d0..6b850ac40e 100644 --- a/tv/cec/1.0/default/HdmiCecDefault.h +++ b/tv/cec/1.0/default/HdmiCecDefault.h @@ -16,6 +16,8 @@ #include #include +#include +#include namespace android { namespace hardware { @@ -24,7 +26,10 @@ namespace cec { namespace V1_0 { namespace implementation { -struct HdmiCecDefault : public IHdmiCec, public hidl_death_recipient { +using std::thread; + +class HdmiCecDefault : public IHdmiCec, public hidl_death_recipient { + public: HdmiCecDefault(); ~HdmiCecDefault(); // Methods from ::android::hardware::tv::cec::V1_0::IHdmiCec follow. @@ -47,11 +52,26 @@ struct HdmiCecDefault : public IHdmiCec, public hidl_death_recipient { Return init(); Return release(); - static void* event_thread(void*); - static int getOpcode(struct cec_msg message); - static bool isWakeupMessage(struct cec_msg message); -}; + private: + void event_thread(); + static int getOpcode(cec_msg message); + static bool isWakeupMessage(cec_msg message); + + thread mEventThread; + + // When set to false, all the CEC commands are discarded. True by default after initialization. + bool mCecEnabled; + /* + * When set to false, HAL does not wake up the system upon receiving or + * . True by default after initialization. + */ + bool mWakeupEnabled; + sp mCallback; + + int mCecFd; + int mExitFd; +}; } // namespace implementation } // namespace V1_0 } // namespace cec