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 <memory>
|
||||
#include <tuple>
|
||||
|
||||
DECLARE_LOG_CATEGORY_EXTERN(LogOSC, Log, All);
|
||||
|
||||
@@ -86,7 +86,9 @@ void UOscDispatcher::UnregisterReceiver(IOscReceiverInterface * 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)
|
||||
{
|
||||
@@ -132,7 +134,7 @@ static void SendMessage(TCircularQueue<std::pair<FName, TArray<FOscDataElemStruc
|
||||
}
|
||||
|
||||
// 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.
|
||||
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)
|
||||
{
|
||||
@@ -155,16 +159,16 @@ static void SendBundle(TCircularQueue<std::pair<FName, TArray<FOscDataElemStruct
|
||||
{
|
||||
if(it->IsBundle())
|
||||
{
|
||||
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<FName, TArray<FOscDataElemStruct>> message;
|
||||
std::tuple<FName, TArray<FOscDataElemStruct>, 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,7 +49,7 @@ private:
|
||||
std::pair<FIPv4Address, uint32_t> _listening;
|
||||
FSocket * _socket;
|
||||
FUdpSocketReceiver * _socketReceiver;
|
||||
TCircularQueue<std::pair<FName, TArray<FOscDataElemStruct>>> _pendingMessages;
|
||||
TCircularQueue<std::tuple<FName, TArray<FOscDataElemStruct>, FIPv4Address>> _pendingMessages;
|
||||
int32 _taskSpawned;
|
||||
|
||||
/// Protects _receivers
|
||||
|
||||
@@ -17,7 +17,7 @@ public:
|
||||
FString AddressFilter;
|
||||
|
||||
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:
|
||||
|
||||
@@ -31,9 +31,9 @@ public:
|
||||
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:
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
|
||||
// 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))
|
||||
@@ -35,9 +35,9 @@ public:
|
||||
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:
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -24,7 +24,7 @@ private:
|
||||
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:
|
||||
FString _address;
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
struct IOscReceiverInterface
|
||||
{
|
||||
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();
|
||||
}
|
||||
|
||||
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