48
48
#define AVINPUT_METHOD_GET_EDID_VERSION " getEdidVersion"
49
49
#define AVINPUT_METHOD_SET_EDID_ALLM_SUPPORT " setEdid2AllmSupport"
50
50
#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"
51
54
#define AVINPUT_METHOD_GET_HDMI_COMPATIBILITY_VERSION " getHdmiVersion"
52
55
#define AVINPUT_METHOD_SET_MIXER_LEVELS " setMixerLevels"
53
56
#define AVINPUT_METHOD_START_INPUT " startInput"
65
68
#define AVINPUT_EVENT_ON_GAME_FEATURE_STATUS_CHANGED " gameFeatureStatusUpdate"
66
69
#define AVINPUT_EVENT_ON_AVI_CONTENT_TYPE_CHANGED " aviContentTypeUpdate"
67
70
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
+
68
77
static bool isAudioBalanceSet = false ;
69
78
static int planeType = 0 ;
70
79
@@ -156,7 +165,11 @@ void AVInput::InitializeIARM()
156
165
IARM_BUS_DSMGR_NAME,
157
166
IARM_BUS_DSMGR_EVENT_HDMI_IN_ALLM_STATUS,
158
167
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 (
160
173
IARM_BUS_DSMGR_NAME,
161
174
IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_HOTPLUG,
162
175
dsAVEventHandler));
@@ -198,6 +211,9 @@ void AVInput::DeinitializeIARM()
198
211
IARM_CHECK (IARM_Bus_RemoveEventHandler (
199
212
IARM_BUS_DSMGR_NAME,
200
213
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));
201
217
IARM_CHECK (IARM_Bus_RemoveEventHandler (
202
218
IARM_BUS_DSMGR_NAME,
203
219
IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_HOTPLUG, dsAVEventHandler));
@@ -231,6 +247,9 @@ void AVInput::RegisterAll()
231
247
Register<JsonObject, JsonObject>(_T (AVINPUT_METHOD_SET_MIXER_LEVELS), &AVInput::setMixerLevels, this );
232
248
Register<JsonObject, JsonObject>(_T (AVINPUT_METHOD_SET_EDID_ALLM_SUPPORT), &AVInput::setEdid2AllmSupportWrapper, this );
233
249
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 );
234
253
Register<JsonObject, JsonObject>(_T (AVINPUT_METHOD_GET_HDMI_COMPATIBILITY_VERSION), &AVInput::getHdmiVersionWrapper, this );
235
254
Register<JsonObject, JsonObject>(_T (AVINPUT_METHOD_START_INPUT), &AVInput::startInput, this );
236
255
Register<JsonObject, JsonObject>(_T (AVINPUT_METHOD_STOP_INPUT), &AVInput::stopInput, this );
@@ -239,6 +258,7 @@ void AVInput::RegisterAll()
239
258
Register<JsonObject, JsonObject>(_T (AVINPUT_METHOD_GAME_FEATURE_STATUS), &AVInput::getGameFeatureStatusWrapper, this );
240
259
m_primVolume = DEFAULT_PRIM_VOL_LEVEL;
241
260
m_inputVolume = DEFAULT_INPUT_VOL_LEVEL;
261
+ m_currentVrrType = dsVRR_NONE;
242
262
}
243
263
244
264
void AVInput::UnregisterAll ()
@@ -251,6 +271,9 @@ void AVInput::UnregisterAll()
251
271
Unregister (_T (AVINPUT_METHOD_READ_EDID));
252
272
Unregister (_T (AVINPUT_METHOD_READ_RAWSPD));
253
273
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));
254
277
Unregister (_T (AVINPUT_METHOD_SET_EDID_VERSION));
255
278
Unregister (_T (AVINPUT_METHOD_GET_EDID_VERSION));
256
279
Unregister (_T (AVINPUT_METHOD_START_INPUT));
@@ -1024,18 +1047,71 @@ void AVInput::dsAVGameFeatureStatusEventHandler(const char *owner, IARM_EventId_
1024
1047
1025
1048
AVInput::_instance->AVInputALLMChange (hdmi_in_port, allm_mode);
1026
1049
}
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
+ }
1027
1072
}
1028
1073
1029
1074
void AVInput::AVInputALLMChange ( int port , bool allm_mode)
1030
1075
{
1031
1076
JsonObject params;
1032
1077
params[" id" ] = port;
1033
- params[" gameFeature" ] = " ALLM " ;
1078
+ params[" gameFeature" ] = STR_ALLM ;
1034
1079
params[" mode" ] = allm_mode;
1035
1080
1036
1081
sendNotify (AVINPUT_EVENT_ON_GAME_FEATURE_STATUS_CHANGED, params);
1037
1082
}
1038
1083
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
+
1039
1115
uint32_t AVInput::getSupportedGameFeatures (const JsonObject& parameters, JsonObject& response)
1040
1116
{
1041
1117
LOGINFOMETHOD ();
@@ -1084,15 +1160,55 @@ uint32_t AVInput::getGameFeatureStatusWrapper(const JsonObject& parameters, Json
1084
1160
returnResponse (false );
1085
1161
}
1086
1162
1087
- if (strcmp (sGameFeature .c_str (), " ALLM " ) == 0 )
1163
+ if (strcmp (sGameFeature .c_str (), STR_ALLM ) == 0 )
1088
1164
{
1089
1165
bool allm = getALLMStatus (portId);
1090
1166
LOGWARN (" AVInput::getGameFeatureStatusWrapper ALLM MODE:%d" , allm);
1091
1167
response[" mode" ] = allm;
1092
1168
}
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
+ }
1093
1209
else
1094
1210
{
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 " );
1096
1212
returnResponse (false );
1097
1213
}
1098
1214
returnResponse (true );
@@ -1114,6 +1230,22 @@ bool AVInput::getALLMStatus(int iPort)
1114
1230
return allm;
1115
1231
}
1116
1232
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
+
1117
1249
uint32_t AVInput::getRawSPDWrapper (const JsonObject& parameters, JsonObject& response)
1118
1250
{
1119
1251
LOGINFOMETHOD ();
@@ -1386,6 +1518,125 @@ uint32_t AVInput::getEdid2AllmSupportWrapper(const JsonObject& parameters, JsonO
1386
1518
}
1387
1519
}
1388
1520
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
+
1389
1640
uint32_t AVInput::setEdidVersionWrapper (const JsonObject& parameters, JsonObject& response)
1390
1641
{
1391
1642
LOGINFOMETHOD ();
0 commit comments