#pragma once #include "common.h" #include "types.h" /// @file resolver.h Stream resolution functions /** @defgroup continuous_resolver The lsl_continuous_resolver * @ingroup resolve * * Streams can be resolved at a single timepoint once (@ref resolve) or continuously in the * background. * @{ */ /** * Construct a new #lsl_continuous_resolver that resolves all streams on the network. * * This is analogous to the functionality offered by the free function lsl_resolve_streams(). * @param forget_after When a stream is no longer visible on the network (e.g. because it was shut * down), this is the time in seconds after which it is no longer reported by the resolver. * * The recommended default value is 5.0. */ extern LIBLSL_C_API lsl_continuous_resolver lsl_create_continuous_resolver(double forget_after); /** * Construct a new lsl_continuous_resolver that resolves all streams with a specific value for a given * property. * * This is analogous to the functionality provided by the free function lsl_resolve_byprop() * @param prop The #lsl_streaminfo property that should have a specific value (e.g., "name", "type", * "source_id", or "desc/manufaturer"). * @param value The string value that the property should have (e.g., "EEG" as the type property). * @param forget_after When a stream is no longer visible on the network (e.g., because it was shut * down), this is the time in seconds after which it is no longer reported by the resolver. * The recommended default value is 5.0. */ extern LIBLSL_C_API lsl_continuous_resolver lsl_create_continuous_resolver_byprop(const char *prop, const char *value, double forget_after); /** * Construct a new lsl_continuous_resolver that resolves all streams that match a given XPath 1.0 * predicate. * * This is analogous to the functionality provided by the free function lsl_resolve_bypred() * @param pred The predicate string, e.g. * `"name='BioSemi'" or "type='EEG' and starts-with(name,'BioSemi') and count(info/desc/channel)=32"` * @param forget_after When a stream is no longer visible on the network (e.g., because it was shut * down), this is the time in seconds after which it is no longer reported by the resolver. * The recommended default value is 5.0. */ extern LIBLSL_C_API lsl_continuous_resolver lsl_create_continuous_resolver_bypred(const char *pred, double forget_after); /** * Obtain the set of currently present streams on the network (i.e. resolve result). * * @param res A continuous resolver (previously created with one of the * lsl_create_continuous_resolver() functions). * @param buffer A user-allocated buffer to hold the current resolve results.
* @attention It is the user's responsibility to either destroy the resulting streaminfo objects or * to pass them back to the LSL during during creation of an inlet. * @attention The stream_infos returned by the resolver are only short versions that do not include * the lsl_get_desc() field (which can be arbitrarily big). * * To obtain the full stream information you need to call lsl_get_info() on the inlet after you have * created one. * @param buffer_elements The user-provided buffer length. * @return The number of results written into the buffer (never more than the provided # of slots) * or a negative number if an error has occurred (values corresponding to #lsl_error_code_t). */ extern LIBLSL_C_API int32_t lsl_resolver_results(lsl_continuous_resolver res, lsl_streaminfo *buffer, uint32_t buffer_elements); /// Destructor for the continuous resolver. extern LIBLSL_C_API void lsl_destroy_continuous_resolver(lsl_continuous_resolver res); /// @} /** @defgroup resolve Resolving streams on the network * @{*/ /** * Resolve all streams on the network. * * This function returns all currently available streams from any outlet on the network. * The network is usually the subnet specified at the local router, but may also include a multicast * group of machines (given that the network supports it), or a list of hostnames.
* These details may optionally be customized by the experimenter in a configuration file * (see page Network Connectivity in the LSL wiki). * This is the default mechanism used by the browsing programs and the recording program. * @param[out] buffer A user-allocated buffer to hold the resolve results. * @attention It is the user's responsibility to either destroy the resulting streaminfo objects or * to pass them back to the LSL during during creation of an inlet. * * @attention The stream_info's returned by the resolver are only short versions that do not include * the lsl_get_desc() field (which can be arbitrarily big). * To obtain the full stream information you need to call lsl_get_info() on the inlet after you have * created one. * @param buffer_elements The user-provided buffer length. * @param wait_time The waiting time for the operation, in seconds, to search for streams. * The recommended wait time is 1 second (or 2 for a busy and large recording operation). * @warning If this is too short (<0.5s) only a subset (or none) of the outlets that are present on * the network may be returned. * @return The number of results written into the buffer (never more than the provided # of slots) * or a negative number if an error has occurred (values corresponding to lsl_error_code_t). */ extern LIBLSL_C_API int32_t lsl_resolve_all(lsl_streaminfo *buffer, uint32_t buffer_elements, double wait_time); /** * Resolve all streams with a given value for a property. * * If the goal is to resolve a specific stream, this method is preferred over resolving all streams * and then selecting the desired one. * @param[out] buffer A user-allocated buffer to hold the resolve results. * @attention It is the user's responsibility to either destroy the resulting streaminfo objects or * to pass them back to the LSL during during creation of an inlet. * * @attention The stream_info's returned by the resolver are only short versions that do not include * the lsl_get_desc() field (which can be arbitrarily big). To obtain the full stream information * you need to call lsl_get_info() on the inlet after you have created one. * @param buffer_elements The user-provided buffer length. * @param prop The streaminfo property that should have a specific value (`"name"`, `"type"`, * `"source_id"`, or, e.g., `"desc/manufaturer"` if present). * @param value The string value that the property should have (e.g., "EEG" as the type). * @param minimum Return at least this number of streams. * @param timeout Optionally a timeout of the operation, in seconds (default: no timeout). * If the timeout expires, less than the desired number of streams (possibly none) will be returned. * @return The number of results written into the buffer (never more than the provided # of slots) * or a negative number if an error has occurred (values corresponding to #lsl_error_code_t). */ extern LIBLSL_C_API int32_t lsl_resolve_byprop(lsl_streaminfo *buffer, uint32_t buffer_elements, const char *prop, const char *value, int32_t minimum, double timeout); /** * Resolve all streams that match a given predicate. * * Advanced query that allows to impose more conditions on the retrieved streams; * the given string is an [XPath 1.0 predicate](http://en.wikipedia.org/w/index.php?title=XPath_1.0) * for the `` node (omitting the surrounding []'s) * @param[out] buffer A user-allocated buffer to hold the resolve results. * @attention It is the user's responsibility to either destroy the resulting streaminfo objects or * to pass them back to the LSL during during creation of an inlet. * * @attention The stream_info's returned by the resolver are only short versions that do not include * the lsl_get_desc() field (which can be arbitrarily big). To obtain the full stream information * you need to call lsl_get_info() on the inlet after you have created one. * @param buffer_elements The user-provided buffer length. * @param pred The predicate string, e.g. * `name='BioSemi'` or `type='EEG' and starts-with(name,'BioSemi') and count(info/desc/channel)=32` * @param minimum Return at least this number of streams. * @param timeout Optionally a timeout of the operation, in seconds (default: no timeout). * If the timeout expires, less than the desired number of streams (possibly none) * will be returned. * @return The number of results written into the buffer (never more than the provided # of slots) * or a negative number if an error has occurred (values corresponding to lsl_error_code_t). */ extern LIBLSL_C_API int32_t lsl_resolve_bypred(lsl_streaminfo *buffer, uint32_t buffer_elements, const char *pred, int32_t minimum, double timeout); /// @}