static_cast<CRPiCECAdapterCommunication *>(callback_data)->OnDataReceived(p0, p1, p2, p3, p4);
}
-CRPiCECAdapterFindNewLogicalAddress::CRPiCECAdapterFindNewLogicalAddress(CRPiCECAdapterCommunication* communication, const cec_logical_address address) :
- m_communication(communication),
- m_address(address) { }
-
-void *CRPiCECAdapterFindNewLogicalAddress::Process(void)
-{
- cec_logical_address newAddress(CECDEVICE_UNKNOWN);
- for (unsigned int iLA = CECDEVICE_RECORDINGDEVICE1; newAddress == CECDEVICE_UNKNOWN && iLA < CECDEVICE_BROADCAST; iLA++)
- {
- if (CCECTypeUtils::GetType((cec_logical_address)iLA) == CCECTypeUtils::GetType(m_address) &&
- m_communication->SupportsSourceLogicalAddress((cec_logical_address)iLA) &&
- m_communication->RegisterLogicalAddress((cec_logical_address)iLA))
- newAddress = (cec_logical_address)iLA;
- }
-
- m_communication->m_callback->HandleLogicalAddressLost(m_address, newAddress);
- return NULL;
-}
-
CRPiCECAdapterCommunication::CRPiCECAdapterCommunication(IAdapterCommunicationCallback *callback) :
IAdapterCommunication(callback),
m_logicalAddress(CECDEVICE_UNKNOWN),
m_bLogicalAddressChanged(false),
- m_laLost(NULL)
+ m_previousLogicalAddress(CECDEVICE_FREEUSE)
{
m_queue = new CRPiCECAdapterMessageQueue(this);
}
CRPiCECAdapterCommunication::~CRPiCECAdapterCommunication(void)
{
- if (m_laLost)
- {
- m_laLost->StopThread();
- delete m_laLost;
- m_laLost = NULL;
- }
delete(m_queue);
Close();
}
case VC_CEC_LOGICAL_ADDR:
{
CLockObject lock(m_mutex);
+ m_previousLogicalAddress = m_logicalAddress;
if (CEC_CB_RC(header) == VCHIQ_SUCCESS)
{
m_bLogicalAddressChanged = true;
}
else
{
- m_logicalAddress = CECDEVICE_BROADCAST;
+ m_logicalAddress = CECDEVICE_FREEUSE;
LIB_CEC->AddLog(CEC_LOG_DEBUG, "failed to change the logical address, reset to %s (%x)", LIB_CEC->ToString(m_logicalAddress), m_logicalAddress);
}
m_logicalAddressCondition.Signal();
case VC_CEC_LOGICAL_ADDR_LOST:
{
// the logical address was taken by another device
- cec_logical_address previousAddress = m_logicalAddress;
+ cec_logical_address previousAddress = m_logicalAddress == CECDEVICE_BROADCAST ? m_previousLogicalAddress : m_logicalAddress;
m_logicalAddress = CECDEVICE_UNKNOWN;
- if (m_laLost && !m_laLost->IsRunning())
- delete m_laLost;
- m_laLost = new CRPiCECAdapterFindNewLogicalAddress(this, previousAddress);
- if (m_laLost)
- m_laLost->CreateThread();
+ // notify libCEC that we lost our LA when the connection was initialised
+ if (m_bInitialised)
+ m_callback->HandleLogicalAddressLost(previousAddress);
}
break;
case VC_CEC_TOPOLOGY: