mirror of
https://github.com/storytold/UE4-OSC.git
synced 2026-10-09 00:09:43 +00:00
add the sender IP as a parameter of OnOscReceived events.
This commit is contained in:
@@ -17,5 +17,6 @@
|
|||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <tuple>
|
||||||
|
|
||||||
DECLARE_LOG_CATEGORY_EXTERN(LogOSC, Log, All);
|
DECLARE_LOG_CATEGORY_EXTERN(LogOSC, Log, All);
|
||||||
|
|||||||
@@ -86,7 +86,9 @@ void UOscDispatcher::UnregisterReceiver(IOscReceiverInterface * receiver)
|
|||||||
_receivers.Remove(receiver);
|
_receivers.Remove(receiver);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SendMessage(TCircularQueue<std::pair<FName, TArray<FOscDataElemStruct>>> & _pendingMessages, const osc::ReceivedMessage & message)
|
static void SendMessage(TCircularQueue<std::tuple<FName, TArray<FOscDataElemStruct>, FIPv4Address>> & _pendingMessages,
|
||||||
|
const osc::ReceivedMessage & message,
|
||||||
|
const FIPv4Address & senderIp)
|
||||||
{
|
{
|
||||||
if(message.State() != osc::SUCCESS)
|
if(message.State() != osc::SUCCESS)
|
||||||
{
|
{
|
||||||
@@ -132,7 +134,7 @@ static void SendMessage(TCircularQueue<std::pair<FName, TArray<FOscDataElemStruc
|
|||||||
}
|
}
|
||||||
|
|
||||||
// save it in pending messages
|
// save it in pending messages
|
||||||
const auto added = _pendingMessages.Enqueue(std::make_pair(address, data));
|
const auto added = _pendingMessages.Enqueue(std::make_tuple(address, data, senderIp));
|
||||||
|
|
||||||
// the circular buffer may be full.
|
// the circular buffer may be full.
|
||||||
if(!added)
|
if(!added)
|
||||||
@@ -141,7 +143,9 @@ static void SendMessage(TCircularQueue<std::pair<FName, TArray<FOscDataElemStruc
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SendBundle(TCircularQueue<std::pair<FName, TArray<FOscDataElemStruct>>> & _pendingMessages, const osc::ReceivedBundle & bundle)
|
static void SendBundle(TCircularQueue<std::tuple<FName, TArray<FOscDataElemStruct>, FIPv4Address>> & _pendingMessages,
|
||||||
|
const osc::ReceivedBundle & bundle,
|
||||||
|
const FIPv4Address & senderIp)
|
||||||
{
|
{
|
||||||
if(bundle.State() != osc::SUCCESS)
|
if(bundle.State() != osc::SUCCESS)
|
||||||
{
|
{
|
||||||
@@ -155,16 +159,16 @@ static void SendBundle(TCircularQueue<std::pair<FName, TArray<FOscDataElemStruct
|
|||||||
{
|
{
|
||||||
if(it->IsBundle())
|
if(it->IsBundle())
|
||||||
{
|
{
|
||||||
SendBundle(_pendingMessages, osc::ReceivedBundle(*it));
|
SendBundle(_pendingMessages, osc::ReceivedBundle(*it), senderIp);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SendMessage(_pendingMessages, osc::ReceivedMessage(*it));
|
SendMessage(_pendingMessages, osc::ReceivedMessage(*it), senderIp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void UOscDispatcher::Callback(const FArrayReaderPtr& data, const FIPv4Endpoint&)
|
void UOscDispatcher::Callback(const FArrayReaderPtr& data, const FIPv4Endpoint& endpoint)
|
||||||
{
|
{
|
||||||
const osc::ReceivedPacket packet((const char *)data->GetData(), data->Num());
|
const osc::ReceivedPacket packet((const char *)data->GetData(), data->Num());
|
||||||
if(packet.State() != osc::SUCCESS)
|
if(packet.State() != osc::SUCCESS)
|
||||||
@@ -175,11 +179,11 @@ void UOscDispatcher::Callback(const FArrayReaderPtr& data, const FIPv4Endpoint&)
|
|||||||
|
|
||||||
if(packet.IsBundle())
|
if(packet.IsBundle())
|
||||||
{
|
{
|
||||||
SendBundle(_pendingMessages, osc::ReceivedBundle(packet));
|
SendBundle(_pendingMessages, osc::ReceivedBundle(packet), endpoint.GetAddress());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SendMessage(_pendingMessages, osc::ReceivedMessage(packet));
|
SendMessage(_pendingMessages, osc::ReceivedMessage(packet), endpoint.GetAddress());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set a single callback in the main thread per frame.
|
// Set a single callback in the main thread per frame.
|
||||||
@@ -213,12 +217,14 @@ void UOscDispatcher::CallbackMainThread()
|
|||||||
|
|
||||||
FScopeLock ScopeLock(&_receiversMutex);
|
FScopeLock ScopeLock(&_receiversMutex);
|
||||||
|
|
||||||
std::pair<FName, TArray<FOscDataElemStruct>> message;
|
std::tuple<FName, TArray<FOscDataElemStruct>, FIPv4Address> message;
|
||||||
while(_pendingMessages.Dequeue(message))
|
while(_pendingMessages.Dequeue(message))
|
||||||
{
|
{
|
||||||
|
const FIPv4Address & senderIp = std::get<2>(message);
|
||||||
|
FString senderIpStr = FString::Printf(TEXT("%i.%i.%i.%i"), senderIp.GetByte(3), senderIp.GetByte(2), senderIp.GetByte(1), senderIp.GetByte(0));
|
||||||
for(auto receiver : _receivers)
|
for(auto receiver : _receivers)
|
||||||
{
|
{
|
||||||
receiver->SendEvent(message.first, message.second);
|
receiver->SendEvent(std::get<0>(message), std::get<1>(message), senderIpStr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ private:
|
|||||||
std::pair<FIPv4Address, uint32_t> _listening;
|
std::pair<FIPv4Address, uint32_t> _listening;
|
||||||
FSocket * _socket;
|
FSocket * _socket;
|
||||||
FUdpSocketReceiver * _socketReceiver;
|
FUdpSocketReceiver * _socketReceiver;
|
||||||
TCircularQueue<std::pair<FName, TArray<FOscDataElemStruct>>> _pendingMessages;
|
TCircularQueue<std::tuple<FName, TArray<FOscDataElemStruct>, FIPv4Address>> _pendingMessages;
|
||||||
int32 _taskSpawned;
|
int32 _taskSpawned;
|
||||||
|
|
||||||
/// Protects _receivers
|
/// Protects _receivers
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ public:
|
|||||||
FString AddressFilter;
|
FString AddressFilter;
|
||||||
|
|
||||||
UFUNCTION(BlueprintImplementableEvent, Category=OSC)
|
UFUNCTION(BlueprintImplementableEvent, Category=OSC)
|
||||||
void OnOscReceived(const FName & Address, const TArray<FOscDataElemStruct> & Data);
|
void OnOscReceived(const FName & Address, const TArray<FOscDataElemStruct> & Data, const FString & SenderIp);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@@ -31,9 +31,9 @@ public:
|
|||||||
return AddressFilter;
|
return AddressFilter;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SendEvent(const FName & Address, const TArray<FOscDataElemStruct> & Data)
|
void SendEvent(const FName & Address, const TArray<FOscDataElemStruct> & Data, const FString & SenderIp)
|
||||||
{
|
{
|
||||||
OnOscReceived(Address, Data);
|
OnOscReceived(Address, Data, SenderIp);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
|
|
||||||
// declare the OnOscReceived event type
|
// declare the OnOscReceived event type
|
||||||
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FComponentOscReceivedSignature, const FName &, Address, const TArray<FOscDataElemStruct> &, Data);
|
DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FComponentOscReceivedSignature, const FName &, Address, const TArray<FOscDataElemStruct> &, Data, const FString &, SenderIp);
|
||||||
|
|
||||||
|
|
||||||
UCLASS(ClassGroup=OSC, meta = (BlueprintSpawnableComponent))
|
UCLASS(ClassGroup=OSC, meta = (BlueprintSpawnableComponent))
|
||||||
@@ -35,9 +35,9 @@ public:
|
|||||||
return AddressFilter;
|
return AddressFilter;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SendEvent(const FName & Address, const TArray<FOscDataElemStruct> & Data)
|
void SendEvent(const FName & Address, const TArray<FOscDataElemStruct> & Data, const FString & SenderIp)
|
||||||
{
|
{
|
||||||
OnOscReceived.Broadcast(Address, Data);
|
OnOscReceived.Broadcast(Address, Data, SenderIp);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ void OscReceiverInputKey::RegisterKey() const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void OscReceiverInputKey::SendEvent(const FName & Address, const TArray<FOscDataElemStruct> & Data)
|
void OscReceiverInputKey::SendEvent(const FName & Address, const TArray<FOscDataElemStruct> & Data, const FString & SenderIp)
|
||||||
{
|
{
|
||||||
if(Address != _addressName)
|
if(Address != _addressName)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ private:
|
|||||||
return _address;
|
return _address;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SendEvent(const FName & Address, const TArray<FOscDataElemStruct> & Data) override;
|
void SendEvent(const FName & Address, const TArray<FOscDataElemStruct> & Data, const FString & SenderIp) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
FString _address;
|
FString _address;
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
struct IOscReceiverInterface
|
struct IOscReceiverInterface
|
||||||
{
|
{
|
||||||
virtual const FString & GetAddressFilter() const = 0;
|
virtual const FString & GetAddressFilter() const = 0;
|
||||||
virtual void SendEvent(const FName & Address, const TArray<FOscDataElemStruct> & Data) = 0;
|
virtual void SendEvent(const FName & Address, const TArray<FOscDataElemStruct> & Data, const FString & SenderIp) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -26,8 +26,8 @@ struct BasicOscReceiver : IOscReceiverInterface
|
|||||||
return _impl->GetAddressFilter();
|
return _impl->GetAddressFilter();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SendEvent(const FName & Address, const TArray<FOscDataElemStruct> & Data) final
|
void SendEvent(const FName & Address, const TArray<FOscDataElemStruct> & Data, const FString & SenderIp) final
|
||||||
{
|
{
|
||||||
_impl->SendEvent(Address, Data);
|
_impl->SendEvent(Address, Data, SenderIp);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user