#pragma once
#include "common.h"
#include "types.h"
/// @file streaminfo.h Stream info functions
/** @defgroup streaminfo The lsl_streaminfo object
*
* The #lsl_streaminfo object keeps a stream's meta data and connection settings.
* @{
*/
/**
* Construct a new streaminfo object.
*
* Core stream information is specified here. Any remaining meta-data can be added later.
* @param name Name of the stream.
* Describes the device (or product series) that this stream makes available
* (for use by programs, experimenters or data analysts). Cannot be empty.
* @param type Content type of the stream. Please see https://github.com/sccn/xdf/wiki/Meta-Data (or
* web search for: XDF meta-data) for pre-defined content-type names, but you can also make up your
* own. The content type is the preferred way to find streams (as opposed to searching by name).
* @param channel_count Number of channels per sample.
* This stays constant for the lifetime of the stream.
* @param nominal_srate The sampling rate (in Hz) as advertised by the
* datasource, if regular (otherwise set to #LSL_IRREGULAR_RATE).
* @param channel_format Format/type of each channel.
* If your channels have different formats, consider supplying multiple streams
* or use the largest type that can hold them all (such as #cft_double64).
*
* A good default is #cft_float32.
* @param source_id Unique identifier of the source or device, if available (e.g. a serial number).
* Allows recipients to recover from failure even after the serving app or device crashes.
* May in some cases also be constructed from device settings.
* @return A newly created streaminfo handle or NULL in the event that an error occurred.
*/
extern LIBLSL_C_API lsl_streaminfo lsl_create_streaminfo(const char *name, const char *type, int32_t channel_count, double nominal_srate, lsl_channel_format_t channel_format, const char *source_id);
/// Destroy a previously created streaminfo object.
extern LIBLSL_C_API void lsl_destroy_streaminfo(lsl_streaminfo info);
/// Copy an existing streaminfo object (rarely used).
extern LIBLSL_C_API lsl_streaminfo lsl_copy_streaminfo(lsl_streaminfo info);
/**
* Name of the stream.
*
* This is a human-readable name.
* For streams offered by device modules, it refers to the type of device or product series that is
* generating the data of the stream. If the source is an application, the name may be a more
* generic or specific identifier. Multiple streams with the same name can coexist, though
* potentially at the cost of ambiguity (for the recording app or experimenter).
* @return An immutable library-owned pointer to the string value. @sa lsl_destroy_string()
*/
extern LIBLSL_C_API const char *lsl_get_name(lsl_streaminfo info);
/**
* Content type of the stream.
*
* The content type is a short string such as "EEG", "Gaze" which describes the content carried by
* the channel (if known). If a stream contains mixed content this value need not be assigned but
* may instead be stored in the description of channel types. To be useful to applications and
* automated processing systems using the recommended content types is preferred. Content types
* usually follow those pre-defined in the [wiki](https://github.com/sccn/xdf/wiki/Meta-Data) (or
* web search for: XDF meta-data).
* @return An immutable library-owned pointer to the string value. @sa lsl_destroy_string()
*/
extern LIBLSL_C_API const char *lsl_get_type(lsl_streaminfo info);
/**
* Number of channels of the stream.
* A stream has at least one channels; the channel count stays constant for all samples.
*/
extern LIBLSL_C_API int32_t lsl_get_channel_count(lsl_streaminfo info);
/**
* Sampling rate of the stream, according to the source (in Hz).
*
* If a stream is irregularly sampled, this should be set to #LSL_IRREGULAR_RATE.
*
* Note that no data will be lost even if this sampling rate is incorrect or if a device has
* temporary hiccups, since all samples will be recorded anyway (except for those dropped by the
* device itself). However, when the recording is imported into an application, a good importer may
* correct such errors more accurately if the advertised sampling rate was close to the specs of the
* device.
*/
extern LIBLSL_C_API double lsl_get_nominal_srate(lsl_streaminfo info);
/**
* Channel format of the stream.
* All channels in a stream have the same format.
* However, a device might offer multiple time-synched streams each with its own format.
*/
extern LIBLSL_C_API lsl_channel_format_t lsl_get_channel_format(lsl_streaminfo info);
/**
* Unique identifier of the stream's source, if available.
*
* The unique source (or device) identifier is an optional piece of information that, if available,
* allows that endpoints (such as the recording program) can re-acquire a stream automatically once
* it is back online.
* @return An immutable library-owned pointer to the string value. @sa lsl_destroy_string()
*/
extern LIBLSL_C_API const char *lsl_get_source_id(lsl_streaminfo info);
/**
* Protocol version used to deliver the stream.
*/
extern LIBLSL_C_API int32_t lsl_get_version(lsl_streaminfo info);
/**
* Creation time stamp of the stream.
*
* This is the time stamp when the stream was first created
* (as determined via local_clock() on the providing machine).
*/
extern LIBLSL_C_API double lsl_get_created_at(lsl_streaminfo info);
/**
* Unique ID of the stream outlet (once assigned).
*
* This is a unique identifier of the stream outlet, and is guaranteed to be different
* across multiple instantiations of the same outlet (e.g., after a re-start).
* @return An immutable library-owned pointer to the string value. @sa lsl_destroy_string()
*/
extern LIBLSL_C_API const char *lsl_get_uid(lsl_streaminfo info);
/**
* Session ID for the given stream.
*
* The session id is an optional human-assigned identifier of the recording session.
* While it is rarely used, it can be used to prevent concurrent recording activitites
* on the same sub-network (e.g., in multiple experiment areas) from seeing each other's streams
* (assigned via a configuration file by the experimenter, see Network Connectivity on the LSL
* wiki).
* @return An immutable library-owned pointer to the string value. @sa lsl_destroy_string()
*/
extern LIBLSL_C_API const char *lsl_get_session_id(lsl_streaminfo info);
/// Hostname of the providing machine (once bound to an outlet). Modification is not permitted.
extern LIBLSL_C_API const char *lsl_get_hostname(lsl_streaminfo info);
/**
* Extended description of the stream.
*
* It is highly recommended that at least the channel labels are described here.
* See code examples on the LSL wiki. Other information, such as amplifier settings,
* measurement units if deviating from defaults, setup information, subject information, etc.,
* can be specified here, as well. Meta-data recommendations follow the XDF file format project
* (github.com/sccn/xdf/wiki/Meta-Data or web search for: XDF meta-data).
*
* @attention if you use a stream content type for which meta-data recommendations exist, please
* try to lay out your meta-data in agreement with these recommendations for compatibility with other applications.
*/
extern LIBLSL_C_API lsl_xml_ptr lsl_get_desc(lsl_streaminfo info);
/**
* Retrieve the entire streaminfo in XML format.
*
* This yields an XML document (in string form) whose top-level element is ``. The info
* element contains one element for each field of the streaminfo class, including:
*
* - the core elements ``, ``, ``,
* ``, ``
* - the misc elements ``, ``, ``, ``,
* ``, ``, ``, ``, ``,
* ``
* - the extended description element `` with user-defined sub-elements.
* @return A pointer to a copy of the XML text or NULL in the event that an error occurred.
* @note It is the user's responsibility to deallocate this string when it is no longer needed.
*/
extern LIBLSL_C_API char *lsl_get_xml(lsl_streaminfo info);
/// Number of bytes occupied by a channel (0 for string-typed channels).
extern LIBLSL_C_API int32_t lsl_get_channel_bytes(lsl_streaminfo info);
/// Number of bytes occupied by a sample (0 for string-typed channels).
extern LIBLSL_C_API int32_t lsl_get_sample_bytes(lsl_streaminfo info);
/**
* Tries to match the stream info XML element @p info against an
* XPath query.
*
* Example query strings:
* @code
* channel_count>5 and type='EEG'
* type='TestStream' or contains(name,'Brain')
* name='ExampleStream'
* @endcode
*/
extern LIBLSL_C_API int32_t lsl_stream_info_matches_query(lsl_streaminfo info, const char *query);
/// Create a streaminfo object from an XML representation
extern LIBLSL_C_API lsl_streaminfo lsl_streaminfo_from_xml(const char *xml);
/// @}