- add: optional, minimal header-only replacement for Boost.Serialization (Tristan Stenner)
- add: extensible
lsl_create_inlet_ex()
for high-precision buffer lengths (Chadwick Boulay) - change: replace Boost.Uuid, Boost.Random and Boost.Thread with built-in functions (Tristan Stenner)
- change: replace Boost.Asio with upstream Asio (Tristan Stenner)
- change: update bundled Boost to 1.78 (Tristan Stenner)
- change: allow building against system Boost again (@chausner)
- change: speed up resolving a fixed number of streams (Tristan Stenner)
- change: reduce Asio operation overhead (Tristan Stenner)
- change: IPv6 is enabled by default on macOS (Tristan Stenner)
- change: share io contexts for IPv4+IPv6 services (Tristan Stenner)
- change: send resolve requests from all local network interfaces (Tristan Stenner)
- fix: fix a minor memory leak when closing streams (Tristan Stenner)
- fix: bump artifact / soname version
- change: update Boost / Boost.Asio to 1.75 (Tristan Stenner)
- change: replace Boost.UUID generator
- fix: work around faulty MinGW code generation for thread local variables (Tristan Stenner, Tobias Herzke)
- add: thread-safe
lsl_last_error()
function, returns a description of the last error (sccn#75, Tristan Stenner) - change: object handles in the C++ API use smart pointers internally.
The smart pointer to the object can be retrieved with the
handle()
function - change: The
stream_info
copy constructor creates a shallow copy. Usestream_info::clone()
for the previous behavior (deep copy). - change: replace more Boost libraries with C++11 counterparts (Tristan Stenner)
- change: speed up
push_chunk_*
calls by caching the sampling rate (Chadwick Boulay) - change: postprocessing parameters are reset after dis- and re-enabling postprocessing (Tristan Stenner)
- fix: postprocessing now works even when flushing samples (Tristan Stenner)
- fix: pulling strings with embedded NULL chars now works (Tristan Stenner, Chadwick Boulay)
- fix: various build system and deployment fixes (Chadwick Boulay, Tristan Stenner)
- fix: building with MinGW now works (Tobias Herzke)
- fix:
max_buflen
documentation and edge cases (Chadwick Boulay) - fix: preliminary support for deploying Qt6 apps with CMake (Chadwick Boulay, Tristan Stenner)
- fix: packages for Ubuntu 18.04 no longer depend on the unavailable libgcc_s1 package (Tristan Stenner, many thanks to Tobias Herzke for reporting the issue)
- change: CMake doesn't set
CMAKE_INSTALL_PREFIX
andCMAKE_BUILD_TYPE
by default unlessLSL_COMFY_DEFAULTS
is set (Tristan Stenner) - fix: prevent race condition when two threads modify an overflowing buffer (sccn#71, Jérémy Frey)
- fix: improve latency and CPU usage (sccn#71, Jérémy Frey)
- fix: various build system fixes and improvments (Chadwick Boulay, Tristan Stenner)
- added: enumerate network interfaces on startup, for now unused. Requires Android SDK >=26 (Tristan Stenner)
- added: lsl_inlet_flush() to drop all outstanding samples from an inlet to avoid the pull_ overhead in realtime applications (Tristan Stenner)
- change: the binary names are changed so that the OS resolver (e.g.
find_library(lsl)
) searches for the correct library. Windows: liblsl32.dll / liblsl64.dll -> lsl.dll, Unix: liblsl.so. (Tristan Stenner) - change: the lsl_c.h header is now split into several header files (Tristan Stenner)
- change: refactor logging, add
log.file
config option (Tristan Stenner) - change: replace various Boost libraries with C++11 counterparts (Tristan Stenner)
- change: liblsl requires a compiler with C++11 support, MSVC 2015 on Windows
- fix: avoid an infinite loop if no port can be bound to (Tristan Stenner, discovered by Maximilian Kraus)
- add: unit tests to test basic operations on CI systems (Tristan Stenner, Matthew Grivich)
- fix: Fix for the sometimes appearing "no clock offsets found"-bug
- add: the path to the lsl_api.cfg can now be specified via the environment variable LSLAPICFG
- fix: updates to the included Boost, fixing Android compilation and reducing the number of warnings (Tristan Stenner)
- fix: patch Boost.Thread to avoid latency spikes on Windows (Tristan Stenner)
- add: lsl_stream_info_matches_query() to test a resolved stream against a query (Tristan Stenner)
- add: lsl_library_info() function returning some information about the dll/so file (Tristan Stenner)
- add: Raspberry Pi cross compilation support (Chadwick Boulay)
- fix: Boost.Serialization objects are only defined to fix compilation on ARM (Tristan Stenner)
- change: added move-semantics to most C++ API classes (Tristan Stenner)
- change: move error handling from C API to C++ implementation (Tristan Stenner)
- fix: Fix possible string stream corruption on 32bit platforms (Tristan Stenner)
- change: add some Continuous Integration and packaging configuration (Tristan Stenner)
- change: remove the option to build liblsl against system Boost (Tristan Stenner)
- fix: prevent undefined shift (Tristan Stenner)
- fix: several fixes to export macros (Tristan Stenner)
- change: lots of improvements on OS X (Chadwick Boulay)
- change: a lot of work on making Qt work on OS X (Chadwick Boulay)
- change: override default timestamps with lsl timestamps (Zechari Tempesta)
- change: Switched the build system to CMake (Tristan Stenner, Chadwick Boulay, David Medine, Matthew Grivich)
- fix: Fix for ipv6 link-local addresses on Linux. Previously would get a "Invalid argument" error. (Matthew Grivich)
- fix: fix several memory handling issues (Matthew Grivich)
- fix: Added an optional time_correction prototype to return uncertainty and remote_time as well as offset. (Matthew Grivich)
- fix: merged memory leak fixes (thanks to xloem)
- Added support for iOS. (Matthew Grivich; de3f1318)
- changed constructor of lsl::xml_element to have default (David Medine; fd6a87b7)
- Add support for gcc 5 / MinGW (BorisMansencal)
- Fixed warning in GCC 4.9: 'lsl::stream_info' has a field 'lsl::stream_info::obj' whose type uses the anonymous namespace 1> class stream_info { (Matthew Grivich; 072563f5)
- Added optional time-stamp post-processing to the LSL inlet (Christian Kothe; d29ebde8)
- fixed broken relative paths (Giso Grimm; 1396ce6e)
- automatic version number extraction (Giso Grimm; a3e912ad)
- version number extraction and new location (Giso Grimm; 56f210a2)
Changes for liblsl 1.11
- Updated C/C++ examples to conform to XDF meta-data spec (per Luca Mussi). (Christian Kothe; 61d83de6)
- pugixml 1.0->1.7 . This fixes a build error in OS X. Also tested in Win 10 binaries with no apparent problems. (Chadwick Boulay; 067e1330)
- several changes to the build system and include files (Matthew Grivich, Chadwick Boulay)
- Fixed remaining references to old documentation. (Kyu Crane; ecf9cd09)
- Some fixes and updates here and there. (Christian Kothe; 65fa64e2)
- Fixed bug in push_chunk_multiplexed (Christian Kothe; 89339d08)
- Fixed regression in samples_available() (Christian Kothe; 5d0659da)
- Delete ._stream_info_impl.cpp (Christian Kothe; 92bfd87c)
- Updated consumer_queue::pop_sample() (Christian Kothe; 22662cb7)
- Fixed consumer_queue::pop_sample() to respect the timeout. (Steven Boswell; 678995dd)
- Fixed some memory leaks in the C# interop layer. (Steven Boswell; 06684ec6)
- Now multicasting can specify the local IP address to bind to. (Steven Boswell; 04a397e4)
- attempting to strip binaries (David Medine; bc216cc2)
Changes for liblsl 1.10
[Here a lot of changes happened that aren't included yet]
Changes for distribution 1.0.10 (library version 0.91)
- fix: in the C++ interface, the template pull_chunk() that fills a vector of time stamps did not clear this vector initially (no recompile necessary, just a header fix)
- change: simplified the rule for deciding which chunk size to use when both the outlet and the inlet have a preference: now the inlet's preference overrides the one of the outlet, if present.
Changes for distribution 1.0.18 (library version 0.92)
- fix: rebuild Linux and Mac libraries with most boost symbols stripped off (reducing the conflict of name clashes during dynamic linking, e.g. in MATLAB).
- Adding support for constructing inlets with unresolved stream_info's (if they are fully specified at construction).
Changes for distribution 1.0.19 (library version 0.93)
- removed the entire boost static library dependency across Win/Linux/Mac (instead now using the relevant .cpp files directly). This simplifies the build process and reduces the symbol pollution on Linux/Mac.
- Documented compatibility with pugixml in C API.
- Documented the timeout in resolve_all better in C API.
Changes for distribution 1.0.20 (library version 1.00) -- internal code review.
-
Added a continuous_resolver class that allows to resolve streams in the background.
-
Added ability to query receive buffer size.
-
Extended the error reporting in the C API (some functions now return error conditions).
-
Added some extra argument checking in the stream_info constructor (negative channel count / sample rate, empty name).
-
Upgraded from boost 1.47.0 to boost 1.50.0, and from portable_archive 4.2 to portable_archive 5.0.
-
Improved code documentation and slightly refactored some of the library code for better readability / comprehensibility.
- renamed some internal variables
- enhanced documentation
- switched largely to boost.chrono based timing instead of boost.date_time (new standard)
- following boost synchronization guidelines more strictly (preferentially using the simplest primitive that gets the job done)
- made the stream_inlet more tolerant to protocol errors at the sender side (threads do not exit but try to reconnect until successful).
- using incomplete struct types in the LSL C API to prevent accidental type confusions.
- simplified (and robustified) the data and info fetching threads in the inlet.
- reduced the amount of data copying when pushing samples into the library
- the IPv4 and IPv6 stacks in the outlet now run on two separate threads to improve robustness in case an OS implements a protocol badly
- improved efficiency of stream_info accessors (now return const references instead of copies)
- now using boost.container.flat_set in the send_buffer instead of std.set (more efficient)
-
Fixed a bug that prevented the use of LSL_FOREVER in the C API under 32-bit Mac (and possibly 32-bit Linux, too).
-
Fixed some potential hangups in the inlet when the connection gets lost irrecoverably (affected info(), time_correction() and pull_sample()).
-
Fixed several missing exception handlers for the C API wrappers (increasing robustness in case of bad errors).
-
Fixed a minor bug when resolving streams from a list of known peers (used the wrong time constant).
-
Fixed 2 cases where strings were allocated incorrectly in the liblsl C API (lsl_get_xml() and lsl_pull_sample_str()).
-
Fixed a bug where -0.0 would be transmitted as +0.0 (fixed in the portable_archive upgrade).
-
Fixed several destructors that could have thrown exceptions and thus caused application termination.
-
Fixed a bug that prevented the use of minimum buffer sizes that were larger than the lower capacity bound (then 4096).
Changes for distribution 1.0.21 (library version 1.02) -- after extensive stress testing.
- Added a stress-testing app under testing/StressTest
- Relaxed the timing of reconnect attempts by the inlet a bit.
- Fixed the handling of the chunk size when passed in at construction of an inlet or outlet (oversight)
- Fixed a rare abstract function call or access violation when cancelling resolve attempts
- Fixed a relatively rare access violation in the TCP server shutdown
- Fixed a relatively rare access violation in the stream outlet shutdown
- Fixed an occasional "not a socket" error in the TCP server shutdown
- Fixed handling of some unusual parameter settings in the inlet (buffer size=0)
Library version 1.03
- Added support for Windows XP (required more tolerance in case of missing IPv6 support)
- Fixed a case where an inlet could spam an outlet with rapid reconnect requests
- Rebuilt against a sufficiently old Linux to run out-of-the-box for most distributions
Library version 1.03.1
- Made the resolver tolerant w.r.t. invalid hostnames in the KnownPeers config variable
Library version 1.03.2
- Moved a definition inside the C++ header file to make SWIG happy (which is needed for certain features in the Python wrapper to be enabled)
- pylsl should now work out of the box on all Windows platforms and all recent Python versions
Library Version 1.03.3
- renamed internal use of boost namespace into lslboost to avoid link-time symbol conflicts
- Added the ability to push/pull length-delimeted string values in the C API (lsl_push_sample_buf / lsl_pull_sample_buf) in addition to 0-terminated
- Added an experimental Java wrapper
Library Version 1.04
- Added a preprocessor switch to toggle between using the system-supplied boost or the shrink-wrapped version (in external/lslboost)
- Added documentation on how to get an updated boost distribution included with liblsl (and added a script to automate that)
Library Version 1.05
- Suppressed a spurious warning about non-matching query ids
Library Version 1.10 (mostly throughput optimizations)
- Added the ability to allocate ports outside the default port range once if it is exhausted (configurable, enabled by default).
- Replaced consumer_queue implementation by a lock-free single-producer/single-consumer queue
- Minor speed improvements in data_receiver: Removed a slow check in pull_sample() and calling local_clock() only every k'th iteration in data_thread().
- Changed the data layout of the sample class for faster allocation/deallocation.
- Speeded up the assignment/retrieval functions of the sample class (uses memcpy where appropriate).
- Added a factory class for fast allocation/deallocation of samples.
- Implemented a faster data transmission protocol (1.10) for samples, as alternative to the baseline protocol (1.00).
- Implemented a new version of protocol negotiation between tcp_server and data_receiver, using an HTTP-like request/response style.
- Fixed some potential rare hang bugs during shutdown of inlets and outlets (deadlocks/livelocks)
- Added the ability to transmit multiplexed chunks to the C and C++ APIs
- Minor improvements to documentation
- Added clean cross-platform Python and C# wrappers (pylsl.py and LSL.cs)