void UOscFunctionLibrary::PushString(const TArray<FOscDataElemStruct> & input, FName Value, TArray<FOscDataElemStruct> & output) { if(Value.GetDisplayNameEntry()->IsWide()) { const auto tmp = Value.GetPlainNameString(); UE_LOG(LogOSC, Error, TEXT("Invalid string argument \"%s\": ASCII only"), *tmp); return; } output = input; FOscDataElemStruct elem; elem.SetString(Value); output.Add(elem); }
void UOscFunctionLibrary::SendOsc(FName Address, const TArray<FOscDataElemStruct> & Data, int32 TargetIndex) { if(Address.GetDisplayNameEntry()->IsWide()) { const auto tmp = Address.GetPlainNameString(); UE_LOG(LogOSC, Error, TEXT("Invalid OSC address \"%s\": ASCII only"), *tmp); return; } static_assert(sizeof(uint8) == sizeof(char), "Cannot cast uint8 to char"); uint8 buffer[1024]; osc::OutboundPacketStream output((char *)buffer, sizeof(buffer)); output << osc::BeginMessage(Address.GetPlainANSIString()); for(const auto & elem : Data) { if(elem.IsFloat()) { output << (float)elem.AsFloatValue(); } else if(elem.IsInt()) { output << (int32)elem.AsIntValue(); } else if(elem.IsBool()) { output << elem.AsBoolValue(); } else if(elem.IsString()) { output << elem.AsStringValue().GetPlainANSIString(); } } output << osc::EndMessage; check(reinterpret_cast<const void *>(buffer) == reinterpret_cast<const void *>(output.Data())); GetMutableDefault<UOscSettings>()->Send(buffer, output.Size(), TargetIndex); }