4848#define AVINPUT_METHOD_GET_EDID_VERSION " getEdidVersion"
4949#define AVINPUT_METHOD_SET_EDID_ALLM_SUPPORT " setEdid2AllmSupport"
5050#define AVINPUT_METHOD_GET_EDID_ALLM_SUPPORT " getEdid2AllmSupport"
51+ #define AVINPUT_METHOD_SET_VRR_SUPPORT " setVRRSupport"
52+ #define AVINPUT_METHOD_GET_VRR_SUPPORT " getVRRSupport"
53+ #define AVINPUT_METHOD_GET_VRR_FRAME_RATE " getVRRFrameRate"
5154#define AVINPUT_METHOD_GET_HDMI_COMPATIBILITY_VERSION " getHdmiVersion"
5255#define AVINPUT_METHOD_SET_MIXER_LEVELS " setMixerLevels"
5356#define AVINPUT_METHOD_START_INPUT " startInput"
6568#define AVINPUT_EVENT_ON_GAME_FEATURE_STATUS_CHANGED " gameFeatureStatusUpdate"
6669#define AVINPUT_EVENT_ON_AVI_CONTENT_TYPE_CHANGED " aviContentTypeUpdate"
6770
71+ #define STR_ALLM " ALLM"
72+ #define VRR_TYPE_HDMI " VRR-HDMI"
73+ #define VRR_TYPE_FREESYNC " VRR-FREESYNC"
74+ #define VRR_TYPE_FREESYNC_PREMIUM " VRR-FREESYNC-PREMIUM"
75+ #define VRR_TYPE_FREESYNC_PREMIUM_PRO " VRR-FREESYNC-PREMIUM-PRO"
76+
6877static bool isAudioBalanceSet = false ;
6978static int planeType = 0 ;
7079
@@ -156,7 +165,11 @@ void AVInput::InitializeIARM()
156165 IARM_BUS_DSMGR_NAME,
157166 IARM_BUS_DSMGR_EVENT_HDMI_IN_ALLM_STATUS,
158167 dsAVGameFeatureStatusEventHandler));
159- IARM_CHECK (IARM_Bus_RegisterEventHandler (
168+ IARM_CHECK (IARM_Bus_RegisterEventHandler (
169+ IARM_BUS_DSMGR_NAME,
170+ IARM_BUS_DSMGR_EVENT_HDMI_IN_VRR_STATUS,
171+ dsAVGameFeatureStatusEventHandler));
172+ IARM_CHECK (IARM_Bus_RegisterEventHandler (
160173 IARM_BUS_DSMGR_NAME,
161174 IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_HOTPLUG,
162175 dsAVEventHandler));
@@ -198,6 +211,9 @@ void AVInput::DeinitializeIARM()
198211 IARM_CHECK (IARM_Bus_RemoveEventHandler (
199212 IARM_BUS_DSMGR_NAME,
200213 IARM_BUS_DSMGR_EVENT_HDMI_IN_ALLM_STATUS, dsAVGameFeatureStatusEventHandler));
214+ IARM_CHECK (IARM_Bus_RemoveEventHandler (
215+ IARM_BUS_DSMGR_NAME,
216+ IARM_BUS_DSMGR_EVENT_HDMI_IN_VRR_STATUS, dsAVGameFeatureStatusEventHandler));
201217 IARM_CHECK (IARM_Bus_RemoveEventHandler (
202218 IARM_BUS_DSMGR_NAME,
203219 IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_HOTPLUG, dsAVEventHandler));
@@ -231,6 +247,9 @@ void AVInput::RegisterAll()
231247 Register<JsonObject, JsonObject>(_T (AVINPUT_METHOD_SET_MIXER_LEVELS), &AVInput::setMixerLevels, this );
232248 Register<JsonObject, JsonObject>(_T (AVINPUT_METHOD_SET_EDID_ALLM_SUPPORT), &AVInput::setEdid2AllmSupportWrapper, this );
233249 Register<JsonObject, JsonObject>(_T (AVINPUT_METHOD_GET_EDID_ALLM_SUPPORT), &AVInput::getEdid2AllmSupportWrapper, this );
250+ Register<JsonObject, JsonObject>(_T (AVINPUT_METHOD_SET_VRR_SUPPORT), &AVInput::setVRRSupportWrapper, this );
251+ Register<JsonObject, JsonObject>(_T (AVINPUT_METHOD_GET_VRR_SUPPORT), &AVInput::getVRRSupportWrapper, this );
252+ Register<JsonObject, JsonObject>(_T (AVINPUT_METHOD_GET_VRR_FRAME_RATE), &AVInput::getVRRFrameRateWrapper, this );
234253 Register<JsonObject, JsonObject>(_T (AVINPUT_METHOD_GET_HDMI_COMPATIBILITY_VERSION), &AVInput::getHdmiVersionWrapper, this );
235254 Register<JsonObject, JsonObject>(_T (AVINPUT_METHOD_START_INPUT), &AVInput::startInput, this );
236255 Register<JsonObject, JsonObject>(_T (AVINPUT_METHOD_STOP_INPUT), &AVInput::stopInput, this );
@@ -239,6 +258,7 @@ void AVInput::RegisterAll()
239258 Register<JsonObject, JsonObject>(_T (AVINPUT_METHOD_GAME_FEATURE_STATUS), &AVInput::getGameFeatureStatusWrapper, this );
240259 m_primVolume = DEFAULT_PRIM_VOL_LEVEL;
241260 m_inputVolume = DEFAULT_INPUT_VOL_LEVEL;
261+ m_currentVrrType = dsVRR_NONE;
242262}
243263
244264void AVInput::UnregisterAll ()
@@ -251,6 +271,9 @@ void AVInput::UnregisterAll()
251271 Unregister (_T (AVINPUT_METHOD_READ_EDID));
252272 Unregister (_T (AVINPUT_METHOD_READ_RAWSPD));
253273 Unregister (_T (AVINPUT_METHOD_READ_SPD));
274+ Unregister (_T (AVINPUT_METHOD_SET_VRR_SUPPORT));
275+ Unregister (_T (AVINPUT_METHOD_GET_VRR_SUPPORT));
276+ Unregister (_T (AVINPUT_METHOD_GET_VRR_FRAME_RATE));
254277 Unregister (_T (AVINPUT_METHOD_SET_EDID_VERSION));
255278 Unregister (_T (AVINPUT_METHOD_GET_EDID_VERSION));
256279 Unregister (_T (AVINPUT_METHOD_START_INPUT));
@@ -1024,18 +1047,71 @@ void AVInput::dsAVGameFeatureStatusEventHandler(const char *owner, IARM_EventId_
10241047
10251048 AVInput::_instance->AVInputALLMChange (hdmi_in_port, allm_mode);
10261049 }
1050+ if (IARM_BUS_DSMGR_EVENT_HDMI_IN_VRR_STATUS == eventId)
1051+ {
1052+ IARM_Bus_DSMgr_EventData_t *eventData = (IARM_Bus_DSMgr_EventData_t *)data;
1053+ int hdmi_in_port = eventData->data .hdmi_in_vrr_mode .port ;
1054+ dsVRRType_t new_vrrType = eventData->data .hdmi_in_vrr_mode .vrr_type ;
1055+ LOGWARN (" Received IARM_BUS_DSMGR_EVENT_HDMI_IN_VRR_STATUS event port: %d, VRR Type: %d" , hdmi_in_port,new_vrrType);
1056+
1057+ if (new_vrrType == dsVRR_NONE)
1058+ {
1059+ if (AVInput::_instance->m_currentVrrType != dsVRR_NONE){
1060+ AVInput::_instance->AVInputVRRChange (hdmi_in_port, AVInput::_instance->m_currentVrrType , false );
1061+ }
1062+ }
1063+ else
1064+ {
1065+ if (AVInput::_instance->m_currentVrrType != dsVRR_NONE){
1066+ AVInput::_instance->AVInputVRRChange (hdmi_in_port, AVInput::_instance->m_currentVrrType , false );
1067+ }
1068+ AVInput::_instance->AVInputVRRChange (hdmi_in_port, new_vrrType, true );
1069+ }
1070+ AVInput::_instance->m_currentVrrType = new_vrrType;
1071+ }
10271072}
10281073
10291074void AVInput::AVInputALLMChange ( int port , bool allm_mode)
10301075{
10311076 JsonObject params;
10321077 params[" id" ] = port;
1033- params[" gameFeature" ] = " ALLM " ;
1078+ params[" gameFeature" ] = STR_ALLM ;
10341079 params[" mode" ] = allm_mode;
10351080
10361081 sendNotify (AVINPUT_EVENT_ON_GAME_FEATURE_STATUS_CHANGED, params);
10371082}
10381083
1084+ void AVInput::AVInputVRRChange ( int port , dsVRRType_t vrr_type, bool vrr_mode)
1085+ {
1086+ JsonObject params;
1087+ switch (vrr_type)
1088+ {
1089+ case dsVRR_HDMI_VRR:
1090+ params[" id" ] = port;
1091+ params[" gameFeature" ] = VRR_TYPE_HDMI;
1092+ params[" mode" ] = vrr_mode;
1093+ break ;
1094+ case dsVRR_AMD_FREESYNC:
1095+ params[" id" ] = port;
1096+ params[" gameFeature" ] = VRR_TYPE_FREESYNC;
1097+ params[" mode" ] = vrr_mode;
1098+ break ;
1099+ case dsVRR_AMD_FREESYNC_PREMIUM:
1100+ params[" id" ] = port;
1101+ params[" gameFeature" ] = VRR_TYPE_FREESYNC_PREMIUM;
1102+ params[" mode" ] = vrr_mode;
1103+ break ;
1104+ case dsVRR_AMD_FREESYNC_PREMIUM_PRO:
1105+ params[" id" ] = port;
1106+ params[" gameFeature" ] = VRR_TYPE_FREESYNC_PREMIUM_PRO;
1107+ params[" mode" ] = vrr_mode;
1108+ break ;
1109+ default :
1110+ break ;
1111+ }
1112+ sendNotify (AVINPUT_EVENT_ON_GAME_FEATURE_STATUS_CHANGED, params);
1113+ }
1114+
10391115uint32_t AVInput::getSupportedGameFeatures (const JsonObject& parameters, JsonObject& response)
10401116{
10411117 LOGINFOMETHOD ();
@@ -1084,15 +1160,55 @@ uint32_t AVInput::getGameFeatureStatusWrapper(const JsonObject& parameters, Json
10841160 returnResponse (false );
10851161 }
10861162
1087- if (strcmp (sGameFeature .c_str (), " ALLM " ) == 0 )
1163+ if (strcmp (sGameFeature .c_str (), STR_ALLM ) == 0 )
10881164 {
10891165 bool allm = getALLMStatus (portId);
10901166 LOGWARN (" AVInput::getGameFeatureStatusWrapper ALLM MODE:%d" , allm);
10911167 response[" mode" ] = allm;
10921168 }
1169+ else if (strcmp (sGameFeature .c_str (), VRR_TYPE_HDMI) == 0 )
1170+ {
1171+ bool hdmi_vrr = false ;
1172+ dsHdmiInVrrStatus_t vrrStatus;
1173+ getVRRStatus (portId, &vrrStatus);
1174+ if (vrrStatus.vrrType == dsVRR_HDMI_VRR)
1175+ hdmi_vrr = true ;
1176+ LOGWARN (" AVInput::getGameFeatureStatusWrapper HDMI VRR MODE:%d" , hdmi_vrr);
1177+ response[" mode" ] = hdmi_vrr;
1178+ }
1179+ else if (strcmp (sGameFeature .c_str (), VRR_TYPE_FREESYNC) == 0 )
1180+ {
1181+ bool freesync = false ;
1182+ dsHdmiInVrrStatus_t vrrStatus;
1183+ getVRRStatus (portId, &vrrStatus);
1184+ if (vrrStatus.vrrType == dsVRR_AMD_FREESYNC)
1185+ freesync = true ;
1186+ LOGWARN (" AVInput::getGameFeatureStatusWrapper FREESYNC MODE:%d" , freesync);
1187+ response[" mode" ] = freesync;
1188+ }
1189+ else if (strcmp (sGameFeature .c_str (), VRR_TYPE_FREESYNC_PREMIUM) == 0 )
1190+ {
1191+ bool freesync_premium = false ;
1192+ dsHdmiInVrrStatus_t vrrStatus;
1193+ getVRRStatus (portId, &vrrStatus);
1194+ if (vrrStatus.vrrType == dsVRR_AMD_FREESYNC_PREMIUM)
1195+ freesync_premium = true ;
1196+ LOGWARN (" AVInput::getGameFeatureStatusWrapper FREESYNC PREMIUM MODE:%d" , freesync_premium);
1197+ response[" mode" ] = freesync_premium;
1198+ }
1199+ else if (strcmp (sGameFeature .c_str (), VRR_TYPE_FREESYNC_PREMIUM_PRO) == 0 )
1200+ {
1201+ bool freesync_premium_pro = false ;
1202+ dsHdmiInVrrStatus_t vrrStatus;
1203+ getVRRStatus (portId, &vrrStatus);
1204+ if (vrrStatus.vrrType == dsVRR_AMD_FREESYNC_PREMIUM_PRO)
1205+ freesync_premium_pro = true ;
1206+ LOGWARN (" AVInput::getGameFeatureStatusWrapper FREESYNC PREMIUM PRO MODE:%d" , freesync_premium_pro);
1207+ response[" mode" ] = freesync_premium_pro;
1208+ }
10931209 else
10941210 {
1095- LOGWARN (" AVInput::getGameFeatureStatusWrapper Mode is not supported. Supported mode: ALLM" );
1211+ LOGWARN (" AVInput::getGameFeatureStatusWrapper Mode is not supported. Supported mode: ALLM, VRR-HDMI, VRR-FREESYNC-PREMIUM " );
10961212 returnResponse (false );
10971213 }
10981214 returnResponse (true );
@@ -1114,6 +1230,22 @@ bool AVInput::getALLMStatus(int iPort)
11141230 return allm;
11151231}
11161232
1233+ bool AVInput::getVRRStatus (int iPort, dsHdmiInVrrStatus_t *vrrStatus)
1234+ {
1235+ bool ret = true ;
1236+ try
1237+ {
1238+ device::HdmiInput::getInstance ().getVRRStatus (iPort, vrrStatus);
1239+ LOGWARN (" AVInput::getVRRStatus VRR TYPE: %d, VRR FRAMERATE: %f" , vrrStatus->vrrType ,vrrStatus->vrrAmdfreesyncFramerate_Hz );
1240+ }
1241+ catch (const device::Exception& err)
1242+ {
1243+ LOG_DEVICE_EXCEPTION1 (std::to_string (iPort));
1244+ ret = false ;
1245+ }
1246+ return ret;
1247+ }
1248+
11171249uint32_t AVInput::getRawSPDWrapper (const JsonObject& parameters, JsonObject& response)
11181250{
11191251 LOGINFOMETHOD ();
@@ -1386,6 +1518,125 @@ uint32_t AVInput::getEdid2AllmSupportWrapper(const JsonObject& parameters, JsonO
13861518 }
13871519}
13881520
1521+ bool AVInput::getVRRSupport (int portId,bool *vrrSupportValue)
1522+ {
1523+ bool ret = true ;
1524+ try
1525+ {
1526+ device::HdmiInput::getInstance ().getVRRSupport (portId, vrrSupportValue);
1527+ LOGINFO (" AVInput - getVRRSupport:%d" , *vrrSupportValue);
1528+ }
1529+ catch (const device::Exception& err)
1530+ {
1531+ LOG_DEVICE_EXCEPTION1 (std::to_string (portId));
1532+ ret = false ;
1533+ }
1534+ return ret;
1535+ }
1536+
1537+ uint32_t AVInput::getVRRSupportWrapper (const JsonObject& parameters, JsonObject& response)
1538+ {
1539+ LOGINFOMETHOD ();
1540+ returnIfParamNotFound (parameters, " portId" );
1541+ string sPortId = parameters[" portId" ].String ();
1542+
1543+ int portId = 0 ;
1544+ bool vrrSupport = true ;
1545+
1546+ try {
1547+ portId = stoi (sPortId );
1548+ }catch (const std::exception& err) {
1549+ LOGWARN (" sPortId invalid paramater: %s " , sPortId .c_str ());
1550+ returnResponse (false );
1551+ }
1552+
1553+ bool result = getVRRSupport (portId, &vrrSupport);
1554+ if (result == true )
1555+ {
1556+ response[" vrrSupport" ] = vrrSupport;
1557+ returnResponse (true );
1558+ }
1559+ else
1560+ {
1561+ returnResponse (false );
1562+ }
1563+ }
1564+
1565+ bool AVInput::setVRRSupport (int portId, bool vrrSupport)
1566+ {
1567+ bool ret = true ;
1568+ try
1569+ {
1570+ device::HdmiInput::getInstance ().setVRRSupport (portId, vrrSupport);
1571+ LOGWARN (" AVInput - vrrSupport:%d" , vrrSupport);
1572+ }
1573+ catch (const device::Exception& err)
1574+ {
1575+ LOG_DEVICE_EXCEPTION1 (std::to_string (portId));
1576+ ret = false ;
1577+ }
1578+ return ret;
1579+
1580+ }
1581+
1582+ uint32_t AVInput::setVRRSupportWrapper (const JsonObject& parameters, JsonObject& response)
1583+ {
1584+ LOGINFOMETHOD ();
1585+
1586+ returnIfParamNotFound (parameters, " portId" );
1587+ returnIfParamNotFound (parameters, " vrrSupport" );
1588+
1589+ int portId = 0 ;
1590+ string sPortId = parameters[" portId" ].String ();
1591+ bool vrrSupport = parameters[" vrrSupport" ].Boolean ();
1592+
1593+ try {
1594+ portId = stoi (sPortId );
1595+ }catch (const std::exception& err) {
1596+ LOGWARN (" sPortId invalid paramater: %s " , sPortId .c_str ());
1597+ returnResponse (false );
1598+ }
1599+
1600+ bool result = setVRRSupport (portId, vrrSupport);
1601+ if (result == true )
1602+ {
1603+ returnResponse (true );
1604+ }
1605+ else
1606+ {
1607+ returnResponse (false );
1608+ }
1609+ }
1610+
1611+ uint32_t AVInput::getVRRFrameRateWrapper (const JsonObject& parameters, JsonObject& response)
1612+ {
1613+ LOGINFOMETHOD ();
1614+ returnIfParamNotFound (parameters, " portId" );
1615+ string sPortId = parameters[" portId" ].String ();
1616+
1617+ int portId = 0 ;
1618+ dsHdmiInVrrStatus_t vrrStatus;
1619+ vrrStatus.vrrAmdfreesyncFramerate_Hz = 0 ;
1620+
1621+ try {
1622+ portId = stoi (sPortId );
1623+ }catch (const std::exception& err) {
1624+ LOGWARN (" sPortId invalid paramater: %s " , sPortId .c_str ());
1625+ returnResponse (false );
1626+ }
1627+
1628+ bool result = getVRRStatus (portId, &vrrStatus);
1629+ if (result == true )
1630+ {
1631+ response[" currentVRRVideoFrameRate" ] = vrrStatus.vrrAmdfreesyncFramerate_Hz ;
1632+ returnResponse (true );
1633+ }
1634+ else
1635+ {
1636+ returnResponse (false );
1637+ }
1638+ }
1639+
13891640uint32_t AVInput::setEdidVersionWrapper (const JsonObject& parameters, JsonObject& response)
13901641{
13911642 LOGINFOMETHOD ();
0 commit comments