m_iStandardLineTimeout(3),
m_iRetryLineTimeout(3),
m_iLastTransmission(0),
- m_bMonitor(true)
+ m_bMonitor(true),
+ m_addrAllocator(NULL)
{
m_busDevices = new CCECDeviceMap(this);
}
CCECProcessor::~CCECProcessor(void)
{
+ DELETE_AND_NULL(m_addrAllocator);
Close();
DELETE_AND_NULL(m_busDevices);
}
UnregisterClients();
}
-void CCECProcessor::HandleLogicalAddressLost(cec_logical_address oldAddress, cec_logical_address newAddress)
+void CCECProcessor::HandleLogicalAddressLost(cec_logical_address oldAddress)
{
- m_libcec->AddLog(CEC_LOG_NOTICE, "logical address %x was taken by another device, changed to %x", oldAddress, newAddress);
+ 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)
{
- if (newAddress == CECDEVICE_UNKNOWN)
- UnregisterClient(client);
- else
- {
- client->m_configuration.logicalAddresses.Unset(oldAddress);
- client->m_configuration.logicalAddresses.Set(newAddress);
- }
+ if (m_addrAllocator)
+ while (m_addrAllocator->IsRunning()) Sleep(5);
+ delete m_addrAllocator;
+
+ m_addrAllocator = new CCECAllocateLogicalAddress(this, client);
+ m_addrAllocator->CreateThread();
}
}
+
+CCECAllocateLogicalAddress::CCECAllocateLogicalAddress(CCECProcessor* processor, CCECClient* client) :
+ m_processor(processor),
+ m_client(client) { }
+
+void* CCECAllocateLogicalAddress::Process(void)
+{
+ m_processor->AllocateLogicalAddresses(m_client);
+ return NULL;
+}
class CCECTuner;
class CCECTV;
class CCECClient;
+ class CCECProcessor;
+
+ class CCECAllocateLogicalAddress : public PLATFORM::CThread
+ {
+ public:
+ CCECAllocateLogicalAddress(CCECProcessor* processor, CCECClient* client);
+ void* Process(void);
+
+ private:
+ CCECProcessor* m_processor;
+ CCECClient* m_client;
+ };
class CCECProcessor : public PLATFORM::CThread, public IAdapterCommunicationCallback
{
CCECClient *GetClient(const cec_logical_address address);
bool OnCommandReceived(const cec_command &command);
- void HandleLogicalAddressLost(cec_logical_address oldAddress, cec_logical_address newAddress);
+ void HandleLogicalAddressLost(cec_logical_address oldAddress);
CCECBusDevice * GetDevice(cec_logical_address address) const;
CCECAudioSystem * GetAudioSystem(void) const;
bool IsRunningLatestFirmware(void);
void SwitchMonitoring(bool bSwitchTo);
+ bool AllocateLogicalAddresses(CCECClient* client);
private:
bool OpenConnection(const char *strPort, uint16_t iBaudRate, uint32_t iTimeoutMs, bool bStartListening = true);
void SetCECInitialised(bool bSetTo = true);
void ResetMembers(void);
- bool AllocateLogicalAddresses(CCECClient* client);
-
bool m_bInitialised;
PLATFORM::CMutex m_mutex;
IAdapterCommunication * m_communication;
CCECDeviceMap * m_busDevices;
std::map<cec_logical_address, CCECClient *> m_clients;
bool m_bMonitor;
+ CCECAllocateLogicalAddress* m_addrAllocator;
};
};
/*!
* @brief Callback method for IAdapterCommunication, called when a logical address that libCEC uses was taken by another device.
* @param oldAddress The logical address that was taken by another device.
- * @param newAddress The new logical address, or CECDEVICE_UNKNOWN if no new LA could be allocated.
*/
- virtual void HandleLogicalAddressLost(cec_logical_address oldAddress, cec_logical_address newAddress) = 0;
+ virtual void HandleLogicalAddressLost(cec_logical_address oldAddress) = 0;
virtual CLibCEC *GetLib(void) const = 0;
};
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_bLogicalAddressChanged(false)
{
m_queue = new CRPiCECAdapterMessageQueue(this);
}
CRPiCECAdapterCommunication::~CRPiCECAdapterCommunication(void)
{
- if (m_laLost)
- {
- m_laLost->StopThread();
- delete m_laLost;
- m_laLost = NULL;
- }
delete(m_queue);
Close();
}
cec_logical_address previousAddress = 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();
+ m_callback->HandleLogicalAddressLost(previousAddress);
}
break;
case VC_CEC_TOPOLOGY:
namespace CEC
{
class CRPiCECAdapterMessageQueue;
- class CRPiCECAdapterCommunication;
-
- class CRPiCECAdapterFindNewLogicalAddress : public PLATFORM::CThread
- {
- public:
- CRPiCECAdapterFindNewLogicalAddress(CRPiCECAdapterCommunication* communication, const cec_logical_address address);
- void *Process(void);
- private:
- CRPiCECAdapterCommunication* m_communication;
- cec_logical_address m_address;
- };
class CRPiCECAdapterCommunication : public IAdapterCommunication
{
- friend class CRPiCECAdapterFindNewLogicalAddress;
-
public:
/*!
* @brief Create a new USB-CEC communication handler.
PLATFORM::CMutex m_mutex;
VCHI_INSTANCE_T m_vchi_instance;
VCHI_CONNECTION_T * m_vchi_connection;
- CRPiCECAdapterFindNewLogicalAddress* m_laLost;
};
};