labrecorder 1.0.0rc0__cp311-cp311-macosx_26_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of labrecorder might be problematic. Click here for more details.
- Frameworks/lsl.framework/Versions/A/Resources/CMake/LSLCMake.cmake +495 -0
- Frameworks/lsl.framework/Versions/A/Resources/CMake/LSLConfig-release.cmake +19 -0
- Frameworks/lsl.framework/Versions/A/Resources/CMake/LSLConfig.cmake +102 -0
- Frameworks/lsl.framework/Versions/A/Resources/CMake/LSLConfigVersion.cmake +43 -0
- Frameworks/lsl.framework/Versions/A/Resources/Info.plist +28 -0
- Frameworks/lsl.framework/Versions/A/_CodeSignature/CodeResources +240 -0
- Frameworks/lsl.framework/Versions/A/include/lsl/common.h +229 -0
- Frameworks/lsl.framework/Versions/A/include/lsl/inlet.h +309 -0
- Frameworks/lsl.framework/Versions/A/include/lsl/outlet.h +252 -0
- Frameworks/lsl.framework/Versions/A/include/lsl/resolver.h +156 -0
- Frameworks/lsl.framework/Versions/A/include/lsl/streaminfo.h +196 -0
- Frameworks/lsl.framework/Versions/A/include/lsl/types.h +60 -0
- Frameworks/lsl.framework/Versions/A/include/lsl/xml.h +103 -0
- Frameworks/lsl.framework/Versions/A/include/lsl_c.h +36 -0
- Frameworks/lsl.framework/Versions/A/include/lsl_cpp.h +1720 -0
- Frameworks/lsl.framework/Versions/A/lsl +0 -0
- Frameworks/lsl.framework/lsl +0 -0
- LICENSE +21 -0
- LabRecorder.cfg +69 -0
- LabRecorderCLI +0 -0
- README.md +184 -0
- labrecorder-1.0.0rc0.dist-info/METADATA +193 -0
- labrecorder-1.0.0rc0.dist-info/RECORD +27 -0
- labrecorder-1.0.0rc0.dist-info/WHEEL +5 -0
- labrecorder-1.0.0rc0.dist-info/licenses/LICENSE +21 -0
- labrecorder.cpython-311-darwin.so +0 -0
- libxdfwriter.a +0 -0
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
#include "common.h"
|
|
3
|
+
#include "types.h"
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
/// @file inlet.h Stream inlet functions
|
|
7
|
+
|
|
8
|
+
/** @defgroup lsl_inlet The lsl_inlet object
|
|
9
|
+
* @{
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Construct a new stream inlet from a resolved stream info.
|
|
14
|
+
* @param info A resolved stream info object (as coming from one of the resolver functions).
|
|
15
|
+
* @note The inlet makes a copy of the info object at its construction.
|
|
16
|
+
* @note The stream_inlet may also be constructed with a fully-specified stream_info, if the desired
|
|
17
|
+
* channel format and count is already known up-front, but this is strongly discouraged and should
|
|
18
|
+
* only ever be done if there is no time to resolve the stream up-front (e.g., due to limitations
|
|
19
|
+
* in the client program).
|
|
20
|
+
* @param max_buflen Optionally the maximum amount of data to buffer (in seconds if there is a
|
|
21
|
+
* nominal sampling rate, otherwise x100 in samples).
|
|
22
|
+
*
|
|
23
|
+
* Recording applications want to use a fairly large buffer size here, while real-time applications
|
|
24
|
+
* would only buffer as much as they need to perform their next calculation.
|
|
25
|
+
*
|
|
26
|
+
* A good default is 360, which corresponds to 6 minutes of data.
|
|
27
|
+
* @param max_chunklen Optionally the maximum size, in samples, at which chunks are transmitted.
|
|
28
|
+
* If specified as 0, the chunk sizes preferred by the sender are used.
|
|
29
|
+
* Recording applications can use a generous size here (leaving it to the network how to pack
|
|
30
|
+
* things), while real-time applications may want a finer (perhaps 1-sample) granularity.
|
|
31
|
+
* @param recover Try to silently recover lost streams that are recoverable (=those that that have a
|
|
32
|
+
* source_id set).
|
|
33
|
+
*
|
|
34
|
+
* It is generally a good idea to enable this, unless the application wants to act in a special way
|
|
35
|
+
* when a data provider has temporarily crashed.
|
|
36
|
+
*
|
|
37
|
+
* If recover is 0 or the stream is not recoverable, most outlet functions will return an
|
|
38
|
+
* #lsl_lost_error if the stream's source is lost.
|
|
39
|
+
* @return A newly created lsl_inlet handle or NULL in the event that an error occurred.
|
|
40
|
+
*/
|
|
41
|
+
extern LIBLSL_C_API lsl_inlet lsl_create_inlet(lsl_streaminfo info, int32_t max_buflen, int32_t max_chunklen, int32_t recover);
|
|
42
|
+
/** @copydoc lsl_create_inlet()
|
|
43
|
+
* @param flags An integer that is the result of bitwise OR'ing one or more options from
|
|
44
|
+
* #lsl_transport_options_t together (e.g., #transp_bufsize_samples)
|
|
45
|
+
*/
|
|
46
|
+
extern LIBLSL_C_API lsl_inlet lsl_create_inlet_ex(lsl_streaminfo info, int32_t max_buflen,
|
|
47
|
+
int32_t max_chunklen, int32_t recover, lsl_transport_options_t flags);
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Destructor.
|
|
51
|
+
* The inlet will automatically disconnect if destroyed.
|
|
52
|
+
*/
|
|
53
|
+
extern LIBLSL_C_API void lsl_destroy_inlet(lsl_inlet in);
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Retrieve the complete information of the given stream, including the extended description.
|
|
57
|
+
* Can be invoked at any time of the stream's lifetime.
|
|
58
|
+
* @param in The lsl_inlet object to act on.
|
|
59
|
+
* @param timeout Timeout of the operation. Use LSL_FOREVER to effectively disable it.
|
|
60
|
+
* @param[out] ec Error code: if nonzero, can be either lsl_timeout_error (if the timeout has
|
|
61
|
+
* expired) or #lsl_lost_error (if the stream source has been lost).
|
|
62
|
+
* @return A copy of the full streaminfo of the inlet or NULL in the event that an error happened.
|
|
63
|
+
* @note It is the user's responsibility to destroy it when it is no longer needed.
|
|
64
|
+
*/
|
|
65
|
+
extern LIBLSL_C_API lsl_streaminfo lsl_get_fullinfo(lsl_inlet in, double timeout, int32_t *ec);
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Subscribe to the data stream.
|
|
69
|
+
*
|
|
70
|
+
* All samples pushed in at the other end from this moment onwards will be queued and
|
|
71
|
+
* eventually be delivered in response to pull_sample() calls.
|
|
72
|
+
* Pulling a sample without some preceding lsl_open_stream() is permitted (the stream will then be
|
|
73
|
+
* opened implicitly).
|
|
74
|
+
* @param in The lsl_inlet object to act on.
|
|
75
|
+
* @param timeout Optional timeout of the operation. Use LSL_FOREVER to effectively disable it.
|
|
76
|
+
* @param[out] ec Error code: if nonzero, can be either #lsl_timeout_error (if the timeout has
|
|
77
|
+
* expired) or lsl_lost_error (if the stream source has been lost).
|
|
78
|
+
*/
|
|
79
|
+
extern LIBLSL_C_API void lsl_open_stream(lsl_inlet in, double timeout, int32_t *ec);
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Drop the current data stream.
|
|
83
|
+
*
|
|
84
|
+
* All samples that are still buffered or in flight will be dropped and transmission
|
|
85
|
+
* and buffering of data for this inlet will be stopped. If an application stops being
|
|
86
|
+
* interested in data from a source (temporarily or not) but keeps the outlet alive,
|
|
87
|
+
* it should call lsl_close_stream() to not waste unnecessary system and network
|
|
88
|
+
* resources.
|
|
89
|
+
*/
|
|
90
|
+
extern LIBLSL_C_API void lsl_close_stream(lsl_inlet in);
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* @brief Retrieve an estimated time correction offset for the given stream.
|
|
94
|
+
*
|
|
95
|
+
* The first call to this function takes several milliseconds until a reliable first estimate is
|
|
96
|
+
* obtained. Subsequent calls are instantaneous (and rely on periodic background updates).
|
|
97
|
+
*
|
|
98
|
+
* On a well-behaved network, the precision of these estimates should be below 1 ms (empirically it
|
|
99
|
+
* is within +/-0.2 ms).
|
|
100
|
+
*
|
|
101
|
+
* To get a measure of whether the network is well-behaved, use #lsl_time_correction_ex and check
|
|
102
|
+
* uncertainty (which maps to round-trip-time). 0.2 ms is typical of wired networks.
|
|
103
|
+
*
|
|
104
|
+
* 2 ms is typical of wireless networks. The number can be much higher on poor networks.
|
|
105
|
+
*
|
|
106
|
+
* @param in The lsl_inlet object to act on.
|
|
107
|
+
* @param timeout Timeout to acquire the first time-correction estimate.
|
|
108
|
+
* Use LSL_FOREVER to defuse the timeout.
|
|
109
|
+
* @param[out] ec Error code: if nonzero, can be either #lsl_timeout_error (if the timeout has
|
|
110
|
+
* expired) or lsl_lost_error (if the stream source has been lost).
|
|
111
|
+
* @return The time correction estimate.
|
|
112
|
+
* This is the number that needs to be added to a time stamp that was remotely generated via
|
|
113
|
+
* lsl_local_clock() to map it into the local clock domain of this machine.
|
|
114
|
+
*/
|
|
115
|
+
extern LIBLSL_C_API double lsl_time_correction(lsl_inlet in, double timeout, int32_t *ec);
|
|
116
|
+
/** @copydoc lsl_time_correction()
|
|
117
|
+
* @param remote_time The current time of the remote computer that was used to generate this
|
|
118
|
+
* time_correction.
|
|
119
|
+
* If desired, the client can fit time_correction vs remote_time to improve the real-time
|
|
120
|
+
* time_correction further.
|
|
121
|
+
* @param uncertainty The maximum uncertainty of the given time correction.
|
|
122
|
+
*/
|
|
123
|
+
extern LIBLSL_C_API double lsl_time_correction_ex(lsl_inlet in, double *remote_time, double *uncertainty, double timeout, int32_t *ec);
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Set post-processing flags to use.
|
|
128
|
+
*
|
|
129
|
+
* By default, the inlet performs NO post-processing and returns the ground-truth time stamps, which
|
|
130
|
+
* can then be manually synchronized using time_correction(), and then smoothed/dejittered if
|
|
131
|
+
* desired.
|
|
132
|
+
*
|
|
133
|
+
* This function allows automating these two and possibly more operations.
|
|
134
|
+
* @warning When you enable this, you will no longer receive or be able to recover the original time
|
|
135
|
+
* stamps.
|
|
136
|
+
* @param in The lsl_inlet object to act on.
|
|
137
|
+
* @param flags An integer that is the result of bitwise OR'ing one or more options from
|
|
138
|
+
* #lsl_processing_options_t together (e.g., #proc_clocksync|#proc_dejitter);
|
|
139
|
+
* a good setting is to use #proc_ALL.
|
|
140
|
+
* @return The error code: if nonzero, can be #lsl_argument_error if an unknown flag was passed in.
|
|
141
|
+
*/
|
|
142
|
+
extern LIBLSL_C_API int32_t lsl_set_postprocessing(lsl_inlet in, uint32_t flags);
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
/* === Pulling a sample from the inlet === */
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Pull a sample from the inlet and read it into a pointer to values.
|
|
149
|
+
* Handles type checking & conversion.
|
|
150
|
+
* @param in The #lsl_inlet object to act on.
|
|
151
|
+
* @param[out] buffer A pointer to hold the resulting values.
|
|
152
|
+
* @param buffer_elements The number of samples allocated in the buffer.
|
|
153
|
+
* @attention It is the responsibility of the user to allocate enough memory.
|
|
154
|
+
* @param timeout The timeout for this operation, if any.
|
|
155
|
+
* Use #LSL_FOREVER to effectively disable it. It is also permitted to use 0.0 here;
|
|
156
|
+
* in this case a sample is only returned if one is currently buffered.
|
|
157
|
+
* @param[out] ec Error code: can be either no error or #lsl_lost_error
|
|
158
|
+
* (if the stream source has been lost).<br>
|
|
159
|
+
* @note If the timeout expires before a new sample was received the function returns 0.0;
|
|
160
|
+
* ec is *not* set to #lsl_timeout_error (because this case is not considered an error condition).
|
|
161
|
+
* @return The capture time of the sample on the remote machine, or 0.0 if no new sample was
|
|
162
|
+
* available. To remap this time stamp to the local clock, add the value returned by
|
|
163
|
+
* lsl_time_correction() to it.
|
|
164
|
+
* @{
|
|
165
|
+
*/
|
|
166
|
+
extern LIBLSL_C_API double lsl_pull_sample_f(lsl_inlet in, float *buffer, int32_t buffer_elements, double timeout, int32_t *ec);
|
|
167
|
+
extern LIBLSL_C_API double lsl_pull_sample_d(lsl_inlet in, double *buffer, int32_t buffer_elements, double timeout, int32_t *ec);
|
|
168
|
+
extern LIBLSL_C_API double lsl_pull_sample_l(lsl_inlet in, int64_t *buffer, int32_t buffer_elements, double timeout, int32_t *ec);
|
|
169
|
+
extern LIBLSL_C_API double lsl_pull_sample_i(lsl_inlet in, int32_t *buffer, int32_t buffer_elements, double timeout, int32_t *ec);
|
|
170
|
+
extern LIBLSL_C_API double lsl_pull_sample_s(lsl_inlet in, int16_t *buffer, int32_t buffer_elements, double timeout, int32_t *ec);
|
|
171
|
+
extern LIBLSL_C_API double lsl_pull_sample_c(lsl_inlet in, char *buffer, int32_t buffer_elements, double timeout, int32_t *ec);
|
|
172
|
+
extern LIBLSL_C_API double lsl_pull_sample_str(lsl_inlet in, char **buffer, int32_t buffer_elements, double timeout, int32_t *ec);
|
|
173
|
+
///@}
|
|
174
|
+
|
|
175
|
+
/** @copydoc lsl_pull_sample_f
|
|
176
|
+
* These strings may contains 0's, therefore the lengths are read into the buffer_lengths array.
|
|
177
|
+
* @param buffer_lengths
|
|
178
|
+
* A pointer to an array that holds the resulting lengths for each returned binary string.*/
|
|
179
|
+
extern LIBLSL_C_API double lsl_pull_sample_buf(lsl_inlet in, char **buffer, uint32_t *buffer_lengths, int32_t buffer_elements, double timeout, int32_t *ec);
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Pull a sample from the inlet and read it into a custom struct or buffer.
|
|
183
|
+
*
|
|
184
|
+
* Overall size checking but no type checking or conversion are done.
|
|
185
|
+
* Do not use for variable-size/string-formatted streams.
|
|
186
|
+
* @param in The #lsl_inlet object to act on.
|
|
187
|
+
* @param[out] buffer A pointer to hold the resulting values.
|
|
188
|
+
* @param buffer_bytes Length of the array held by buffer in bytes, not items
|
|
189
|
+
* @param timeout The timeout for this operation, if any.
|
|
190
|
+
* Use #LSL_FOREVER to effectively disable it. It is also permitted to use 0.0 here;
|
|
191
|
+
* in this case a sample is only returned if one is currently buffered.
|
|
192
|
+
* @param[out] ec Error code: can be either no error or #lsl_lost_error
|
|
193
|
+
* (if the stream source has been lost).<br>
|
|
194
|
+
* @note If the timeout expires before a new sample was received the function returns 0.0;
|
|
195
|
+
* ec is *not* set to #lsl_timeout_error (because this case is not considered an error condition).
|
|
196
|
+
* @return The capture time of the sample on the remote machine, or 0.0 if no new sample was
|
|
197
|
+
* available. To remap this time stamp to the local clock, add the value returned by
|
|
198
|
+
* lsl_time_correction() to it.
|
|
199
|
+
*/
|
|
200
|
+
extern LIBLSL_C_API double lsl_pull_sample_v(lsl_inlet in, void *buffer, int32_t buffer_bytes, double timeout, int32_t *ec);
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Pull a chunk of data from the inlet and read it into a buffer.
|
|
204
|
+
*
|
|
205
|
+
* Handles type checking & conversion.
|
|
206
|
+
*
|
|
207
|
+
* @attention Note that the provided data buffer size is measured in channel values (e.g. floats)
|
|
208
|
+
* rather than in samples.
|
|
209
|
+
* @param in The lsl_inlet object to act on.
|
|
210
|
+
* @param[out] data_buffer A pointer to a buffer of data values where the results shall be stored.
|
|
211
|
+
* @param[out] timestamp_buffer A pointer to a double buffer where time stamps shall be stored.
|
|
212
|
+
*
|
|
213
|
+
* If this is NULL, no time stamps will be returned.
|
|
214
|
+
* @param data_buffer_elements The size of the data buffer, in channel data elements (of type T).
|
|
215
|
+
* Must be a multiple of the stream's channel count.
|
|
216
|
+
* @param timestamp_buffer_elements The size of the timestamp buffer.
|
|
217
|
+
*
|
|
218
|
+
* If a timestamp buffer is provided then this must correspond to the same number of samples as
|
|
219
|
+
* data_buffer_elements.
|
|
220
|
+
* @param timeout The timeout for this operation, if any.
|
|
221
|
+
*
|
|
222
|
+
* When the timeout expires, the function may return before the entire buffer is filled.
|
|
223
|
+
* The default value of 0.0 will retrieve only data available for immediate pickup.
|
|
224
|
+
* @param[out] ec Error code: can be either no error or #lsl_lost_error (if the stream source has
|
|
225
|
+
* been lost).
|
|
226
|
+
* @note if the timeout expires before a new sample was received the function returns 0.0;
|
|
227
|
+
* ec is *not* set to #lsl_timeout_error (because this case is not considered an error condition).
|
|
228
|
+
* @return data_elements_written Number of channel data elements written to the data buffer.
|
|
229
|
+
* @{
|
|
230
|
+
*/
|
|
231
|
+
extern LIBLSL_C_API unsigned long lsl_pull_chunk_f(lsl_inlet in, float *data_buffer, double *timestamp_buffer, unsigned long data_buffer_elements, unsigned long timestamp_buffer_elements, double timeout, int32_t *ec);
|
|
232
|
+
extern LIBLSL_C_API unsigned long lsl_pull_chunk_d(lsl_inlet in, double *data_buffer, double *timestamp_buffer, unsigned long data_buffer_elements, unsigned long timestamp_buffer_elements, double timeout, int32_t *ec);
|
|
233
|
+
extern LIBLSL_C_API unsigned long lsl_pull_chunk_l(lsl_inlet in, int64_t *data_buffer, double *timestamp_buffer, unsigned long data_buffer_elements, unsigned long timestamp_buffer_elements, double timeout, int32_t *ec);
|
|
234
|
+
extern LIBLSL_C_API unsigned long lsl_pull_chunk_i(lsl_inlet in, int32_t *data_buffer, double *timestamp_buffer, unsigned long data_buffer_elements, unsigned long timestamp_buffer_elements, double timeout, int32_t *ec);
|
|
235
|
+
extern LIBLSL_C_API unsigned long lsl_pull_chunk_s(lsl_inlet in, int16_t *data_buffer, double *timestamp_buffer, unsigned long data_buffer_elements, unsigned long timestamp_buffer_elements, double timeout, int32_t *ec);
|
|
236
|
+
extern LIBLSL_C_API unsigned long lsl_pull_chunk_c(lsl_inlet in, char *data_buffer, double *timestamp_buffer, unsigned long data_buffer_elements, unsigned long timestamp_buffer_elements, double timeout, int32_t *ec);
|
|
237
|
+
extern LIBLSL_C_API unsigned long lsl_pull_chunk_str(lsl_inlet in, char **data_buffer, double *timestamp_buffer, unsigned long data_buffer_elements, unsigned long timestamp_buffer_elements, double timeout, int32_t *ec);
|
|
238
|
+
|
|
239
|
+
///@}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Pull a chunk of data from the inlet and read it into an array of binary strings.
|
|
243
|
+
*
|
|
244
|
+
* These strings may contains 0's, therefore the lengths are read into the lengths_buffer array.
|
|
245
|
+
* Handles type checking & conversion.
|
|
246
|
+
* IMPORTANT: Note that the provided data buffer size is measured in channel values (e.g., floats)
|
|
247
|
+
* rather than in samples.
|
|
248
|
+
* @param in The lsl_inlet object to act on.
|
|
249
|
+
* @param[out] data_buffer A pointer to a buffer of data values where the results shall be stored.
|
|
250
|
+
* @param[out] lengths_buffer A pointer to an array that holds the resulting lengths for each
|
|
251
|
+
* returned binary string.
|
|
252
|
+
* @param timestamp_buffer A pointer to a buffer of timestamp values where time stamps shall be
|
|
253
|
+
* stored. If this is NULL, no time stamps will be returned.
|
|
254
|
+
* @param data_buffer_elements The size of the data buffer, in channel data elements (of type T).
|
|
255
|
+
* Must be a multiple of the stream's channel count.
|
|
256
|
+
* @param timestamp_buffer_elements The size of the timestamp buffer. If a timestamp buffer is
|
|
257
|
+
* provided then this must correspond to the same number of samples as data_buffer_elements.
|
|
258
|
+
* @param timeout The timeout for this operation, if any.
|
|
259
|
+
*
|
|
260
|
+
* When the timeout expires, the function may return before the entire buffer is filled.
|
|
261
|
+
*
|
|
262
|
+
* The default value of 0.0 will retrieve only data available for immediate pickup.
|
|
263
|
+
* @param[out] ec Error code: can be either no error or #lsl_lost_error (if the stream source has
|
|
264
|
+
* been lost).
|
|
265
|
+
* @note If the timeout expires before a new sample was received the function returns 0.0; ec is
|
|
266
|
+
* *not* set to #lsl_timeout_error (because this case is not considered an error condition).
|
|
267
|
+
* @return data_elements_written Number of channel data elements written to the data buffer.
|
|
268
|
+
*/
|
|
269
|
+
|
|
270
|
+
extern LIBLSL_C_API unsigned long lsl_pull_chunk_buf(lsl_inlet in, char **data_buffer, uint32_t *lengths_buffer, double *timestamp_buffer, unsigned long data_buffer_elements, unsigned long timestamp_buffer_elements, double timeout, int32_t *ec);
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Query whether samples are currently available for immediate pickup.
|
|
274
|
+
*
|
|
275
|
+
* Note that it is not a good idea to use samples_available() to determine whether
|
|
276
|
+
* a pull_*() call would block: to be sure, set the pull timeout to 0.0 or an acceptably
|
|
277
|
+
* low value. If the underlying implementation supports it, the value will be the number of
|
|
278
|
+
* samples available (otherwise it will be 1 or 0).
|
|
279
|
+
*/
|
|
280
|
+
extern LIBLSL_C_API uint32_t lsl_samples_available(lsl_inlet in);
|
|
281
|
+
|
|
282
|
+
/// Drop all queued not-yet pulled samples, return the nr of dropped samples
|
|
283
|
+
extern LIBLSL_C_API uint32_t lsl_inlet_flush(lsl_inlet in);
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Query whether the clock was potentially reset since the last call to lsl_was_clock_reset().
|
|
287
|
+
*
|
|
288
|
+
* This is rarely-used function is only needed for applications that combine multiple time_correction
|
|
289
|
+
* values to estimate precise clock drift if they should tolerate cases where the source machine was
|
|
290
|
+
* hot-swapped or restarted.
|
|
291
|
+
*/
|
|
292
|
+
extern LIBLSL_C_API uint32_t lsl_was_clock_reset(lsl_inlet in);
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Override the half-time (forget factor) of the time-stamp smoothing.
|
|
296
|
+
*
|
|
297
|
+
* The default is 90 seconds unless a different value is set in the config file.
|
|
298
|
+
*
|
|
299
|
+
* Using a longer window will yield lower jitter in the time stamps, but longer windows will have
|
|
300
|
+
* trouble tracking changes in the clock rate (usually due to temperature changes); the default is
|
|
301
|
+
* able to track changes up to 10 degrees C per minute sufficiently well.
|
|
302
|
+
* @param in The lsl_inlet object to act on.
|
|
303
|
+
* @param value The new value, in seconds. This is the time after which a past sample
|
|
304
|
+
* will be weighted by 1/2 in the exponential smoothing window.
|
|
305
|
+
* @return The error code: if nonzero, can be #lsl_argument_error if an unknown flag was passed in.
|
|
306
|
+
*/
|
|
307
|
+
extern LIBLSL_C_API int32_t lsl_smoothing_halftime(lsl_inlet in, float value);
|
|
308
|
+
|
|
309
|
+
/// @}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
#include "./common.h"
|
|
3
|
+
#include "types.h"
|
|
4
|
+
|
|
5
|
+
/// @file outlet.h Stream outlet functions
|
|
6
|
+
|
|
7
|
+
/** @defgroup outlet The lsl_outlet object
|
|
8
|
+
*
|
|
9
|
+
* This object represents an outlet sending data to all connected inlets.
|
|
10
|
+
*
|
|
11
|
+
* The data is pushed sample-by-sample or chunk-by-chunk into the outlet, and can consist of single-
|
|
12
|
+
* or multichannel data, regular or irregular sampling rate, with uniform value types (integers,
|
|
13
|
+
* floats, doubles, strings).
|
|
14
|
+
*
|
|
15
|
+
* Streams can have arbitrary XML meta-data (akin to a file header).
|
|
16
|
+
* By creating an outlet the stream is made visible to a collection of computers (defined by the
|
|
17
|
+
* network settings/layout) where one can subscribe to it by creating an inlet.
|
|
18
|
+
* @{
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Establish a new stream outlet. This makes the stream discoverable.
|
|
23
|
+
* @param info The stream information to use for creating this stream.
|
|
24
|
+
* Stays constant over the lifetime of the outlet.
|
|
25
|
+
* @note the outlet makes a copy of the streaminfo object upon construction (so the old info should
|
|
26
|
+
* still be destroyed.)
|
|
27
|
+
* @param chunk_size Optionally the desired chunk granularity (in samples) for transmission.
|
|
28
|
+
* If specified as 0, each push operation yields one chunk.
|
|
29
|
+
* Stream recipients can have this setting bypassed.
|
|
30
|
+
* @param max_buffered Optionally the maximum amount of data to buffer (in seconds if there is a
|
|
31
|
+
* nominal sampling rate, otherwise x100 in samples). A good default is 360, which corresponds to 6
|
|
32
|
+
* minutes of data. Note that, for high-bandwidth data you will almost certainly want to use a lower
|
|
33
|
+
* value here to avoid running out of RAM.
|
|
34
|
+
* @return A newly created lsl_outlet handle or NULL in the event that an error occurred.
|
|
35
|
+
*/
|
|
36
|
+
extern LIBLSL_C_API lsl_outlet lsl_create_outlet(lsl_streaminfo info, int32_t chunk_size, int32_t max_buffered);
|
|
37
|
+
/** @copydoc lsl_create_outlet()
|
|
38
|
+
* @param flags An integer that is the result of bitwise OR'ing one or more options from
|
|
39
|
+
* #lsl_transport_options_t together (e.g., #transp_bufsize_samples|#transp_bufsize_thousandths)
|
|
40
|
+
*/
|
|
41
|
+
extern LIBLSL_C_API lsl_outlet lsl_create_outlet_ex(
|
|
42
|
+
lsl_streaminfo info, int32_t chunk_size, int32_t max_buffered, lsl_transport_options_t flags);
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Destroy an outlet.
|
|
46
|
+
* The outlet will no longer be discoverable after destruction and all connected inlets will stop
|
|
47
|
+
* delivering data.
|
|
48
|
+
*/
|
|
49
|
+
extern LIBLSL_C_API void lsl_destroy_outlet(lsl_outlet out);
|
|
50
|
+
|
|
51
|
+
/** Push a pointer to some values as a sample into the outlet.
|
|
52
|
+
* Handles type checking & conversion.
|
|
53
|
+
* @param out The lsl_outlet object through which to push the data.
|
|
54
|
+
* @param data A pointer to values to push. The number of values pointed to must be no less than the
|
|
55
|
+
* number of channels in the sample.
|
|
56
|
+
* #lsl_local_clock(); if omitted, the current time is used.
|
|
57
|
+
* @return Error code of the operation or lsl_no_error if successful (usually attributed to the
|
|
58
|
+
* wrong data type).
|
|
59
|
+
* @{
|
|
60
|
+
*/
|
|
61
|
+
extern LIBLSL_C_API int32_t lsl_push_sample_f(lsl_outlet out, const float *data);
|
|
62
|
+
extern LIBLSL_C_API int32_t lsl_push_sample_d(lsl_outlet out, const double *data);
|
|
63
|
+
extern LIBLSL_C_API int32_t lsl_push_sample_l(lsl_outlet out, const int64_t *data);
|
|
64
|
+
extern LIBLSL_C_API int32_t lsl_push_sample_i(lsl_outlet out, const int32_t *data);
|
|
65
|
+
extern LIBLSL_C_API int32_t lsl_push_sample_s(lsl_outlet out, const int16_t *data);
|
|
66
|
+
extern LIBLSL_C_API int32_t lsl_push_sample_c(lsl_outlet out, const char *data);
|
|
67
|
+
extern LIBLSL_C_API int32_t lsl_push_sample_str(lsl_outlet out, const char **data);
|
|
68
|
+
extern LIBLSL_C_API int32_t lsl_push_sample_v(lsl_outlet out, const void *data);
|
|
69
|
+
/// @}
|
|
70
|
+
/** @copydoc lsl_push_sample_f
|
|
71
|
+
* @param timestamp Optionally the capture time of the sample, in agreement with
|
|
72
|
+
* lsl_local_clock(); if omitted, the current time is used.
|
|
73
|
+
* @{
|
|
74
|
+
*/
|
|
75
|
+
extern LIBLSL_C_API int32_t lsl_push_sample_ft(lsl_outlet out, const float *data, double timestamp);
|
|
76
|
+
extern LIBLSL_C_API int32_t lsl_push_sample_dt(lsl_outlet out, const double *data, double timestamp);
|
|
77
|
+
extern LIBLSL_C_API int32_t lsl_push_sample_lt(lsl_outlet out, const int64_t *data, double timestamp);
|
|
78
|
+
extern LIBLSL_C_API int32_t lsl_push_sample_it(lsl_outlet out, const int32_t *data, double timestamp);
|
|
79
|
+
extern LIBLSL_C_API int32_t lsl_push_sample_st(lsl_outlet out, const int16_t *data, double timestamp);
|
|
80
|
+
extern LIBLSL_C_API int32_t lsl_push_sample_ct(lsl_outlet out, const char *data, double timestamp);
|
|
81
|
+
extern LIBLSL_C_API int32_t lsl_push_sample_strt(lsl_outlet out, const char **data, double timestamp);
|
|
82
|
+
extern LIBLSL_C_API int32_t lsl_push_sample_vt(lsl_outlet out, const void *data, double timestamp);
|
|
83
|
+
/// @}
|
|
84
|
+
/** @copydoc lsl_push_sample_ft
|
|
85
|
+
* @param pushthrough Whether to push the sample through to the receivers instead of buffering it
|
|
86
|
+
* with subsequent samples. Note that the chunk_size, if specified at outlet construction, takes
|
|
87
|
+
* precedence over the pushthrough flag.
|
|
88
|
+
* @{
|
|
89
|
+
*/
|
|
90
|
+
extern LIBLSL_C_API int32_t lsl_push_sample_ftp(lsl_outlet out, const float *data, double timestamp, int32_t pushthrough);
|
|
91
|
+
extern LIBLSL_C_API int32_t lsl_push_sample_dtp(lsl_outlet out, const double *data, double timestamp, int32_t pushthrough);
|
|
92
|
+
extern LIBLSL_C_API int32_t lsl_push_sample_ltp(lsl_outlet out, const int64_t *data, double timestamp, int32_t pushthrough);
|
|
93
|
+
extern LIBLSL_C_API int32_t lsl_push_sample_itp(lsl_outlet out, const int32_t *data, double timestamp, int32_t pushthrough);
|
|
94
|
+
extern LIBLSL_C_API int32_t lsl_push_sample_stp(lsl_outlet out, const int16_t *data, double timestamp, int32_t pushthrough);
|
|
95
|
+
extern LIBLSL_C_API int32_t lsl_push_sample_ctp(lsl_outlet out, const char *data, double timestamp, int32_t pushthrough);
|
|
96
|
+
extern LIBLSL_C_API int32_t lsl_push_sample_strtp(lsl_outlet out, const char **data, double timestamp, int32_t pushthrough);
|
|
97
|
+
extern LIBLSL_C_API int32_t lsl_push_sample_vtp(lsl_outlet out, const void *data, double timestamp, int32_t pushthrough);
|
|
98
|
+
///@}
|
|
99
|
+
|
|
100
|
+
/** @copybrief lsl_push_sample_ftp
|
|
101
|
+
* @see lsl_push_sample_ftp
|
|
102
|
+
* @param out The lsl_outlet object through which to push the data.
|
|
103
|
+
* @param data A pointer to values to push. The number of values pointed to must be no less than the
|
|
104
|
+
* number of channels in the sample.
|
|
105
|
+
* @param lengths A pointer the number of elements to push for each channel (string lengths).
|
|
106
|
+
*/
|
|
107
|
+
extern LIBLSL_C_API int32_t lsl_push_sample_buf(lsl_outlet out, const char **data, const uint32_t *lengths);
|
|
108
|
+
/** @copydoc lsl_push_sample_buf
|
|
109
|
+
* @param timestamp @see lsl_push_sample_ftp */
|
|
110
|
+
extern LIBLSL_C_API int32_t lsl_push_sample_buft(lsl_outlet out, const char **data, const uint32_t *lengths, double timestamp);
|
|
111
|
+
/** @copydoc lsl_push_sample_buft
|
|
112
|
+
* @param pushthrough @see lsl_push_sample_ftp */
|
|
113
|
+
extern LIBLSL_C_API int32_t lsl_push_sample_buftp(lsl_outlet out, const char **data, const uint32_t *lengths, double timestamp, int32_t pushthrough);
|
|
114
|
+
|
|
115
|
+
/** Push a chunk of multiplexed samples into the outlet. One timestamp per sample is provided.
|
|
116
|
+
*
|
|
117
|
+
* @attention Note that the provided buffer size is measured in channel values (e.g. floats) rather
|
|
118
|
+
* than in samples.
|
|
119
|
+
*
|
|
120
|
+
* Handles type checking & conversion.
|
|
121
|
+
* @param out The lsl_outlet object through which to push the data.
|
|
122
|
+
* @param data A buffer of channel values holding the data for zero or more successive samples to
|
|
123
|
+
* send.
|
|
124
|
+
* @param data_elements The number of data values (of type T) in the data buffer. Must be a multiple
|
|
125
|
+
* of the channel count.
|
|
126
|
+
* @return Error code of the operation (usually attributed to the wrong data type).
|
|
127
|
+
* @{
|
|
128
|
+
*/
|
|
129
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_f(lsl_outlet out, const float *data, unsigned long data_elements);
|
|
130
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_d(lsl_outlet out, const double *data, unsigned long data_elements);
|
|
131
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_l(lsl_outlet out, const int64_t *data, unsigned long data_elements);
|
|
132
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_i(lsl_outlet out, const int32_t *data, unsigned long data_elements);
|
|
133
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_s(lsl_outlet out, const int16_t *data, unsigned long data_elements);
|
|
134
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_c(lsl_outlet out, const char *data, unsigned long data_elements);
|
|
135
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_str(lsl_outlet out, const char **data, unsigned long data_elements);
|
|
136
|
+
/// @}
|
|
137
|
+
|
|
138
|
+
/** @copydoc lsl_push_chunk_f
|
|
139
|
+
* @param timestamp Optionally the capture time of the most recent sample, in agreement with
|
|
140
|
+
* lsl_local_clock(); if omitted, the current time is used.
|
|
141
|
+
* The time stamps of other samples are automatically derived based on the sampling rate of the
|
|
142
|
+
* stream.
|
|
143
|
+
* @{
|
|
144
|
+
*/
|
|
145
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_ft(lsl_outlet out, const float *data, unsigned long data_elements, double timestamp);
|
|
146
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_dt(lsl_outlet out, const double *data, unsigned long data_elements, double timestamp);
|
|
147
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_lt(lsl_outlet out, const int64_t *data, unsigned long data_elements, double timestamp);
|
|
148
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_it(lsl_outlet out, const int32_t *data, unsigned long data_elements, double timestamp);
|
|
149
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_st(lsl_outlet out, const int16_t *data, unsigned long data_elements, double timestamp);
|
|
150
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_ct(lsl_outlet out, const char *data, unsigned long data_elements, double timestamp);
|
|
151
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_strt(lsl_outlet out, const char **data, unsigned long data_elements, double timestamp);
|
|
152
|
+
/// @}
|
|
153
|
+
|
|
154
|
+
/** @copydoc lsl_push_chunk_ft
|
|
155
|
+
* @param pushthrough Whether to push the chunk through to the receivers instead of buffering it
|
|
156
|
+
* with subsequent samples. Note that the chunk_size, if specified at outlet construction, takes
|
|
157
|
+
* precedence over the pushthrough flag.
|
|
158
|
+
* @{
|
|
159
|
+
*/
|
|
160
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_ftp(lsl_outlet out, const float *data, unsigned long data_elements, double timestamp, int32_t pushthrough);
|
|
161
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_dtp(lsl_outlet out, const double *data, unsigned long data_elements, double timestamp, int32_t pushthrough);
|
|
162
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_ltp(lsl_outlet out, const int64_t *data, unsigned long data_elements, double timestamp, int32_t pushthrough);
|
|
163
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_itp(lsl_outlet out, const int32_t *data, unsigned long data_elements, double timestamp, int32_t pushthrough);
|
|
164
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_stp(lsl_outlet out, const int16_t *data, unsigned long data_elements, double timestamp, int32_t pushthrough);
|
|
165
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_ctp(lsl_outlet out, const char *data, unsigned long data_elements, double timestamp, int32_t pushthrough);
|
|
166
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_strtp(lsl_outlet out, const char **data, unsigned long data_elements, double timestamp, int32_t pushthrough);
|
|
167
|
+
/// @}
|
|
168
|
+
/** @copydoc lsl_push_chunk_f
|
|
169
|
+
* @param timestamps Buffer holding one time stamp for each sample in the data buffer.
|
|
170
|
+
* @{
|
|
171
|
+
*/
|
|
172
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_ftn(lsl_outlet out, const float *data, unsigned long data_elements, const double *timestamps);
|
|
173
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_dtn(lsl_outlet out, const double *data, unsigned long data_elements, const double *timestamps);
|
|
174
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_ltn(lsl_outlet out, const int64_t *data, unsigned long data_elements, const double *timestamps);
|
|
175
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_itn(lsl_outlet out, const int32_t *data, unsigned long data_elements, const double *timestamps);
|
|
176
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_stn(lsl_outlet out, const int16_t *data, unsigned long data_elements, const double *timestamps);
|
|
177
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_ctn(lsl_outlet out, const char *data, unsigned long data_elements, const double *timestamps);
|
|
178
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_strtn(lsl_outlet out, const char **data, unsigned long data_elements, const double *timestamps);
|
|
179
|
+
/// @}
|
|
180
|
+
|
|
181
|
+
/** @copydoc lsl_push_chunk_ftn
|
|
182
|
+
* @param pushthrough Whether to push the chunk through to the receivers instead of buffering it
|
|
183
|
+
* with subsequent samples. Note that the chunk_size, if specified at outlet construction, takes
|
|
184
|
+
* precedence over the pushthrough flag.
|
|
185
|
+
* @{
|
|
186
|
+
*/
|
|
187
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_ftnp(lsl_outlet out, const float *data, unsigned long data_elements, const double *timestamps, int32_t pushthrough);
|
|
188
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_dtnp(lsl_outlet out, const double *data, unsigned long data_elements, const double *timestamps, int32_t pushthrough);
|
|
189
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_ltnp(lsl_outlet out, const int64_t *data, unsigned long data_elements, const double *timestamps, int32_t pushthrough);
|
|
190
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_itnp(lsl_outlet out, const int32_t *data, unsigned long data_elements, const double *timestamps, int32_t pushthrough);
|
|
191
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_stnp(lsl_outlet out, const int16_t *data, unsigned long data_elements, const double *timestamps, int32_t pushthrough);
|
|
192
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_ctnp(lsl_outlet out, const char *data, unsigned long data_elements, const double *timestamps, int32_t pushthrough);
|
|
193
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_strtnp(lsl_outlet out, const char **data, unsigned long data_elements, const double *timestamps, int32_t pushthrough);
|
|
194
|
+
///@}
|
|
195
|
+
|
|
196
|
+
/** @copybrief lsl_push_chunk_ftp
|
|
197
|
+
* @sa lsl_push_chunk_ftp
|
|
198
|
+
* @param out The lsl_outlet object through which to push the data.
|
|
199
|
+
* @param data An array of channel values holding the data to push.
|
|
200
|
+
* @param lengths Pointer the number of elements to push for each value (string lengths) so that
|
|
201
|
+
* `size(data[i])==lengths[i]`.
|
|
202
|
+
* @param data_elements The number of data values in the data buffer.
|
|
203
|
+
* Must be a multiple of the channel count.
|
|
204
|
+
*/
|
|
205
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_buf(lsl_outlet out, const char **data, const uint32_t *lengths, unsigned long data_elements);
|
|
206
|
+
|
|
207
|
+
/** @copydoc lsl_push_chunk_buf @sa lsl_push_chunk_ftp @sa lsl_push_chunk_buf
|
|
208
|
+
* @param timestamp Optionally the capture time of the most recent sample, in agreement with
|
|
209
|
+
* lsl_local_clock(); if omitted, the current time is used.
|
|
210
|
+
* The time stamps of other samples are automatically derived based on the sampling rate of the
|
|
211
|
+
* stream. */
|
|
212
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_buft(lsl_outlet out, const char **data, const uint32_t *lengths, unsigned long data_elements, double timestamp);
|
|
213
|
+
|
|
214
|
+
/** @copydoc lsl_push_chunk_buft @sa lsl_push_chunk_ftp @sa lsl_push_chunk_buf
|
|
215
|
+
* @param pushthrough Whether to push the chunk through to the receivers instead of buffering it
|
|
216
|
+
* with subsequent samples. Note that the chunk_size, if specified at outlet construction, takes
|
|
217
|
+
* precedence over the pushthrough flag. */
|
|
218
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_buftp(lsl_outlet out, const char **data, const uint32_t *lengths, unsigned long data_elements, double timestamp, int32_t pushthrough);
|
|
219
|
+
|
|
220
|
+
/** @copydoc lsl_push_chunk_buf @sa lsl_push_chunk_ftp @sa lsl_push_chunk_buf
|
|
221
|
+
* @param timestamps Buffer holding one time stamp for each sample in the data buffer. */
|
|
222
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_buftn(lsl_outlet out, const char **data, const uint32_t *lengths, unsigned long data_elements, const double *timestamps);
|
|
223
|
+
|
|
224
|
+
/** @copydoc lsl_push_chunk_buftn @sa lsl_push_chunk_ftp @sa lsl_push_chunk_buf
|
|
225
|
+
* @param pushthrough Whether to push the chunk through to the receivers instead of buffering it
|
|
226
|
+
* with subsequent samples. Note that the chunk_size, if specified at outlet construction, takes
|
|
227
|
+
* precedence over the pushthrough flag. */
|
|
228
|
+
extern LIBLSL_C_API int32_t lsl_push_chunk_buftnp(lsl_outlet out, const char **data, const uint32_t *lengths, unsigned long data_elements, const double *timestamps, int32_t pushthrough);
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Check whether consumers are currently registered.
|
|
232
|
+
* While it does not hurt, there is technically no reason to push samples if there is no consumer.
|
|
233
|
+
*/
|
|
234
|
+
extern LIBLSL_C_API int32_t lsl_have_consumers(lsl_outlet out);
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Wait until some consumer shows up (without wasting resources).
|
|
238
|
+
* @return True if the wait was successful, false if the timeout expired.
|
|
239
|
+
*/
|
|
240
|
+
extern LIBLSL_C_API int32_t lsl_wait_for_consumers(lsl_outlet out, double timeout);
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Retrieve a handle to the stream info provided by this outlet.
|
|
244
|
+
* This is what was used to create the stream (and also has the Additional Network Information
|
|
245
|
+
* fields assigned).
|
|
246
|
+
* @return A copy of the streaminfo of the outlet or NULL in the event that an error occurred.
|
|
247
|
+
* @note It is the user's responsibility to destroy it when it is no longer needed.
|
|
248
|
+
* @sa lsl_destroy_streaminfo()
|
|
249
|
+
*/
|
|
250
|
+
extern LIBLSL_C_API lsl_streaminfo lsl_get_info(lsl_outlet out);
|
|
251
|
+
|
|
252
|
+
///@}
|