/* PipeWire
 *
 * Copyright © 2019 Wim Taymans
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice (including the next
 * paragraph) shall be included in all copies or substantial portions of the
 * Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 */

#ifndef PIPEWIRE_KEYS_H
#define PIPEWIRE_KEYS_H

#ifdef __cplusplus
extern "C" {
#endif

/**
 * \defgroup pw_keys Key Names
 *
 * A collection of keys that are used to add extra information on objects.
 *
 * Keys that start with "pipewire." are in general set-once and then
 * read-only. They are usually used for security sensitive information that
 * needs to be fixed.
 *
 * Properties from other objects can also appear. This usually suggests some
 * sort of parent/child or owner/owned relationship.
 *
 * \addtogroup pw_keys
 * \{
 */
#define PW_KEY_PROTOCOL			"pipewire.protocol"	/**< protocol used for connection */
#define PW_KEY_ACCESS			"pipewire.access"	/**< how the client access is controlled */
#define PW_KEY_CLIENT_ACCESS		"pipewire.client.access"/**< how the client wants to be access
								  *  controlled */

/** Various keys related to the identity of a client process and its security.
 * Must be obtained from trusted sources by the protocol and placed as
 * read-only properties. */
#define PW_KEY_SEC_PID			"pipewire.sec.pid"	/**< Client pid, set by protocol */
#define PW_KEY_SEC_UID			"pipewire.sec.uid"	/**< Client uid, set by protocol*/
#define PW_KEY_SEC_GID			"pipewire.sec.gid"	/**< client gid, set by protocol*/
#define PW_KEY_SEC_LABEL		"pipewire.sec.label"	/**< client security label, set by protocol*/

#define PW_KEY_LIBRARY_NAME_SYSTEM	"library.name.system"	/**< name of the system library to use */
#define PW_KEY_LIBRARY_NAME_LOOP	"library.name.loop"	/**< name of the loop library to use */
#define PW_KEY_LIBRARY_NAME_DBUS	"library.name.dbus"	/**< name of the dbus library to use */

/** object properties */
#define PW_KEY_OBJECT_PATH		"object.path"		/**< unique path to construct the object */
#define PW_KEY_OBJECT_ID		"object.id"		/**< a global object id */
#define PW_KEY_OBJECT_SERIAL		"object.serial"		/**< a 64 bit object serial number. This is a number
								  *  incremented for each object that is created.
								  *  The lower 32 bits are guaranteed to never be
								  *  SPA_ID_INVALID. */
#define PW_KEY_OBJECT_LINGER		"object.linger"		/**< the object lives on even after the client
								  *  that created it has been destroyed */
#define PW_KEY_OBJECT_REGISTER		"object.register"	/**< If the object should be registered. */


/* config */
#define PW_KEY_CONFIG_PREFIX		"config.prefix"		/**< a config prefix directory */
#define PW_KEY_CONFIG_NAME		"config.name"		/**< a config file name */

/* context */
#define PW_KEY_CONTEXT_PROFILE_MODULES	"context.profile.modules"	/**< a context profile for modules, deprecated */
#define PW_KEY_USER_NAME		"context.user-name"	/**< The user name that runs pipewire */
#define PW_KEY_HOST_NAME		"context.host-name"	/**< The host name of the machine */

/* core */
#define PW_KEY_CORE_NAME		"core.name"		/**< The name of the core. Default is
								  *  `pipewire-<username>-<pid>`, overwritten
								  *  by env(PIPEWIRE_CORE) */
#define PW_KEY_CORE_VERSION		"core.version"		/**< The version of the core. */
#define PW_KEY_CORE_DAEMON		"core.daemon"		/**< If the core is listening for connections. */

#define PW_KEY_CORE_ID			"core.id"		/**< the core id */
#define PW_KEY_CORE_MONITORS		"core.monitors"		/**< the apis monitored by core. */

/* cpu */
#define PW_KEY_CPU_MAX_ALIGN		"cpu.max-align"		/**< maximum alignment needed to support
								  *  all CPU optimizations */
#define PW_KEY_CPU_CORES		"cpu.cores"		/**< number of cores */

/* priorities */
#define PW_KEY_PRIORITY_SESSION		"priority.session"	/**< priority in session manager */
#define PW_KEY_PRIORITY_DRIVER		"priority.driver"	/**< priority to be a driver */

/* remote keys */
#define PW_KEY_REMOTE_NAME		"remote.name"		/**< The name of the remote to connect to,
								  *  default pipewire-0, overwritten by
								  *  env(PIPEWIRE_REMOTE) */
#define PW_KEY_REMOTE_INTENTION		"remote.intention"	/**< The intention of the remote connection,
								  *  "generic", "screencast" */

/** application keys */
#define PW_KEY_APP_NAME			"application.name"	/**< application name. Ex: "Totem Music Player" */
#define PW_KEY_APP_ID			"application.id"	/**< a textual id for identifying an
								  *  application logically. Ex: "org.gnome.Totem" */
#define PW_KEY_APP_VERSION		"application.version"   /**< application version. Ex: "1.2.0" */
#define PW_KEY_APP_ICON			"application.icon"	/**< aa base64 blob with PNG image data */
#define PW_KEY_APP_ICON_NAME		"application.icon-name"	/**< an XDG icon name for the application.
								  *  Ex: "totem" */
#define PW_KEY_APP_LANGUAGE		"application.language"	/**< application language if applicable, in
								  *  standard POSIX format. Ex: "en_GB" */

#define PW_KEY_APP_PROCESS_ID		"application.process.id"	/**< process id  (pid)*/
#define PW_KEY_APP_PROCESS_BINARY	"application.process.binary"	/**< binary name */
#define PW_KEY_APP_PROCESS_USER		"application.process.user"	/**< user name */
#define PW_KEY_APP_PROCESS_HOST		"application.process.host"	/**< host name */
#define PW_KEY_APP_PROCESS_MACHINE_ID	"application.process.machine-id" /**< the D-Bus host id the
									   *  application runs on */
#define PW_KEY_APP_PROCESS_SESSION_ID	"application.process.session-id" /**< login session of the
									   *  application, on Unix the
									   *  value of $XDG_SESSION_ID. */
/** window system */
#define PW_KEY_WINDOW_X11_DISPLAY	"window.x11.display"	/**< the X11 display string. Ex. ":0.0" */

/** Client properties */
#define PW_KEY_CLIENT_ID		"client.id"		/**< a client id */
#define PW_KEY_CLIENT_NAME		"client.name"		/**< the client name */
#define PW_KEY_CLIENT_API		"client.api"		/**< the client api used to access
								  *  PipeWire */

/** Node keys */
#define PW_KEY_NODE_ID			"node.id"		/**< node id */
#define PW_KEY_NODE_NAME		"node.name"		/**< node name */
#define PW_KEY_NODE_NICK		"node.nick"		/**< short node name */
#define PW_KEY_NODE_DESCRIPTION		"node.description"	/**< localized human readable node one-line
								  *  description. Ex. "Foobar USB Headset" */
#define PW_KEY_NODE_PLUGGED		"node.plugged"		/**< when the node was created. As a uint64 in
								  *  nanoseconds. */

#define PW_KEY_NODE_SESSION		"node.session"		/**< the session id this node is part of */
#define PW_KEY_NODE_GROUP		"node.group"		/**< the group id this node is part of. Nodes
								  *  in the same group are always scheduled
								  *  with the same driver. */
#define PW_KEY_NODE_EXCLUSIVE		"node.exclusive"	/**< node wants exclusive access to resources */
#define PW_KEY_NODE_AUTOCONNECT		"node.autoconnect"	/**< node wants to be automatically connected
								  *  to a compatible node */
#define PW_KEY_NODE_TARGET		"node.target"		/**< node wants to be connected to the target
								  *  node/session */
#define PW_KEY_NODE_LATENCY		"node.latency"		/**< the requested latency of the node as
								  *  a fraction. Ex: 128/48000 */
#define PW_KEY_NODE_MAX_LATENCY		"node.max-latency"	/**< the maximum supported latency of the
								  *  node as a fraction. Ex: 1024/48000 */
#define PW_KEY_NODE_LOCK_QUANTUM	"node.lock-quantum"	/**< don't change quantum when this node
								  *  is active */
#define PW_KEY_NODE_FORCE_QUANTUM	"node.force-quantum"	/**< force a quantum while the node is
								  *  active */
#define PW_KEY_NODE_RATE		"node.rate"		/**< the requested rate of the graph as
								  *  a fraction. Ex: 1/48000 */
#define PW_KEY_NODE_LOCK_RATE		"node.lock-rate"	/**< don't change rate when this node
								  *  is active */
#define PW_KEY_NODE_FORCE_RATE		"node.force-rate"	/**< force a rate while the node is
								  *  active */

#define PW_KEY_NODE_DONT_RECONNECT	"node.dont-reconnect"	/**< don't reconnect this node */
#define PW_KEY_NODE_ALWAYS_PROCESS	"node.always-process"	/**< process even when unlinked */
#define PW_KEY_NODE_WANT_DRIVER		"node.want-driver"	/**< the node wants to be grouped with a driver
								  *  node in order to schedule the graph. */
#define PW_KEY_NODE_PAUSE_ON_IDLE	"node.pause-on-idle"	/**< pause the node when idle */
#define PW_KEY_NODE_SUSPEND_ON_IDLE	"node.suspend-on-idle"	/**< suspend the node when idle */
#define PW_KEY_NODE_CACHE_PARAMS	"node.cache-params"	/**< cache the node params */
#define PW_KEY_NODE_TRANSPORT_SYNC	"node.transport.sync"	/**< the node handles transport sync */
#define PW_KEY_NODE_DRIVER		"node.driver"		/**< node can drive the graph */
#define PW_KEY_NODE_STREAM		"node.stream"		/**< node is a stream, the server side should
								  *  add a converter */
#define PW_KEY_NODE_VIRTUAL		"node.virtual"		/**< the node is some sort of virtual
								  *  object */
#define PW_KEY_NODE_PASSIVE		"node.passive"		/**< indicate that a node wants passive links
								  *  on output/input/all ports when the value is
								  *  "out"/"in"/"true" respectively */
#define PW_KEY_NODE_LINK_GROUP		"node.link-group"	/**< the node is internally linked to
								  *  nodes with the same link-group */
#define PW_KEY_NODE_NETWORK		"node.network"		/**< the node is on a network */
#define PW_KEY_NODE_TRIGGER		"node.trigger"		/**< the node is not scheduled automatically
								  *   based on the dependencies in the graph
								  *   but it will be triggered explicitly. */

/** Port keys */
#define PW_KEY_PORT_ID			"port.id"		/**< port id */
#define PW_KEY_PORT_NAME		"port.name"		/**< port name */
#define PW_KEY_PORT_DIRECTION		"port.direction"	/**< the port direction, one of "in" or "out"
								  *  or "control" and "notify" for control ports */
#define PW_KEY_PORT_ALIAS		"port.alias"		/**< port alias */
#define PW_KEY_PORT_PHYSICAL		"port.physical"		/**< if this is a physical port */
#define PW_KEY_PORT_TERMINAL		"port.terminal"		/**< if this port consumes the data */
#define PW_KEY_PORT_CONTROL		"port.control"		/**< if this port is a control port */
#define PW_KEY_PORT_MONITOR		"port.monitor"		/**< if this port is a monitor port */
#define PW_KEY_PORT_CACHE_PARAMS	"port.cache-params"	/**< cache the node port params */
#define PW_KEY_PORT_EXTRA		"port.extra"		/**< api specific extra port info, API name
								  *  should be prefixed. "jack:flags:56" */

/** link properties */
#define PW_KEY_LINK_ID			"link.id"		/**< a link id */
#define PW_KEY_LINK_INPUT_NODE		"link.input.node"	/**< input node id of a link */
#define PW_KEY_LINK_INPUT_PORT		"link.input.port"	/**< input port id of a link */
#define PW_KEY_LINK_OUTPUT_NODE		"link.output.node"	/**< output node id of a link */
#define PW_KEY_LINK_OUTPUT_PORT		"link.output.port"	/**< output port id of a link */
#define PW_KEY_LINK_PASSIVE		"link.passive"		/**< indicate that a link is passive and
								  *  does not cause the graph to be
								  *  runnable. */
#define PW_KEY_LINK_FEEDBACK		"link.feedback"		/**< indicate that a link is a feedback
								  *  link and the target will receive data
								  *  in the next cycle */

/** device properties */
#define PW_KEY_DEVICE_ID		"device.id"		/**< device id */
#define PW_KEY_DEVICE_NAME		"device.name"		/**< device name */
#define PW_KEY_DEVICE_PLUGGED		"device.plugged"	/**< when the device was created. As a uint64 in
								  *  nanoseconds. */
#define PW_KEY_DEVICE_NICK		"device.nick"		/**< a short device nickname */
#define PW_KEY_DEVICE_STRING		"device.string"		/**< device string in the underlying layer's
								  *  format. Ex. "surround51:0" */
#define PW_KEY_DEVICE_API		"device.api"		/**< API this device is accessed with.
								  *  Ex. "alsa", "v4l2" */
#define PW_KEY_DEVICE_DESCRIPTION	"device.description"	/**< localized human readable device one-line
								  *  description. Ex. "Foobar USB Headset" */
#define PW_KEY_DEVICE_BUS_PATH		"device.bus-path"	/**< bus path to the device in the OS'
								  *  format. Ex. "pci-0000:00:14.0-usb-0:3.2:1.0" */
#define PW_KEY_DEVICE_SERIAL		"device.serial"		/**< Serial number if applicable */
#define PW_KEY_DEVICE_VENDOR_ID		"device.vendor.id"	/**< vendor ID if applicable */
#define PW_KEY_DEVICE_VENDOR_NAME	"device.vendor.name"	/**< vendor name if applicable */
#define PW_KEY_DEVICE_PRODUCT_ID	"device.product.id"	/**< product ID if applicable */
#define PW_KEY_DEVICE_PRODUCT_NAME	"device.product.name"	/**< product name if applicable */
#define PW_KEY_DEVICE_CLASS		"device.class"		/**< device class */
#define PW_KEY_DEVICE_FORM_FACTOR	"device.form-factor"	/**< form factor if applicable. One of
								  *  "internal", "speaker", "handset", "tv",
								  *  "webcam", "microphone", "headset",
								  *  "headphone", "hands-free", "car", "hifi",
								  *  "computer", "portable" */
#define PW_KEY_DEVICE_BUS		"device.bus"		/**< bus of the device if applicable. One of
								  *  "isa", "pci", "usb", "firewire",
								  *  "bluetooth" */
#define PW_KEY_DEVICE_SUBSYSTEM		"device.subsystem"	/**< device subsystem */
#define PW_KEY_DEVICE_ICON		"device.icon"		/**< icon for the device. A base64 blob
								  *  containing PNG image data */
#define PW_KEY_DEVICE_ICON_NAME		"device.icon-name"	/**< an XDG icon name for the device.
								  *  Ex. "sound-card-speakers-usb" */
#define PW_KEY_DEVICE_INTENDED_ROLES	"device.intended-roles"	/**< intended use. A space separated list of
								  *  roles (see PW_KEY_MEDIA_ROLE) this device
								  *  is particularly well suited for, due to
								  *  latency, quality or form factor. */
#define PW_KEY_DEVICE_CACHE_PARAMS	"device.cache-params"	/**< cache the device spa params */

/** module properties */
#define PW_KEY_MODULE_ID		"module.id"		/**< the module id */
#define PW_KEY_MODULE_NAME		"module.name"		/**< the name of the module */
#define PW_KEY_MODULE_AUTHOR		"module.author"		/**< the author's name */
#define PW_KEY_MODULE_DESCRIPTION	"module.description"	/**< a human readable one-line description
								  *  of the module's purpose.*/
#define PW_KEY_MODULE_USAGE		"module.usage"		/**< a human readable usage description of
								  *  the module's arguments. */
#define PW_KEY_MODULE_VERSION		"module.version"	/**< a version string for the module. */

/** Factory properties */
#define PW_KEY_FACTORY_ID		"factory.id"		/**< the factory id */
#define PW_KEY_FACTORY_NAME		"factory.name"		/**< the name of the factory */
#define PW_KEY_FACTORY_USAGE		"factory.usage"		/**< the usage of the factory */
#define PW_KEY_FACTORY_TYPE_NAME	"factory.type.name"	/**< the name of the type created by a factory */
#define PW_KEY_FACTORY_TYPE_VERSION	"factory.type.version"	/**< the version of the type created by a factory */

/** Stream properties */
#define PW_KEY_STREAM_IS_LIVE		"stream.is-live"	/**< Indicates that the stream is live. */
#define PW_KEY_STREAM_LATENCY_MIN	"stream.latency.min"	/**< The minimum latency of the stream. */
#define PW_KEY_STREAM_LATENCY_MAX	"stream.latency.max"	/**< The maximum latency of the stream */
#define PW_KEY_STREAM_MONITOR		"stream.monitor"	/**< Indicates that the stream is monitoring
								  *  and might select a less accurate but faster
								  *  conversion algorithm. */
#define PW_KEY_STREAM_DONT_REMIX	"stream.dont-remix"	/**< don't remix channels */
#define PW_KEY_STREAM_CAPTURE_SINK	"stream.capture.sink"	/**< Try to capture the sink output instead of
								  *  source output */

/** Media */
#define PW_KEY_MEDIA_TYPE		"media.type"		/**< Media type, one of
								  *  Audio, Video, Midi */
#define PW_KEY_MEDIA_CATEGORY		"media.category"	/**< Media Category:
								  *  Playback, Capture, Duplex, Monitor, Manager */
#define PW_KEY_MEDIA_ROLE		"media.role"		/**< Role: Movie, Music, Camera,
								  *  Screen, Communication, Game,
								  *  Notification, DSP, Production,
								  *  Accessibility, Test */
#define PW_KEY_MEDIA_CLASS		"media.class"		/**< class Ex: "Video/Source" */
#define PW_KEY_MEDIA_NAME		"media.name"		/**< media name. Ex: "Pink Floyd: Time" */
#define PW_KEY_MEDIA_TITLE		"media.title"		/**< title. Ex: "Time" */
#define PW_KEY_MEDIA_ARTIST		"media.artist"		/**< artist. Ex: "Pink Floyd" */
#define PW_KEY_MEDIA_COPYRIGHT		"media.copyright"	/**< copyright string */
#define PW_KEY_MEDIA_SOFTWARE		"media.software"	/**< generator software */
#define PW_KEY_MEDIA_LANGUAGE		"media.language"	/**< language in POSIX format. Ex: en_GB */
#define PW_KEY_MEDIA_FILENAME		"media.filename"	/**< filename */
#define PW_KEY_MEDIA_ICON		"media.icon"		/**< icon for the media, a base64 blob with
								  *  PNG image data */
#define PW_KEY_MEDIA_ICON_NAME		"media.icon-name"	/**< an XDG icon name for the media.
								  *  Ex: "audio-x-mp3" */
#define PW_KEY_MEDIA_COMMENT		"media.comment"		/**< extra comment */
#define PW_KEY_MEDIA_DATE		"media.date"		/**< date of the media */
#define PW_KEY_MEDIA_FORMAT		"media.format"		/**< format of the media */

/** format related properties */
#define PW_KEY_FORMAT_DSP		"format.dsp"		/**< a dsp format.
								  *  Ex: "32 bit float mono audio" */
/** audio related properties */
#define PW_KEY_AUDIO_CHANNEL		"audio.channel"		/**< an audio channel. Ex: "FL" */
#define PW_KEY_AUDIO_RATE		"audio.rate"		/**< an audio samplerate */
#define PW_KEY_AUDIO_CHANNELS		"audio.channels"	/**< number of audio channels */
#define PW_KEY_AUDIO_FORMAT		"audio.format"		/**< an audio format. Ex: "S16LE" */
#define PW_KEY_AUDIO_ALLOWED_RATES	"audio.allowed-rates"	/**< a list of allowed samplerates
								  *  ex. "[ 44100 48000 ]" */

/** video related properties */
#define PW_KEY_VIDEO_RATE		"video.framerate"	/**< a video framerate */
#define PW_KEY_VIDEO_FORMAT		"video.format"		/**< a video format */
#define PW_KEY_VIDEO_SIZE		"video.size"		/**< a video size as "<width>x<height" */

#ifdef PW_ENABLE_DEPRECATED
#define PW_KEY_PRIORITY_MASTER		"priority.master"	/**< deprecated */
#endif /* PW_ENABLE_DEPRECATED */

#define PW_KEY_TARGET_OBJECT		"target.object"		/**< a target object to link to */

/** \}
 */

#ifdef __cplusplus
}
#endif

#endif /* PIPEWIRE_KEYS_H */
