m_iRetryLineTimeout(3),
m_iLastTransmission(0),
m_bMonitor(true),
- m_addrAllocator(NULL)
+ m_addrAllocator(NULL),
+ m_bStallCommunication(false)
{
m_busDevices = new CCECDeviceMap(this);
}
CCECProcessor::~CCECProcessor(void)
{
+ m_bStallCommunication = false;
DELETE_AND_NULL(m_addrAllocator);
Close();
DELETE_AND_NULL(m_busDevices);
}
}
+ // wait until we finished allocating a new LA if it got lost
+ while (m_bStallCommunication) Sleep(5);
+
{
CLockObject lock(m_mutex);
m_iLastTransmission = GetTimeMs();
iLineTimeout = m_iRetryLineTimeout;
}
- return adapterState == ADAPTER_MESSAGE_STATE_SENT_ACKED;
+ return bIsReply ?
+ adapterState == ADAPTER_MESSAGE_STATE_SENT_ACKED || adapterState == ADAPTER_MESSAGE_STATE_SENT || adapterState == ADAPTER_MESSAGE_STATE_WAITING_TO_BE_SENT :
+ adapterState == ADAPTER_MESSAGE_STATE_SENT_ACKED;
}
void CCECProcessor::TransmitAbort(cec_logical_address source, cec_logical_address destination, cec_opcode opcode, cec_abort_reason reason /* = CEC_ABORT_REASON_UNRECOGNIZED_OPCODE */)
// set the new ackmask
SetLogicalAddresses(GetLogicalAddresses());
+ // resume outgoing communication
+ m_bStallCommunication = false;
+
return true;
}
void CCECProcessor::HandleLogicalAddressLost(cec_logical_address oldAddress)
{
+ // stall outgoing messages until we know our new LA
+ m_bStallCommunication = true;
+
m_libcec->AddLog(CEC_LOG_NOTICE, "logical address %x was taken by another device, allocating a new address", oldAddress);
CCECClient* client = GetClient(oldAddress);
if (client)
}
}
+uint16_t CCECProcessor::GetAdapterVendorId(void) const
+{
+ return m_communication ? m_communication->GetAdapterVendorId() : 0;
+}
+
+uint16_t CCECProcessor::GetAdapterProductId(void) const
+{
+ return m_communication ? m_communication->GetAdapterProductId() : 0;
+}
+
CCECAllocateLogicalAddress::CCECAllocateLogicalAddress(CCECProcessor* processor, CCECClient* client) :
m_processor(processor),
m_client(client) { }