diff --git a/LSL.cs b/LSL.cs index 4ee3b6c48a11a11b2bfec1d467eac24784ea3e72..b16151f8a8e3e59a6bbb5de59c4316914d94e28d 100644 --- a/LSL.cs +++ b/LSL.cs @@ -64,13 +64,30 @@ public class liblsl }; /** - * Protocol version. - * The major version is protocol_version() / 100; - * The minor version is protocol_version() % 100; - * Clients with different minor versions are protocol-compatible with each other - * while clients with different major versions will refuse to work together. + * Post-processing options for stream inlets. */ - public static int protocol_version() { return dll.lsl_protocol_version(); } + public enum processing_options_t : byte + { + post_none = 0, // No automatic post-processing; return the ground-truth time stamps for manual post-processing + // (this is the default behavior of the inlet). + post_clocksync = 1, // Perform automatic clock synchronization; equivalent to manually adding the time_correction() value + // to the received time stamps. + post_dejitter = 2, // Remove jitter from time stamps. This will apply a smoothing algorithm to the received time stamps; + // the smoothing needs to see a minimum number of samples (30-120 seconds worst-case) until the remaining + // jitter is consistently below 1ms. + post_monotonize = 4, // Force the time-stamps to be monotonically ascending (only makes sense if timestamps are dejittered). + post_threadsafe = 8, // Post-processing is thread-safe (same inlet can be read from by multiple threads); uses somewhat more CPU. + post_ALL = 1 | 2 | 4 | 8// The combination of all possible post-processing options. + }; + + /** + * Protocol version. + * The major version is protocol_version() / 100; + * The minor version is protocol_version() % 100; + * Clients with different minor versions are protocol-compatible with each other + * while clients with different major versions will refuse to work together. + */ + public static int protocol_version() { return dll.lsl_protocol_version(); } /** * Version of the liblsl library. @@ -546,6 +563,17 @@ public class liblsl */ public void open_stream() { open_stream(FOREVER); } public void open_stream(double timeout) { int ec = 0; dll.lsl_open_stream(obj, timeout, ref ec); check_error(ec); } + + /** + * Set post-processing flags to use. By default, the inlet performs NO post-processing and returns the + * ground-truth time stamps, which can then be manually synchronized using time_correction(), and then + * smoothed/dejittered if desired. This function allows automating these two and possibly more operations. + * Warning: when you enable this, you will no longer receive or be able to recover the original time stamps. + * @param flags An integer that is the result of bitwise OR'ing one or more options from processing_options_t + * together (e.g., post_clocksync|post_dejitter); the default is to enable all options. + */ + public void set_postprocessing() { set_postprocessing(processing_options_t.post_ALL); } + public void set_postprocessing(processing_options_t post_flags) { dll.lsl_set_postprocessing(obj, post_flags); } /** * Drop the current data stream. @@ -1085,6 +1113,9 @@ public class liblsl [DllImport(pathToLib, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)] public static extern void lsl_open_stream(IntPtr obj, double timeout, ref int ec); + + [DllImport(pathToLib, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)] + public static extern void lsl_set_postprocessing(IntPtr obj, processing_options_t processing_flags); [DllImport(pathToLib, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)] public static extern void lsl_close_stream(IntPtr obj);