rob@76: April 9, 2013 rob@76: ------------- rob@76: rob@76: Changes for the 1.1.0 release (vs 1.0.2) are listed below. Unless rob@76: otherwise indicated these changes have been made since rob@76: January 2013. The focus has been on general clean-up, fixing bugs, rob@76: compiler errors and warnings, and fixing issues on 64 bit platforms. rob@76: A few improvements such as support for OSC arrays, functions rob@76: for setting broadcast and reuse socket options have been added. rob@76: This update merges changes from the openFrameworks version rob@76: of oscpack. rob@76: rob@76: - Added support for arrays in messages (see OscUnitTests.cpp rob@76: for example usage). (patch thanks to Tim Blechmann) rob@76: rob@76: - Fixed bugs relating to 64 bit usage (e.g. crashes in 64 bit rob@76: builds on OS X). rob@76: rob@76: - Some member functions that previously used the "int" or rob@76: "unsigned long" type for parameters or return values now use rob@76: std::size_t (platform-defined) or rob@76: osc_bundle_element_size_t (a.k.a. int32). rob@76: This change was made to better support 64 bit platforms. rob@76: See SVN revision 70 for details. rob@76: rob@76: - The previous point introduces a breaking change on Linux/x86_64 rob@76: for callers of AsBlob() and AsBlobUnchecked(): rob@76: The type of the second argument (the "size" argument) to rob@76: ReceivedMessageArgument::AsBlob() and rob@76: ReceivedMessageArgument::AsBlobUnchecked() has changed rob@76: from unsigned long & to osc_bundle_element_size_t (an int32). rob@76: You should declare your size argument variables as rob@76: osc_bundle_element_size_t to avoid incompatibilities between rob@76: 32 and 64 bit builds. rob@76: rob@76: - Note that oscpack does not support packets larger than rob@76: 0x7FFFFFFC (see comments in class ReceivedPacket for rob@76: details). rob@76: rob@76: - Oscpack defines an osc::Nil value used for sending the nil rob@76: message argument value. This conflicts with Objective-C. rob@76: Therefore osc::Nil is no longer defined in Obj-C++ code. rob@76: There is now an osc::OscNil value, which should be preferred. rob@76: osc::Nil is still available when writing C++. rob@76: (fix thanks to openFrameworks) rob@76: rob@76: - Added UdpSocket::SetEnableBroadcast(). This needs to rob@76: be called to enable sending to the broadcast address on some rob@76: platforms (e.g. Mac OS X). (thanks to openFrameworks) rob@76: rob@76: - Added UdpSocket::SetAllowReuse(). This is useful for rob@76: sharing sockets on some platforms (Mac?), and not so useful rob@76: on other platforms. (thanks to openFrameworks) rob@76: rob@76: - Added IpEndpointName::IsMulticastAddress() (2010) rob@76: rob@76: - Cleaned up C++ header usage and std:: namespace usage rob@76: to be more standards compliant (fixes issues on recent compilers rob@76: such as clang and gcc4.6). rob@76: rob@76: - Improved host endianness detection. Should auto-detect rob@76: endianness on most platforms now. rob@76: (thanks to Tim Blechmann for help with this) rob@76: rob@76: - Fixed two memory leaks: (1) in OscPrintReceivedElements.cpp rob@76: when printing time tag message arguments (thanks to Gwydion ap Dafydd). rob@76: (2) in the posix SocketReceiveMultiplexer::Run() method if an exception rob@76: was thrown while listening. rob@76: rob@76: - Fixed bug in posix SocketReceiveMultiplexer::Run() that would cause rob@76: packets to stop being received if select() returned EINTR. rob@76: (thanks to Björn Wöldecke) rob@76: rob@76: - Updated and improved Makefile to avoid redundant re-linking rob@76: (thanks to Douglas Mandell) rob@76: rob@76: - Added CMakeLists.txt CMake build file (2010, thanks to David Doria) rob@76: rob@76: - Switched license to plain MIT license with non binding request rob@76: for contribution of improvements (same as current PortAudio rob@76: boilerplate). See LICENSE file. rob@76: rob@76: Thanks to Tim Blechmann, Rob Canning, Gwydion ap Dafydd, David Doria, rob@76: Christopher Delaney, Jon McCormack, Douglas Mandell, Björn Wöldecke, rob@76: all the guys at openFrameworks, and everyone who reported bugs, rob@76: submitted patches and helped out with testing this release. rob@76: rob@76: Thanks to Syneme at the University of Calgary for providing financial rob@76: support for the 1.1.0 update. rob@76: rob@76: rob@76: September 28, 2005 rob@76: ------------------ rob@76: rob@76: Compared to the previous official snapshot (November 2004) the rob@76: current version of oscpack includes a re-written set of network rob@76: classes and some changes to the syntax of the networking code. It no rob@76: longer uses threads, which means that you don't need to use sleep() rob@76: if you are writing a simple single-threaded server, or you need to rob@76: spawn your own threads in a more complex application. rob@76: rob@76: The list below summarises the changes if you are porting code from rob@76: the previous release. rob@76: rob@76: - There are no longer any threads in oscpack. if you need to rob@76: set up an asynchronous listener you can create your own thread rob@76: and call Run on an instance of SocketReceiveMultiplexer or rob@76: UdpListeningReceiveSocket (see ip/UdpSocket.h) yourself. rob@76: rob@76: - Host byte order is now used for network (IP) addresses rob@76: rob@76: - Functions which used to take two parameters rob@76: now take an instance of IpEndpointName (see rob@76: ip/IpEndpointName.h) this class has a number of convenient rob@76: constructors for converting numbers and strings to internet rob@76: addresses. For example there is one which takes a string and rob@76: another that take the dotted address components as separate rob@76: parameters. rob@76: rob@76: - The UdpTransmitPort class, formerly in UdpTransmitPort.h, is rob@76: now called UdpTransmitSocket, which is simply a convenience rob@76: class derived from UdpSocket (see ip/UdpSocket.h). Where you rob@76: used to use the constructor UdpTransmitPort( address, port) now rob@76: you can use UdpTransmitSocket( IpEndpointName( address, port ) rob@76: ) or you can any of the other possible ctors to IpEndpointName rob@76: () (see above). The Send() method is unchanged. rob@76: rob@76: - The packet listener base class is now located in rob@76: ip/PacketListener.h instead of PacketListenerPort.h. The rob@76: ProcessPacket method now has an additional parameter indicating rob@76: the remote endpoint rob@76: rob@76: - The preferred way to set up listeners is with rob@76: SocketReceiveMultiplexer (in ip/UdpSocket.h), this also allows rob@76: attaching periodic timers. For simple applications which only rob@76: listen to a single socket with no timers you can use rob@76: UdpListeningReceiveSocket (also in UdpSocket.h) See rob@76: osc/OscReceiveTest.cpp or osc/OscDump.cpp for examples of this. rob@76: This is more or less equivalent to the UdpPacketListenerPort rob@76: object in the old oscpack versions except that you need to rob@76: explicitly call Run() before it will start receiving packets rob@76: and it runs in the same thread, not a separate thread so Run() rob@76: won't usually return. rob@76: rob@76: - Explicit calls to InitializeNetworking() and rob@76: TerminateNetworking() are no longer required for simple rob@76: applications (more complex windows applications should rob@76: instantiate NetworkInitializer in main() or WinMain (see rob@76: ip/NetworkingUtils.h/.cpp) rob@76: rob@76: - The OscPacketListener base class (OscPacketListener.h) was rob@76: added to make traversing OSC packets easier, it handles bundle rob@76: traversal automatically so you only need to process messages in rob@76: your derived classes. rob@76: rob@76: - On Windows be sure to link with ws2_32.lib or you will see rob@76: a linker error about WSAEventSelect not being found. Also you rob@76: will need to link with winmm.lib for timeGetTime() rob@76: