Skip to content

Commit

Permalink
Merge pull request rdkcentral#2061 from YNM03/main
Browse files Browse the repository at this point in the history
RDKTV-11801: Avoid unecessary Dummy ARC messages sent on coming out o…
  • Loading branch information
anand-ky authored Dec 15, 2021
2 parents 4f63d91 + c77e5fa commit 32be3ac
Show file tree
Hide file tree
Showing 4 changed files with 138 additions and 42 deletions.
135 changes: 97 additions & 38 deletions DisplaySettings/DisplaySettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ using namespace std;
#define HDMICECSINK_ARC_TERMINATION_EVENT "arcTerminationEvent"
#define HDMICECSINK_SHORT_AUDIO_DESCRIPTOR_EVENT "shortAudiodesciptorEvent"
#define HDMICECSINK_SYSTEM_AUDIO_MODE_EVENT "setSystemAudioModeEvent"
#define HDMICECSINK_AUDIO_DEVICE_ADDED_EVENT "reportAudioDeviceAdded"
#define HDMICECSINK_AUDIO_DEVICE_CONNECTED_STATUS_EVENT "reportAudioDeviceConnectedStatus"
#define HDMICECSINK_CEC_ENABLED_EVENT "reportCecEnabledEvent"
#define SERVER_DETAILS "127.0.0.1:9998"
#define WARMING_UP_TIME_IN_SECONDS 5
Expand Down Expand Up @@ -233,6 +233,7 @@ namespace WPEFramework {
m_subscribed = false; //HdmiCecSink event subscription
m_hdmiInAudioDeviceConnected = false;
m_arcAudioEnabled = false;
m_hdmiCecAudioDeviceDetected = false;
m_currentArcRoutingState = ARC_STATE_ARC_TERMINATED;
m_cecArcRoutingThreadRun = false;
isCecArcRoutingThreadEnabled = true;
Expand Down Expand Up @@ -314,12 +315,18 @@ namespace WPEFramework {
catch (const device::Exception& err){
LOG_DEVICE_EXCEPTION1(string("HDMI_ARC0"));
}
try {
m_hdmiCecAudioDeviceDetected = getHdmiCecSinkAudioDeviceConnectedStatus();
}
catch (const device::Exception& err){
LOG_DEVICE_EXCEPTION1(string("HDMI_ARC0"));
}

bool isPluginActivated = Utils::isPluginActivated(HDMICECSINK_CALLSIGN);

if(isPluginActivated) {
if(!m_subscribed) {
if((subscribeForHdmiCecSinkEvent(HDMICECSINK_ARC_INITIATION_EVENT) == Core::ERROR_NONE) && (subscribeForHdmiCecSinkEvent(HDMICECSINK_ARC_TERMINATION_EVENT) == Core::ERROR_NONE) && (subscribeForHdmiCecSinkEvent(HDMICECSINK_SHORT_AUDIO_DESCRIPTOR_EVENT)== Core::ERROR_NONE) && (subscribeForHdmiCecSinkEvent(HDMICECSINK_SYSTEM_AUDIO_MODE_EVENT) == Core::ERROR_NONE) && (subscribeForHdmiCecSinkEvent(HDMICECSINK_AUDIO_DEVICE_ADDED_EVENT) == Core::ERROR_NONE) && (subscribeForHdmiCecSinkEvent(HDMICECSINK_CEC_ENABLED_EVENT) == Core::ERROR_NONE)) {
if((subscribeForHdmiCecSinkEvent(HDMICECSINK_ARC_INITIATION_EVENT) == Core::ERROR_NONE) && (subscribeForHdmiCecSinkEvent(HDMICECSINK_ARC_TERMINATION_EVENT) == Core::ERROR_NONE) && (subscribeForHdmiCecSinkEvent(HDMICECSINK_SHORT_AUDIO_DESCRIPTOR_EVENT)== Core::ERROR_NONE) && (subscribeForHdmiCecSinkEvent(HDMICECSINK_SYSTEM_AUDIO_MODE_EVENT) == Core::ERROR_NONE) && (subscribeForHdmiCecSinkEvent(HDMICECSINK_AUDIO_DEVICE_CONNECTED_STATUS_EVENT) == Core::ERROR_NONE) && (subscribeForHdmiCecSinkEvent(HDMICECSINK_CEC_ENABLED_EVENT) == Core::ERROR_NONE)) {
m_subscribed = true;
LOGINFO("%s: HdmiCecSink event subscription completed.\n",__FUNCTION__);
}
Expand All @@ -339,6 +346,9 @@ namespace WPEFramework {
LOGINFO("%s: Audio Port : [HDMI_ARC0] initialized successfully, enable: %d\n", __FUNCTION__, arcEnable);
}

LOGINFO("m_hdmiCecAudioDeviceDetected status [%d] ... \n", m_hdmiCecAudioDeviceDetected);
if (m_hdmiCecAudioDeviceDetected)
{
//Connected Audio Ports status update is necessary on bootup / power state transitions
sendHdmiCecSinkAudioDevicePowerOn();
LOGINFO("%s: Audio Port : [HDMI_ARC0] sendHdmiCecSinkAudioDevicePowerOn !!! \n", __FUNCTION__);
Expand Down Expand Up @@ -369,6 +379,7 @@ namespace WPEFramework {
catch (const device::Exception& err){
LOG_DEVICE_EXCEPTION1(string("HDMI_ARC0"));
}
} /*m_hdmiCecAudioDeviceDetected */
}
}
else {
Expand Down Expand Up @@ -3447,6 +3458,38 @@ namespace WPEFramework {
return cecEnable;
}

bool DisplaySettings::getHdmiCecSinkAudioDeviceConnectedStatus ()
{
bool success = true;
bool hdmiAudioDeviceDetected = false;

if (Utils::isPluginActivated(HDMICECSINK_CALLSIGN)) {
auto hdmiCecSinkPlugin = getHdmiCecSinkPlugin();
if (!hdmiCecSinkPlugin) {
LOGERR("HdmiCecSink Initialisation failed\n");
}
else {
JsonObject hdmiCecSinkResult;
JsonObject param;

hdmiCecSinkPlugin->Invoke<JsonObject, JsonObject>(2000, "getAudioDeviceConnectedStatus", param, hdmiCecSinkResult);

hdmiAudioDeviceDetected = hdmiCecSinkResult["connected"].Boolean();
LOGINFO("getAudioDeviceConnectedStatus [%d]\n",hdmiAudioDeviceDetected);

if (!hdmiCecSinkResult["success"].Boolean()) {
success = false;
LOGERR("HdmiCecSink Plugin returned error\n");
}
}
}
else {
success = false;
LOGERR("HdmiCecSink plugin not ready\n");
}
return hdmiAudioDeviceDetected;
}

bool DisplaySettings::sendHdmiCecSinkAudioDevicePowerOn ()
{
bool success = true;
Expand Down Expand Up @@ -3858,9 +3901,9 @@ namespace WPEFramework {
} else if(strcmp(eventName, HDMICECSINK_SYSTEM_AUDIO_MODE_EVENT) == 0) {
err =m_client->Subscribe<JsonObject>(1000, eventName
, &DisplaySettings::onSystemAudioModeEventHandler, this);
} else if(strcmp(eventName, HDMICECSINK_AUDIO_DEVICE_ADDED_EVENT) == 0) {
} else if(strcmp(eventName, HDMICECSINK_AUDIO_DEVICE_CONNECTED_STATUS_EVENT) == 0) {
err =m_client->Subscribe<JsonObject>(1000, eventName
, &DisplaySettings::onAudioDeviceAddedEventHandler, this);
, &DisplaySettings::onAudioDeviceConnectedStatusEventHandler, this);
} else if(strcmp(eventName, HDMICECSINK_CEC_ENABLED_EVENT) == 0) {
err =m_client->Subscribe<JsonObject>(1000, eventName
, &DisplaySettings::onCecEnabledEventHandler, this);
Expand Down Expand Up @@ -4089,44 +4132,60 @@ namespace WPEFramework {
}
}

/* Event handler when Audio Device is Added */
void DisplaySettings::onAudioDeviceAddedEventHandler(const JsonObject& parameters)
/* Event handler when Audio Device is Added/Removed */
void DisplaySettings::onAudioDeviceConnectedStatusEventHandler(const JsonObject& parameters)
{
int types = dsAUDIOARCSUPPORT_NONE;
try
{
device::AudioOutputPort aPort = device::Host::getInstance().getAudioOutputPort("HDMI_ARC0");
aPort.getSupportedARCTypes(&types);

LOGINFO("[ Audio Device Added Event], AudioSupport_type [%d], m_hdmiInAudioDeviceConnected [%d], m_currentArcRoutingState [%d], m_cecArcRoutingThreadRun [%d] \n", types, m_hdmiInAudioDeviceConnected, m_currentArcRoutingState, m_cecArcRoutingThreadRun);
if(types & dsAUDIOARCSUPPORT_eARC) {
if(m_hdmiInAudioDeviceConnected == false)
{
m_hdmiInAudioDeviceConnected = true;
LOGINFO("eARC_mode: Notify Audio Port \n");
connectedAudioPortUpdated(dsAUDIOPORT_TYPE_HDMI_ARC, true);
}
}else if(types & dsAUDIOARCSUPPORT_ARC) {
LOGINFO("ARC_mode: settings... \n");
string value;

std::lock_guard<std::mutex> lock(m_arcRoutingStateMutex);
if (parameters.HasLabel("audioDeviceConnected"))
value = parameters["audioDeviceConnected"].String();

if(!value.compare("true")) {
m_hdmiCecAudioDeviceDetected = true;
} else{
m_hdmiCecAudioDeviceDetected = false;
}
LOGINFO("updated m_hdmiCecAudioDeviceDetected status [%d] ... \n", m_hdmiCecAudioDeviceDetected);

if((m_currentArcRoutingState == ARC_STATE_ARC_TERMINATED) && (isCecEnabled == true)) {
LOGINFO("ARC_mode: Send dummy ARC initiation request... \n");
m_currentArcRoutingState = ARC_STATE_REQUEST_ARC_INITIATION;
m_cecArcRoutingThreadRun = true;
LOGINFO("ARC_mode: Notify Arc routing with m_currentArcRoutingStat [%d] \n", DisplaySettings::_instance->m_currentArcRoutingState );
arcRoutingCV.notify_one();
if (m_hdmiCecAudioDeviceDetected)
{
try
{
device::AudioOutputPort aPort = device::Host::getInstance().getAudioOutputPort("HDMI_ARC0");
aPort.getSupportedARCTypes(&types);

LOGINFO("[ Audio Device Added ], AudioSupport_type [%d], m_hdmiInAudioDeviceConnected [%d], m_currentArcRoutingState [%d], m_cecArcRoutingThreadRun [%d] \n", types, m_hdmiInAudioDeviceConnected, m_currentArcRoutingState, m_cecArcRoutingThreadRun);
if(types & dsAUDIOARCSUPPORT_eARC) {
if(m_hdmiInAudioDeviceConnected == false)
{
m_hdmiInAudioDeviceConnected = true;
LOGINFO("eARC_mode: Notify Audio Port \n");
connectedAudioPortUpdated(dsAUDIOPORT_TYPE_HDMI_ARC, true);
}
}else if(types & dsAUDIOARCSUPPORT_ARC) {
LOGINFO("ARC_mode: settings... \n");

std::lock_guard<std::mutex> lock(m_arcRoutingStateMutex);

if((m_currentArcRoutingState == ARC_STATE_ARC_TERMINATED) && (isCecEnabled == true)) {
LOGINFO("ARC_mode: Send dummy ARC initiation request... \n");
m_currentArcRoutingState = ARC_STATE_REQUEST_ARC_INITIATION;
m_cecArcRoutingThreadRun = true;
LOGINFO("ARC_mode: Notify Arc routing with m_currentArcRoutingStat [%d] \n", DisplaySettings::_instance->m_currentArcRoutingState );
arcRoutingCV.notify_one();
}
}else {
LOGINFO("Connected Device doesn't have ARC/eARC capability... \n");
}
}
catch (const device::Exception& err){
LOG_DEVICE_EXCEPTION1(string("HDMI_ARC0"));
}
}else{
LOGINFO("Audio Device is removed \n");
}
}else {
LOGINFO("Connected Device doesn't have ARC/eARC capability... \n");
}
}
catch (const device::Exception& err){
LOG_DEVICE_EXCEPTION1(string("HDMI_ARC0"));
}

}
}

/* DisplaaySettings gets notified whenever CEC is made Enable or Disable */
void DisplaySettings::onCecEnabledEventHandler(const JsonObject& parameters)
Expand Down Expand Up @@ -4166,7 +4225,7 @@ namespace WPEFramework {
bool pluginActivated = Utils::isPluginActivated(HDMICECSINK_CALLSIGN);
LOGWARN ("DisplaySettings::onTimer pluginActivated:%d line:%d", pluginActivated, __LINE__);
if(!m_subscribed) {
if (pluginActivated && (subscribeForHdmiCecSinkEvent(HDMICECSINK_ARC_INITIATION_EVENT) == Core::ERROR_NONE) && (subscribeForHdmiCecSinkEvent(HDMICECSINK_ARC_TERMINATION_EVENT) == Core::ERROR_NONE) && (subscribeForHdmiCecSinkEvent(HDMICECSINK_SHORT_AUDIO_DESCRIPTOR_EVENT)== Core::ERROR_NONE) && (subscribeForHdmiCecSinkEvent(HDMICECSINK_SYSTEM_AUDIO_MODE_EVENT) == Core::ERROR_NONE) && (subscribeForHdmiCecSinkEvent(HDMICECSINK_AUDIO_DEVICE_ADDED_EVENT) == Core::ERROR_NONE) && (subscribeForHdmiCecSinkEvent(HDMICECSINK_CEC_ENABLED_EVENT) == Core::ERROR_NONE))
if (pluginActivated && (subscribeForHdmiCecSinkEvent(HDMICECSINK_ARC_INITIATION_EVENT) == Core::ERROR_NONE) && (subscribeForHdmiCecSinkEvent(HDMICECSINK_ARC_TERMINATION_EVENT) == Core::ERROR_NONE) && (subscribeForHdmiCecSinkEvent(HDMICECSINK_SHORT_AUDIO_DESCRIPTOR_EVENT)== Core::ERROR_NONE) && (subscribeForHdmiCecSinkEvent(HDMICECSINK_SYSTEM_AUDIO_MODE_EVENT) == Core::ERROR_NONE) && (subscribeForHdmiCecSinkEvent(HDMICECSINK_AUDIO_DEVICE_CONNECTED_STATUS_EVENT) == Core::ERROR_NONE) && (subscribeForHdmiCecSinkEvent(HDMICECSINK_CEC_ENABLED_EVENT) == Core::ERROR_NONE))
{
m_subscribed = true;
if (m_timer.isActive()) {
Expand Down
4 changes: 3 additions & 1 deletion DisplaySettings/DisplaySettings.h
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ namespace WPEFramework {
void onARCTerminationEventHandler(const JsonObject& parameters);
void onShortAudioDescriptorEventHandler(const JsonObject& parameters);
void onSystemAudioModeEventHandler(const JsonObject& parameters);
void onAudioDeviceAddedEventHandler(const JsonObject& parameters);
void onAudioDeviceConnectedStatusEventHandler(const JsonObject& parameters);
void onCecEnabledEventHandler(const JsonObject& parameters);
//End events
public:
Expand Down Expand Up @@ -191,6 +191,7 @@ namespace WPEFramework {
bool requestShortAudioDescriptor();
bool sendHdmiCecSinkAudioDevicePowerOn();
bool getHdmiCecSinkCecEnableStatus();
bool getHdmiCecSinkAudioDeviceConnectedStatus();
static void cecArcRoutingThread();
void onTimer();

Expand All @@ -203,6 +204,7 @@ namespace WPEFramework {
std::condition_variable arcRoutingCV;
bool m_hdmiInAudioDeviceConnected;
bool m_arcAudioEnabled;
bool m_hdmiCecAudioDeviceDetected;
JsonObject m_audioOutputPortConfig;
JsonObject getAudioOutputPortConfig() { return m_audioOutputPortConfig; }
static IARM_Bus_PWRMgr_PowerState_t m_powerState;
Expand Down
38 changes: 35 additions & 3 deletions HdmiCecSink/HdmiCecSink.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@
#define HDMICECSINK_METHOD_SEND_AUDIO_DEVICE_POWER_ON "sendAudioDevicePowerOnMessage"
#define HDMICECSINK_METHOD_SEND_KEY_PRESS "sendKeyPressEvent"
#define HDMICECSINK_METHOD_SEND_GIVE_AUDIO_STATUS "sendGetAudioStatusMessage"
#define HDMICECSINK_METHOD_GET_AUDIO_DEVICE_CONNECTED_STATUS "getAudioDeviceConnectedStatus"

#define TEST_ADD 0
#define HDMICECSINK_REQUEST_MAX_RETRY 3
Expand Down Expand Up @@ -97,7 +98,7 @@ enum {
HDMICECSINK_EVENT_STANDBY_MSG_EVENT,
HDMICECSINK_EVENT_SYSTEM_AUDIO_MODE,
HDMICECSINK_EVENT_REPORT_AUDIO_STATUS,
HDMICECSINK_EVENT_AUDIO_DEVICE_ADDED,
HDMICECSINK_EVENT_AUDIO_DEVICE_CONNECTED_STATUS,
HDMICECSINK_EVENT_CEC_ENABLED,
};

Expand All @@ -117,7 +118,7 @@ static char *eventString[] = {
"standbyMessageReceived",
"setSystemAudioModeEvent",
"reportAudioStatusEvent",
"reportAudioDeviceAdded",
"reportAudioDeviceConnectedStatus",
"reportCecEnabledEvent"
};

Expand Down Expand Up @@ -496,6 +497,7 @@ namespace WPEFramework
m_logicalAddressAllocated = LogicalAddress::UNREGISTERED;
m_currentActiveSource = -1;
m_isHdmiInConnected = false;
hdmiCecAudioDeviceConnected = false;
m_pollNextState = POLL_THREAD_STATE_NONE;
m_pollThreadState = POLL_THREAD_STATE_NONE;
dsHdmiInGetNumberOfInputsParam_t hdmiInput;
Expand Down Expand Up @@ -523,6 +525,7 @@ namespace WPEFramework
registerMethod(HDMICECSINK_METHOD_SEND_AUDIO_DEVICE_POWER_ON, &HdmiCecSink::sendAudioDevicePowerOnMsgWrapper, this);
registerMethod(HDMICECSINK_METHOD_SEND_KEY_PRESS,&HdmiCecSink::sendRemoteKeyPressWrapper,this);
registerMethod(HDMICECSINK_METHOD_SEND_GIVE_AUDIO_STATUS,&HdmiCecSink::sendGiveAudioStatusWrapper,this);
registerMethod(HDMICECSINK_METHOD_GET_AUDIO_DEVICE_CONNECTED_STATUS,&HdmiCecSink::getAudioDeviceConnectedStatusWrapper,this);
logicalAddressDeviceType = "None";
logicalAddress = 0xFF;
m_sendKeyEventThreadExit = false;
Expand Down Expand Up @@ -1027,6 +1030,12 @@ namespace WPEFramework
returnResponse(true);
}

uint32_t HdmiCecSink::getAudioDeviceConnectedStatusWrapper(const JsonObject& parameters, JsonObject& response)
{
response["connected"] = getAudioDeviceConnectedStatus();
returnResponse(true);
}

uint32_t HdmiCecSink::getActiveSourceWrapper(const JsonObject& parameters, JsonObject& response)
{
char routeString[1024] = {'\0'};
Expand Down Expand Up @@ -2065,14 +2074,18 @@ namespace WPEFramework
{
LOGINFO(" logicalAddress =%d , Audio device detected, Notify Device Settings", logicalAddress );
params["status"] = string("success");
sendNotify(eventString[HDMICECSINK_EVENT_AUDIO_DEVICE_ADDED], params)
params["audioDeviceConnected"] = string("true");
hdmiCecAudioDeviceConnected = true;
sendNotify(eventString[HDMICECSINK_EVENT_AUDIO_DEVICE_CONNECTED_STATUS], params)
}

sendNotify(eventString[HDMICECSINK_EVENT_DEVICE_ADDED], JsonObject())
}
}

void HdmiCecSink::removeDevice(const int logicalAddress) {
JsonObject params;

if(!HdmiCecSink::_instance)
return;

Expand All @@ -2092,6 +2105,16 @@ namespace WPEFramework
hdmiInputs[i].update(LogicalAddress(LogicalAddress::UNREGISTERED));
}
}

if(logicalAddress == 0x5)
{
LOGINFO(" logicalAddress =%d , Audio device removed, Notify Device Settings", logicalAddress );
params["status"] = string("success");
params["audioDeviceConnected"] = string("false");
hdmiCecAudioDeviceConnected = false;
sendNotify(eventString[HDMICECSINK_EVENT_AUDIO_DEVICE_CONNECTED_STATUS], params)
}

_instance->deviceList[logicalAddress].clear();
sendNotify(eventString[HDMICECSINK_EVENT_DEVICE_REMOVED], JsonObject());
}
Expand Down Expand Up @@ -2729,6 +2752,15 @@ namespace WPEFramework
else
return false;
}

bool HdmiCecSink::getAudioDeviceConnectedStatus()
{
LOGINFO("getAudioDeviceConnectedStatus :%d ", hdmiCecAudioDeviceConnected);
if(true == hdmiCecAudioDeviceConnected)
return true;
else
return false;
}
//Arc Routing related functions
void HdmiCecSink::startArc()
{
Expand Down
3 changes: 3 additions & 0 deletions HdmiCecSink/HdmiCecSink.h
Original file line number Diff line number Diff line change
Expand Up @@ -567,11 +567,13 @@ namespace WPEFramework {
uint32_t sendAudioDevicePowerOnMsgWrapper(const JsonObject& parameters, JsonObject& response);
uint32_t sendRemoteKeyPressWrapper(const JsonObject& parameters, JsonObject& response);
uint32_t sendGiveAudioStatusWrapper(const JsonObject& parameters, JsonObject& response);
uint32_t getAudioDeviceConnectedStatusWrapper(const JsonObject& parameters, JsonObject& response);
//End methods
std::string logicalAddressDeviceType;
bool cecSettingEnabled;
bool cecOTPSettingEnabled;
bool cecEnableStatus;
bool hdmiCecAudioDeviceConnected;
bool m_isHdmiInConnected;
int m_numofHdmiInput;
uint8_t m_deviceType;
Expand Down Expand Up @@ -629,6 +631,7 @@ namespace WPEFramework {
void persistVendorId(unsigned int vendorID);
void setEnabled(bool enabled);
bool getEnabled();
bool getAudioDeviceConnectedStatus();
void CECEnable(void);
void CECDisable(void);
void getPhysicalAddress();
Expand Down

0 comments on commit 32be3ac

Please sign in to comment.