@@ -603,6 +603,9 @@ namespace WPEFramework
603
603
HdmiCecSinkImplementation::HdmiCecSinkImplementation ()
604
604
: _pwrMgrNotification(*this )
605
605
, _registeredEventHandlers(false )
606
+ , msgProcessor(nullptr )
607
+ , msgFrameListener(nullptr )
608
+ , smConnection(nullptr )
606
609
{
607
610
LOGWARN (" Initlaizing HdmiCecSinkImplementation" );
608
611
}
@@ -744,7 +747,7 @@ namespace WPEFramework
744
747
for (int i = 0 ; i < m_numofHdmiInput; i++){
745
748
HdmiPortMap hdmiPort ((uint8_t )i);
746
749
LOGINFO (" Add to vector [%d] \n " , i);
747
- hdmiInputs.push_back (hdmiPort);
750
+ hdmiInputs.push_back (std::move ( hdmiPort) );
748
751
}
749
752
750
753
LOGINFO (" Check the HDMI State \n " );
@@ -809,7 +812,7 @@ namespace WPEFramework
809
812
}
810
813
811
814
812
- const void HdmiCecSinkImplementation::InitializeIARM ()
815
+ void HdmiCecSinkImplementation::InitializeIARM ()
813
816
{
814
817
if (Utils::IARM::init ())
815
818
{
@@ -948,17 +951,17 @@ namespace WPEFramework
948
951
}
949
952
void HdmiCecSinkImplementation::updateArcState ()
950
953
{
954
+ std::lock_guard<std::mutex> lock (_instance->m_arcRoutingStateMutex );
951
955
if ( m_currentArcRoutingState != ARC_STATE_ARC_TERMINATED )
952
956
{
953
957
if (!(hdmiInputs[HdmiArcPortID].m_isConnected ))
954
- {
955
- std::lock_guard<std::mutex> lock (_instance->m_arcRoutingStateMutex );
956
- m_currentArcRoutingState = ARC_STATE_ARC_TERMINATED;
957
- }
958
- else
959
- {
960
- LOGINFO (" updateArcState :not updating ARC state current arc state %d " ,m_currentArcRoutingState);
961
- }
958
+ {
959
+ m_currentArcRoutingState = ARC_STATE_ARC_TERMINATED;
960
+ }
961
+ else
962
+ {
963
+ LOGINFO (" updateArcState :not updating ARC state current arc state %d " ,m_currentArcRoutingState);
964
+ }
962
965
}
963
966
}
964
967
void HdmiCecSinkImplementation::arcStartStopTimerFunction ()
@@ -1027,7 +1030,7 @@ namespace WPEFramework
1027
1030
{
1028
1031
audiodescriptor.Add (descriptor);
1029
1032
}
1030
- HdmiCecSinkImplementation::_instance->Send_ShortAudioDescriptor_Event (audiodescriptor);
1033
+ HdmiCecSinkImplementation::_instance->Send_ShortAudioDescriptor_Event (std::move ( audiodescriptor) );
1031
1034
}
1032
1035
1033
1036
void HdmiCecSinkImplementation::updateCurrentLatency (int videoLatency, bool lowLatencyMode,int audioOutputCompensated, int audioOutputDelay = 0 )
@@ -1545,7 +1548,7 @@ namespace WPEFramework
1545
1548
device.osdName = HdmiCecSinkImplementation::_instance->deviceList [route[i]].m_osdName .toString ().c_str ();
1546
1549
device.vendorID = HdmiCecSinkImplementation::_instance->deviceList [route[i]].m_vendorID .toString ().c_str ();
1547
1550
1548
- paths.push_back ( device);
1551
+ paths.emplace_back ( std::move ( device) );
1549
1552
1550
1553
snprintf (&routeString[stringLength], sizeof (routeString) - stringLength, " %s" , _instance->deviceList [route[i]].m_logicalAddress .toString ().c_str ());
1551
1554
stringLength += _instance->deviceList [route[i]].m_logicalAddress .toString ().length ();
@@ -2953,10 +2956,18 @@ namespace WPEFramework
2953
2956
}
2954
2957
2955
2958
std::unique_lock<std::mutex> lk (_instance->m_pollExitMutex );
2956
- if ( _instance->m_ThreadExitCV .wait_for (lk, std::chrono::milliseconds (_instance->m_sleepTime )) == std::cv_status::timeout )
2959
+ bool signaled = _instance->m_ThreadExitCV .wait_for (
2960
+ lk,
2961
+ std::chrono::milliseconds (_instance->m_sleepTime ),
2962
+ [&]{ return _instance->m_pollThreadExit ; }
2963
+ );
2964
+
2965
+ if (!signaled) {
2966
+ // timeout -> continue polling loop
2957
2967
continue ;
2958
- else
2959
- LOGINFO (" Thread is going to Exit m_pollThreadExit %d\n " , _instance->m_pollThreadExit );
2968
+ } else {
2969
+ LOGINFO (" Thread is going to Exit m_pollThreadExit %d\n " , _instance->m_pollThreadExit );
2970
+ }
2960
2971
2961
2972
}
2962
2973
}
@@ -3059,14 +3070,14 @@ namespace WPEFramework
3059
3070
LibCCEC::getInstance ().addLogicalAddress (logicalAddress);
3060
3071
smConnection->setSource (logicalAddress);
3061
3072
}
3062
- msgProcessor = new HdmiCecSinkProcessor (*smConnection);
3063
- msgFrameListener = new HdmiCecSinkFrameListener (*msgProcessor);
3064
3073
if (smConnection)
3065
3074
{
3066
- LOGWARN (" Start Thread %p" , smConnection );
3075
+ msgProcessor = new HdmiCecSinkProcessor (*smConnection);
3076
+ msgFrameListener = new HdmiCecSinkFrameListener (*msgProcessor);
3077
+ LOGWARN (" Start Thread %p" , smConnection );
3067
3078
m_pollThreadState = POLL_THREAD_STATE_POLL;
3068
- m_pollNextState = POLL_THREAD_STATE_NONE;
3069
- m_pollThreadExit = false ;
3079
+ m_pollNextState = POLL_THREAD_STATE_NONE;
3080
+ m_pollThreadExit = false ;
3070
3081
m_pollThread = std::thread (threadRun);
3071
3082
}
3072
3083
cecEnableStatus = true ;
@@ -3083,7 +3094,7 @@ namespace WPEFramework
3083
3094
3084
3095
void HdmiCecSinkImplementation::CECDisable (void )
3085
3096
{
3086
- std::lock_guard <std::mutex> lock (m_enableMutex);
3097
+ std::unique_lock <std::mutex> lock (m_enableMutex);
3087
3098
JsonObject params;
3088
3099
LOGINFO (" Entered CECDisable " );
3089
3100
if (!cecEnableStatus)
@@ -3094,11 +3105,19 @@ namespace WPEFramework
3094
3105
3095
3106
if (m_currentArcRoutingState != ARC_STATE_ARC_TERMINATED)
3096
3107
{
3108
+ // release enable lock before initiating/ waiting for ARC stop
3109
+ lock.unlock ();
3097
3110
stopArc ();
3098
- while (m_currentArcRoutingState != ARC_STATE_ARC_TERMINATED)
3099
- {
3100
- usleep (500000 );
3111
+
3112
+ // wait for the ARC state to become TERMINATED without holding m_enableMutex
3113
+ const unsigned int maxRetries = 8 ; // e.g. total wait ~4s (8 * 500ms)
3114
+ unsigned int retries = 0 ;
3115
+ while (m_currentArcRoutingState != ARC_STATE_ARC_TERMINATED && retries++ < maxRetries) {
3116
+ usleep (500000 );
3101
3117
}
3118
+
3119
+ // re-acquire the enable lock for the rest of CECDisable cleanup
3120
+ lock.lock ();
3102
3121
}
3103
3122
3104
3123
LOGINFO (" CECDisable ARC stopped " );
0 commit comments