@@ -601,45 +601,61 @@ namespace WPEFramework
601
601
// =========================================== HdmiCecSinkImplementation =========================================
602
602
603
603
HdmiCecSinkImplementation::HdmiCecSinkImplementation ()
604
- : smConnection(nullptr )
604
+ : deviceList()
605
+ , hdmiInputs()
606
+ , m_currentActiveSource(-1 )
607
+ , m_numberOfDevices(0 )
608
+ , m_audioDevicePowerStatusRequested(false )
609
+ , logicalAddressDeviceType(" None" )
610
+ , cecSettingEnabled(true )
611
+ , cecOTPSettingEnabled(true )
612
+ , cecEnableStatus(false )
613
+ , hdmiCecAudioDeviceConnected(false )
614
+ , m_isHdmiInConnected(false )
615
+ , m_numofHdmiInput(0 )
616
+ , m_deviceType(0 )
617
+ , m_logicalAddressAllocated(LogicalAddress::UNREGISTERED)
618
+ , m_pollThread()
619
+ , m_pollThreadState(POLL_THREAD_STATE_NONE)
620
+ , m_pollNextState(POLL_THREAD_STATE_NONE)
621
+ , m_pollThreadExit(false )
622
+ , m_sleepTime(0 )
623
+ , m_sendKeyEventThreadExit(false )
624
+ , m_sendKeyEventThreadRun(false )
625
+ , m_isAudioStatusInfoUpdated(false )
626
+ , m_audioStatusReceived(false )
627
+ , m_audioStatusTimerStarted(false )
628
+ , m_sendKeyEventThread()
629
+ , m_video_latency(DEFAULT_VIDEO_LATENCY)
630
+ , m_latency_flags(DEFAULT_LATENCY_FLAGS)
631
+ , m_audio_output_delay(DEFAULT_AUDIO_OUTPUT_DELAY)
632
+ , m_arcRoutingThread()
633
+ , m_currentArcRoutingState(ARC_STATE_ARC_TERMINATED)
634
+ , m_semSignaltoArcRoutingThread(0 )
635
+ , m_arcstarting(false )
636
+ , smConnection(nullptr )
637
+ , m_connectedDevices()
605
638
, msgProcessor(nullptr )
606
639
, msgFrameListener(nullptr )
640
+ , _powerManagerPlugin()
607
641
, _pwrMgrNotification(*this )
608
642
, _registeredEventHandlers(false )
609
- {
610
- LOGWARN (" Initlaizing HdmiCecSinkImplementation" );
611
- // Thread/control flags
612
- m_pollThreadState = POLL_THREAD_STATE_NONE;
613
- m_pollNextState = POLL_THREAD_STATE_NONE;
614
- m_pollThreadExit = false ;
615
- m_sleepTime = HDMICECSINK_PING_INTERVAL_MS;
616
-
617
- // Send-key thread flags/queue
618
- m_sendKeyEventThreadExit = false ;
619
- m_sendKeyEventThreadRun = false ;
620
-
621
- // Audio / latency defaults
622
- m_video_latency = DEFAULT_VIDEO_LATENCY;
623
- m_latency_flags = DEFAULT_LATENCY_FLAGS;
624
- m_audio_output_delay = DEFAULT_AUDIO_OUTPUT_DELAY;
643
+ {
644
+ LOGWARN (" Initializing HdmiCecSinkImplementation" );
625
645
626
- // ARC defaults
627
- m_arcstarting = false ;
628
- m_currentArcRoutingState = ARC_STATE_ARC_TERMINATED;
646
+ // Deterministic initialization for all device slots
647
+ for (int i = 0 ; i < 16 ; ++i) {
648
+ deviceList[i].clear ();
649
+ deviceList[i].m_isDevicePresent = false ;
650
+ deviceList[i].m_isRequestRetry = 0 ;
651
+ deviceList[i].m_isRequested = CECDeviceParams::REQUEST_NONE;
652
+ }
629
653
630
- // Device / CEC defaults
631
- m_deviceType = 0 ;
632
- m_numofHdmiInput = 0 ;
633
- m_numberOfDevices = 0 ;
634
- m_logicalAddressAllocated = LogicalAddress::UNREGISTERED;
635
- m_currentActiveSource = -1 ;
636
- m_isHdmiInConnected = false ;
637
- hdmiCecAudioDeviceConnected = false ;
638
- m_isAudioStatusInfoUpdated = false ;
639
- m_audioStatusReceived = false ;
640
- m_audioStatusTimerStarted = false ;
641
- m_audioDevicePowerStatusRequested = false ;
642
- }
654
+ // Ensure queues/flags are clean
655
+ while (!m_SendKeyQueue.empty ()) {
656
+ m_SendKeyQueue.pop ();
657
+ }
658
+ }
643
659
644
660
HdmiCecSinkImplementation::~HdmiCecSinkImplementation ()
645
661
{
@@ -3091,6 +3107,11 @@ namespace WPEFramework
3091
3107
_instance->getPhysicalAddress ();
3092
3108
3093
3109
smConnection = new Connection (LogicalAddress::UNREGISTERED,false ," ServiceManager::Connection::" );
3110
+ if (!smConnection)
3111
+ {
3112
+ LOGERR (" smConnection is NULL" );
3113
+ return ;
3114
+ }
3094
3115
smConnection->open ();
3095
3116
allocateLogicalAddress (DeviceType::TV);
3096
3117
LOGINFO (" logical address allocalted: %x \n " ,m_logicalAddressAllocated);
@@ -3101,16 +3122,15 @@ namespace WPEFramework
3101
3122
LibCCEC::getInstance ().addLogicalAddress (logicalAddress);
3102
3123
smConnection->setSource (logicalAddress);
3103
3124
}
3104
- if (smConnection)
3105
- {
3106
- msgProcessor = new HdmiCecSinkProcessor (*smConnection);
3107
- msgFrameListener = new HdmiCecSinkFrameListener (*msgProcessor);
3108
- LOGWARN (" Start Thread %p" , smConnection );
3109
- m_pollThreadState = POLL_THREAD_STATE_POLL;
3110
- m_pollNextState = POLL_THREAD_STATE_NONE;
3111
- m_pollThreadExit = false ;
3112
- m_pollThread = std::thread (threadRun);
3113
- }
3125
+
3126
+ msgProcessor = new HdmiCecSinkProcessor (*smConnection);
3127
+ msgFrameListener = new HdmiCecSinkFrameListener (*msgProcessor);
3128
+ LOGWARN (" Start Thread %p" , smConnection );
3129
+ m_pollThreadState = POLL_THREAD_STATE_POLL;
3130
+ m_pollNextState = POLL_THREAD_STATE_NONE;
3131
+ m_pollThreadExit = false ;
3132
+ m_pollThread = std::thread (threadRun);
3133
+
3114
3134
cecEnableStatus = true ;
3115
3135
3116
3136
params[" cecEnable" ] = string (" true" );
@@ -3125,7 +3145,7 @@ namespace WPEFramework
3125
3145
3126
3146
void HdmiCecSinkImplementation::CECDisable (void )
3127
3147
{
3128
- std::unique_lock <std::mutex> lock (m_enableMutex);
3148
+ std::lock_guard <std::mutex> lock (m_enableMutex);
3129
3149
JsonObject params;
3130
3150
LOGINFO (" Entered CECDisable " );
3131
3151
if (!cecEnableStatus)
@@ -3136,19 +3156,10 @@ namespace WPEFramework
3136
3156
3137
3157
if (m_currentArcRoutingState != ARC_STATE_ARC_TERMINATED)
3138
3158
{
3139
- // release enable lock before initiating/ waiting for ARC stop
3140
- lock.unlock ();
3141
3159
stopArc ();
3142
-
3143
- // wait for the ARC state to become TERMINATED without holding m_enableMutex
3144
- const unsigned int maxRetries = 8 ; // e.g. total wait ~4s (8 * 500ms)
3145
- unsigned int retries = 0 ;
3146
- while (m_currentArcRoutingState != ARC_STATE_ARC_TERMINATED && retries++ < maxRetries) {
3160
+ while (m_currentArcRoutingState != ARC_STATE_ARC_TERMINATED) {
3147
3161
usleep (500000 );
3148
3162
}
3149
-
3150
- // re-acquire the enable lock for the rest of CECDisable cleanup
3151
- lock.lock ();
3152
3163
}
3153
3164
3154
3165
LOGINFO (" CECDisable ARC stopped " );
0 commit comments