cec: cleaned up processor thread start
authorLars Op den Kamp <lars@opdenkamp.eu>
Thu, 22 Dec 2011 21:35:57 +0000 (22:35 +0100)
committerLars Op den Kamp <lars@opdenkamp.eu>
Thu, 22 Dec 2011 21:35:57 +0000 (22:35 +0100)
src/lib/CECProcessor.cpp

index 5b1c06ea98b39e2da2da9f206a7803243452680d..27bca694646f05378cc4a085c4b08e4dcdf08acd 100644 (file)
@@ -129,61 +129,68 @@ CCECProcessor::~CCECProcessor(void)
 
 bool CCECProcessor::Start(const char *strPort, uint16_t iBaudRate /* = 38400 */, uint32_t iTimeoutMs /* = 10000 */)
 {
-  CLockObject lock(&m_mutex);
-  if (!m_communication || m_communication->IsOpen())
-  {
-    m_controller->AddLog(CEC_LOG_ERROR, "connection already opened");
-    return false;
-  }
+  bool bReturn(false);
 
-  if (!m_communication->Open(strPort, iBaudRate, iTimeoutMs))
   {
-    m_controller->AddLog(CEC_LOG_ERROR, "could not open a connection");
-    return false;
-  }
+    CLockObject lock(&m_mutex);
 
-  if (CreateThread())
-  {
-    if (!m_startCondition.Wait(&m_mutex) || !m_bStarted)
+    /* check for an already opened connection */
+    if (!m_communication || m_communication->IsOpen())
     {
-      m_controller->AddLog(CEC_LOG_ERROR, "could not create a processor thread");
-      return false;
+      m_controller->AddLog(CEC_LOG_ERROR, "connection already opened");
+      return bReturn;
     }
-    lock.Leave();
 
-    if (m_logicalAddresses.IsEmpty() && !FindLogicalAddresses())
+    /* open a new connection */
+    if (!m_communication->Open(strPort, iBaudRate, iTimeoutMs))
     {
-      m_controller->AddLog(CEC_LOG_ERROR, "could not detect our logical addresses");
-      StopThread(true);
-      return false;
+      m_controller->AddLog(CEC_LOG_ERROR, "could not open a connection");
+      return bReturn;
     }
-    else
-    {
-      /* only set our OSD name and active source for the primary device */
-      m_busDevices[m_logicalAddresses.primary]->m_strDeviceName = m_strDeviceName;
-      m_busDevices[m_logicalAddresses.primary]->m_bActiveSource = true;
 
-      SetAckMask(m_logicalAddresses.AckMask());
+    /* create the processor thread */
+    if (!CreateThread() || !m_startCondition.Wait(&m_mutex) || !m_bStarted)
+    {
+      m_controller->AddLog(CEC_LOG_ERROR, "could not create a processor thread");
+      return bReturn;
     }
+  }
 
+  /* find the logical address for the adapter */
+  bReturn = m_logicalAddresses.IsEmpty() ? FindLogicalAddresses() : true;
+  if (!bReturn)
+    m_controller->AddLog(CEC_LOG_ERROR, "could not detect our logical addresses");
+
+  /* set the physical address for the adapter */
+  if (bReturn)
+  {
+    /* only set our OSD name for the primary device */
+    m_busDevices[m_logicalAddresses.primary]->m_strDeviceName = m_strDeviceName;
+
+    /* get the vendor id from the TV, so we are using the correct handler */
     m_busDevices[CECDEVICE_TV]->GetVendorId();
 
-    if (SetHDMIPort(m_iBaseDevice, m_iHDMIPort, true))
-    {
-      /* init the handler */
-      m_busDevices[CECDEVICE_TV]->GetHandler()->InitHandler();
+    bReturn = SetHDMIPort(m_iBaseDevice, m_iHDMIPort, true);
+  }
 
-      m_controller->AddLog(CEC_LOG_DEBUG, "processor thread started");
-      return true;
-    }
-    else
-    {
-      m_controller->AddLog(CEC_LOG_ERROR, "failed to initialise the processor");
-    }
+  /* make the primary device the active source */
+  if (bReturn)
+  {
+    m_busDevices[m_logicalAddresses.primary]->m_bActiveSource = true;
+    bReturn = m_busDevices[CECDEVICE_TV]->GetHandler()->InitHandler();
   }
 
-  m_controller->AddLog(CEC_LOG_ERROR, "could not create a processor thread");
-  return false;
+  if (bReturn)
+  {
+    m_controller->AddLog(CEC_LOG_DEBUG, "processor thread started");
+  }
+  else
+  {
+    m_controller->AddLog(CEC_LOG_ERROR, "could not create a processor thread");
+    StopThread(true);
+  }
+
+  return bReturn;
 }
 
 bool CCECProcessor::TryLogicalAddress(cec_logical_address address)
@@ -252,6 +259,9 @@ bool CCECProcessor::FindLogicalAddresses(void)
       bReturn &= FindLogicalAddressAudioSystem();
   }
 
+  if (bReturn)
+    SetAckMask(m_logicalAddresses.AckMask());
+
   return bReturn;
 }
 
@@ -417,12 +427,7 @@ bool CCECProcessor::SetHDMIPort(cec_logical_address iBaseDevice, uint8_t iPort,
   if (iBaseDevice > CECDEVICE_TV)
     iPhysicalAddress = m_busDevices[iBaseDevice]->GetPhysicalAddress();
 
-  if (iPhysicalAddress == 0xffff)
-  {
-    SetPhysicalAddress((uint16_t)iPort * 0x1000);
-    bReturn = false;
-  }
-  else
+  if (iPhysicalAddress < 0xffff)
   {
     if (iPhysicalAddress == 0)
       iPhysicalAddress += 0x1000 * iPort;
@@ -437,6 +442,9 @@ bool CCECProcessor::SetHDMIPort(cec_logical_address iBaseDevice, uint8_t iPort,
     bReturn = true;
   }
 
+  if (!bReturn)
+    m_controller->AddLog(CEC_LOG_ERROR, "failed to set the physical address");
+
   return bReturn;
 }