diff --git a/modules/juce_osc/osc/juce_OSCReceiver.cpp b/modules/juce_osc/osc/juce_OSCReceiver.cpp index b6a2735ac4..25a0e47701 100644 --- a/modules/juce_osc/osc/juce_OSCReceiver.cpp +++ b/modules/juce_osc/osc/juce_OSCReceiver.cpp @@ -331,13 +331,12 @@ struct OSCReceiver::Pimpl : private Thread, } //============================================================================== - bool connectToPort (int portNum) + bool connectToPort (int portNumber) { if (! disconnect()) return false; - portNumber = portNum; - socket = new DatagramSocket (false); + socket.setOwned (new DatagramSocket (false)); if (! socket->bindToPort (portNumber)) return false; @@ -346,14 +345,27 @@ struct OSCReceiver::Pimpl : private Thread, return true; } + bool connectToSocket (DatagramSocket& newSocket) + { + if (! disconnect()) + return false; + + socket.setNonOwned (&newSocket); + startThread(); + return true; + } + bool disconnect() { if (socket != nullptr) { signalThreadShouldExit(); - socket->shutdown(); + + if (socket.willDeleteObject()) + socket->shutdown(); + waitForThreadToExit (10000); - socket = nullptr; + socket.reset(); } return true; } @@ -567,8 +579,7 @@ private: Array*>> listenersWithAddress; Array*>> realtimeListenersWithAddress; - ScopedPointer socket; - int portNumber = 0; + OptionalScopedPointer socket; OSCReceiver::FormatErrorHandler formatErrorHandler { nullptr }; enum { oscBufferSize = 4098 }; @@ -590,6 +601,11 @@ bool OSCReceiver::connect (int portNumber) return pimpl->connectToPort (portNumber); } +bool OSCReceiver::connectToSocket (DatagramSocket& socket) +{ + return pimpl->connectToSocket (socket); +} + bool OSCReceiver::disconnect() { return pimpl->disconnect(); diff --git a/modules/juce_osc/osc/juce_OSCReceiver.h b/modules/juce_osc/osc/juce_OSCReceiver.h index d9ad9ffb39..a2eecd8aae 100644 --- a/modules/juce_osc/osc/juce_OSCReceiver.h +++ b/modules/juce_osc/osc/juce_OSCReceiver.h @@ -54,6 +54,14 @@ public: */ bool connect (int portNumber); + /** Connects to a UDP datagram socket that is already set up, + and starts listening to OSC packets arriving on this port. + Make sure that the object you give it doesn't get deleted while this + object is still using it! + @returns true if the connection was successful; false otherwise. + */ + bool connectToSocket (DatagramSocket& socketToUse); + //============================================================================== /** Disconnects from the currently used UDP port. @returns true if the disconnection was successful; false otherwise. diff --git a/modules/juce_osc/osc/juce_OSCSender.cpp b/modules/juce_osc/osc/juce_OSCSender.cpp index dc98d8b993..0591dd6e60 100644 --- a/modules/juce_osc/osc/juce_OSCSender.cpp +++ b/modules/juce_osc/osc/juce_OSCSender.cpp @@ -215,20 +215,31 @@ struct OSCSender::Pimpl if (! disconnect()) return false; - socket = new DatagramSocket (true); + socket.setOwned (new DatagramSocket (true)); targetHostName = newTargetHost; targetPortNumber = newTargetPort; if (socket->bindToPort (0)) // 0 = use any local port assigned by the OS. return true; - socket = nullptr; + socket.reset(); return false; } + bool connectToSocket (DatagramSocket& newSocket, const String& newTargetHost, int newTargetPort) + { + if (! disconnect()) + return false; + + socket.setNonOwned (&newSocket); + targetHostName = newTargetHost; + targetPortNumber = newTargetPort; + return true; + } + bool disconnect() { - socket = nullptr; + socket.reset(); return true; } @@ -273,7 +284,7 @@ private: } //============================================================================== - ScopedPointer socket; + OptionalScopedPointer socket; String targetHostName; int targetPortNumber = 0; @@ -298,6 +309,11 @@ bool OSCSender::connect (const String& targetHostName, int targetPortNumber) return pimpl->connect (targetHostName, targetPortNumber); } +bool OSCSender::connectToSocket (DatagramSocket& socket, const String& targetHostName, int targetPortNumber) +{ + return pimpl->connectToSocket (socket, targetHostName, targetPortNumber); +} + bool OSCSender::disconnect() { return pimpl->disconnect(); diff --git a/modules/juce_osc/osc/juce_OSCSender.h b/modules/juce_osc/osc/juce_OSCSender.h index 7ec4bdc73b..2088532188 100644 --- a/modules/juce_osc/osc/juce_OSCSender.h +++ b/modules/juce_osc/osc/juce_OSCSender.h @@ -48,23 +48,34 @@ public: /** Connects to a datagram socket and prepares the socket for sending OSC packets to the specified target. + Note: the operating system will choose which specific network adapter(s) + to bind your socket to, and which local port to use for the sender. + @param targetHostName The remote host to which messages will be send. @param targetPortNumber The remote UDP port number on which the host will receive the messages. @returns true if the connection was successful; false otherwise. - - Note: the operating system will choose which specific network adapter(s) - to bind your socket to, and which local port to use for the sender. - @see send, disconnect. */ bool connect (const String& targetHostName, int targetPortNumber); + /** Uses an existing datagram socket for sending OSC packets to the specified target. + + @param socket An existing datagram socket. Make sure this doesn't + get deleted while this class is still using it! + @param targetHostName The remote host to which messages will be send. + @param targetPortNumber The remote UDP port number on which the host will + receive the messages. + + @returns true if the connection was successful; false otherwise. + @see connect, send, disconnect. + */ + bool connectToSocket (DatagramSocket& socket, const String& targetHostName, int targetPortNumber); + //============================================================================== /** Disconnects from the currently used UDP port. @returns true if the disconnection was successful; false otherwise. - @see connect. */ bool disconnect();