diff --git a/OSC/Source/OSC/Private/OscPrivatePCH.h b/OSC/Source/OSC/Private/OscPrivatePCH.h index 058e940..982cf0d 100644 --- a/OSC/Source/OSC/Private/OscPrivatePCH.h +++ b/OSC/Source/OSC/Private/OscPrivatePCH.h @@ -17,5 +17,6 @@ #include #include +#include DECLARE_LOG_CATEGORY_EXTERN(LogOSC, Log, All); diff --git a/OSC/Source/OSC/Private/Receive/OscDispatcher.cpp b/OSC/Source/OSC/Private/Receive/OscDispatcher.cpp index f67a022..f2d4437 100644 --- a/OSC/Source/OSC/Private/Receive/OscDispatcher.cpp +++ b/OSC/Source/OSC/Private/Receive/OscDispatcher.cpp @@ -86,7 +86,9 @@ void UOscDispatcher::UnregisterReceiver(IOscReceiverInterface * receiver) _receivers.Remove(receiver); } -static void SendMessage(TCircularQueue>> & _pendingMessages, const osc::ReceivedMessage & message) +static void SendMessage(TCircularQueue, FIPv4Address>> & _pendingMessages, + const osc::ReceivedMessage & message, + const FIPv4Address & senderIp) { if(message.State() != osc::SUCCESS) { @@ -132,7 +134,7 @@ static void SendMessage(TCircularQueue>> & _pendingMessages, const osc::ReceivedBundle & bundle) +static void SendBundle(TCircularQueue, FIPv4Address>> & _pendingMessages, + const osc::ReceivedBundle & bundle, + const FIPv4Address & senderIp) { if(bundle.State() != osc::SUCCESS) { @@ -155,16 +159,16 @@ static void SendBundle(TCircularQueueIsBundle()) { - SendBundle(_pendingMessages, osc::ReceivedBundle(*it)); + SendBundle(_pendingMessages, osc::ReceivedBundle(*it), senderIp); } 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()); if(packet.State() != osc::SUCCESS) @@ -175,11 +179,11 @@ void UOscDispatcher::Callback(const FArrayReaderPtr& data, const FIPv4Endpoint&) if(packet.IsBundle()) { - SendBundle(_pendingMessages, osc::ReceivedBundle(packet)); + SendBundle(_pendingMessages, osc::ReceivedBundle(packet), endpoint.GetAddress()); } else { - SendMessage(_pendingMessages, osc::ReceivedMessage(packet)); + SendMessage(_pendingMessages, osc::ReceivedMessage(packet), endpoint.GetAddress()); } // Set a single callback in the main thread per frame. @@ -213,12 +217,14 @@ void UOscDispatcher::CallbackMainThread() FScopeLock ScopeLock(&_receiversMutex); - std::pair> message; + std::tuple, FIPv4Address> 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) { - receiver->SendEvent(message.first, message.second); + receiver->SendEvent(std::get<0>(message), std::get<1>(message), senderIpStr); } } } diff --git a/OSC/Source/OSC/Private/Receive/OscDispatcher.h b/OSC/Source/OSC/Private/Receive/OscDispatcher.h index 7d1edac..4673b92 100644 --- a/OSC/Source/OSC/Private/Receive/OscDispatcher.h +++ b/OSC/Source/OSC/Private/Receive/OscDispatcher.h @@ -49,7 +49,7 @@ private: std::pair _listening; FSocket * _socket; FUdpSocketReceiver * _socketReceiver; - TCircularQueue>> _pendingMessages; + TCircularQueue, FIPv4Address>> _pendingMessages; int32 _taskSpawned; /// Protects _receivers diff --git a/OSC/Source/OSC/Private/Receive/OscReceiverActor.h b/OSC/Source/OSC/Private/Receive/OscReceiverActor.h index 5fdf6f4..4f5e939 100644 --- a/OSC/Source/OSC/Private/Receive/OscReceiverActor.h +++ b/OSC/Source/OSC/Private/Receive/OscReceiverActor.h @@ -17,7 +17,7 @@ public: FString AddressFilter; UFUNCTION(BlueprintImplementableEvent, Category=OSC) - void OnOscReceived(const FName & Address, const TArray & Data); + void OnOscReceived(const FName & Address, const TArray & Data, const FString & SenderIp); public: @@ -31,9 +31,9 @@ public: return AddressFilter; } - void SendEvent(const FName & Address, const TArray & Data) + void SendEvent(const FName & Address, const TArray & Data, const FString & SenderIp) { - OnOscReceived(Address, Data); + OnOscReceived(Address, Data, SenderIp); } private: diff --git a/OSC/Source/OSC/Private/Receive/OscReceiverComponent.h b/OSC/Source/OSC/Private/Receive/OscReceiverComponent.h index 5bc133b..bbe579c 100644 --- a/OSC/Source/OSC/Private/Receive/OscReceiverComponent.h +++ b/OSC/Source/OSC/Private/Receive/OscReceiverComponent.h @@ -7,7 +7,7 @@ // declare the OnOscReceived event type -DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FComponentOscReceivedSignature, const FName &, Address, const TArray &, Data); +DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FComponentOscReceivedSignature, const FName &, Address, const TArray &, Data, const FString &, SenderIp); UCLASS(ClassGroup=OSC, meta = (BlueprintSpawnableComponent)) @@ -35,9 +35,9 @@ public: return AddressFilter; } - void SendEvent(const FName & Address, const TArray & Data) + void SendEvent(const FName & Address, const TArray & Data, const FString & SenderIp) { - OnOscReceived.Broadcast(Address, Data); + OnOscReceived.Broadcast(Address, Data, SenderIp); } private: diff --git a/OSC/Source/OSC/Private/Receive/OscReceiverInputKey.cpp b/OSC/Source/OSC/Private/Receive/OscReceiverInputKey.cpp index c4f44cb..2050405 100644 --- a/OSC/Source/OSC/Private/Receive/OscReceiverInputKey.cpp +++ b/OSC/Source/OSC/Private/Receive/OscReceiverInputKey.cpp @@ -36,7 +36,7 @@ void OscReceiverInputKey::RegisterKey() const } } -void OscReceiverInputKey::SendEvent(const FName & Address, const TArray & Data) +void OscReceiverInputKey::SendEvent(const FName & Address, const TArray & Data, const FString & SenderIp) { if(Address != _addressName) { diff --git a/OSC/Source/OSC/Private/Receive/OscReceiverInputKey.h b/OSC/Source/OSC/Private/Receive/OscReceiverInputKey.h index e3bfc36..b775353 100644 --- a/OSC/Source/OSC/Private/Receive/OscReceiverInputKey.h +++ b/OSC/Source/OSC/Private/Receive/OscReceiverInputKey.h @@ -24,7 +24,7 @@ private: return _address; } - void SendEvent(const FName & Address, const TArray & Data) override; + void SendEvent(const FName & Address, const TArray & Data, const FString & SenderIp) override; private: FString _address; diff --git a/OSC/Source/OSC/Private/Receive/OscReceiverInterface.h b/OSC/Source/OSC/Private/Receive/OscReceiverInterface.h index cdaaaf9..0901967 100644 --- a/OSC/Source/OSC/Private/Receive/OscReceiverInterface.h +++ b/OSC/Source/OSC/Private/Receive/OscReceiverInterface.h @@ -7,7 +7,7 @@ struct IOscReceiverInterface { virtual const FString & GetAddressFilter() const = 0; - virtual void SendEvent(const FName & Address, const TArray & Data) = 0; + virtual void SendEvent(const FName & Address, const TArray & Data, const FString & SenderIp) = 0; }; @@ -26,8 +26,8 @@ struct BasicOscReceiver : IOscReceiverInterface return _impl->GetAddressFilter(); } - void SendEvent(const FName & Address, const TArray & Data) final + void SendEvent(const FName & Address, const TArray & Data, const FString & SenderIp) final { - _impl->SendEvent(Address, Data); + _impl->SendEvent(Address, Data, SenderIp); } };