pipewire/
keys.rs

1// Copyright The pipewire-rs Contributors.
2// SPDX-License-Identifier: MIT
3
4//! A collection of keys that are used to add extra information on objects.
5//!
6//! ```
7//! use pipewire::properties::properties;
8//!
9//! let props = properties! {
10//!   *pipewire::keys::REMOTE_NAME => "pipewire-0"
11//! };
12//! ```
13
14use std::ffi::CStr;
15use std::sync::LazyLock;
16
17// unfortunately we have to take two args as concat_idents! is in experimental
18macro_rules! key_constant {
19    ($name:ident, $pw_symbol:ident, #[doc = $doc:expr]) => {
20        #[doc = $doc]
21        pub static $name: LazyLock<&'static str> = LazyLock::new(|| unsafe {
22            CStr::from_bytes_with_nul_unchecked($crate::sys::$pw_symbol)
23                .to_str()
24                .unwrap()
25        });
26    };
27}
28
29key_constant!(PROTOCOL, PW_KEY_PROTOCOL,
30    /// protocol used for connection
31);
32key_constant!(ACCESS, PW_KEY_ACCESS,
33    /// how the client access is controlled
34);
35key_constant!(CLIENT_ACCESS, PW_KEY_CLIENT_ACCESS,
36    /// how the client wants to be access controlled Must be obtained from trusted sources by the protocol and placed as read-only properties.
37);
38key_constant!(SEC_PID, PW_KEY_SEC_PID,
39    /// Client pid, set by protocol
40);
41key_constant!(SEC_UID, PW_KEY_SEC_UID,
42    /// Client uid, set by protocol
43);
44key_constant!(SEC_GID, PW_KEY_SEC_GID,
45    /// client gid, set by protocol
46);
47key_constant!(SEC_LABEL, PW_KEY_SEC_LABEL,
48    /// client security label, set by protocol
49);
50key_constant!(LIBRARY_NAME_SYSTEM, PW_KEY_LIBRARY_NAME_SYSTEM,
51    /// name of the system library to use
52);
53key_constant!(LIBRARY_NAME_LOOP, PW_KEY_LIBRARY_NAME_LOOP,
54    /// name of the loop library to use
55);
56key_constant!(LIBRARY_NAME_DBUS, PW_KEY_LIBRARY_NAME_DBUS,
57    /// name of the dbus library to use
58);
59key_constant!(OBJECT_PATH, PW_KEY_OBJECT_PATH,
60    /// unique path to construct the object
61);
62key_constant!(OBJECT_ID, PW_KEY_OBJECT_ID,
63    /// a global object id
64);
65#[cfg(feature = "v0_3_41")]
66key_constant!(OBJECT_SERIAL, PW_KEY_OBJECT_SERIAL,
67    /// 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.
68);
69key_constant!(OBJECT_LINGER, PW_KEY_OBJECT_LINGER,
70    /// the object lives on even after the client that created it has been destroyed
71);
72#[cfg(feature = "v0_3_32")]
73key_constant!(OBJECT_REGISTER, PW_KEY_OBJECT_REGISTER,
74    /// If the object should be registered.
75);
76key_constant!(CONFIG_PREFIX, PW_KEY_CONFIG_PREFIX,
77    /// a config prefix directory
78);
79key_constant!(CONFIG_NAME, PW_KEY_CONFIG_NAME,
80    /// a config file name
81);
82#[cfg(feature = "v0_3_57")]
83key_constant!(CONFIG_OVERRIDE_PREFIX, PW_KEY_CONFIG_OVERRIDE_PREFIX,
84    /// a config override prefix directory
85);
86#[cfg(feature = "v0_3_57")]
87key_constant!(CONFIG_OVERRIDE_NAME, PW_KEY_CONFIG_OVERRIDE_NAME,
88    /// a config override file name
89);
90key_constant!(CONTEXT_PROFILE_MODULES, PW_KEY_CONTEXT_PROFILE_MODULES,
91    /// a context profile for modules, deprecated
92);
93key_constant!(USER_NAME, PW_KEY_USER_NAME,
94    /// The user name that runs pipewire
95);
96key_constant!(HOST_NAME, PW_KEY_HOST_NAME,
97    /// The host name of the machine
98);
99key_constant!(CORE_NAME, PW_KEY_CORE_NAME,
100    /// The name of the core. Default is `pipewire-<username>-<pid>`, overwritten by env(PIPEWIRE_CORE)
101);
102key_constant!(CORE_VERSION, PW_KEY_CORE_VERSION,
103    /// The version of the core.
104);
105key_constant!(CORE_DAEMON, PW_KEY_CORE_DAEMON,
106    /// If the core is listening for connections.
107);
108key_constant!(CORE_ID, PW_KEY_CORE_ID,
109    /// the core id
110);
111key_constant!(CORE_MONITORS, PW_KEY_CORE_MONITORS,
112    /// the apis monitored by core.
113);
114key_constant!(CPU_MAX_ALIGN, PW_KEY_CPU_MAX_ALIGN,
115    /// maximum alignment needed to support all CPU optimizations
116);
117key_constant!(CPU_CORES, PW_KEY_CPU_CORES,
118    /// number of cores
119);
120key_constant!(PRIORITY_SESSION, PW_KEY_PRIORITY_SESSION,
121    /// priority in session manager
122);
123key_constant!(PRIORITY_DRIVER, PW_KEY_PRIORITY_DRIVER,
124    /// priority to be a driver
125);
126key_constant!(REMOTE_NAME, PW_KEY_REMOTE_NAME,
127    /// The name of the remote to connect to, default pipewire-0, overwritten by env(PIPEWIRE_REMOTE)
128);
129key_constant!(REMOTE_INTENTION, PW_KEY_REMOTE_INTENTION,
130    /// The intention of the remote connection, "generic", "screencast"
131);
132key_constant!(APP_NAME, PW_KEY_APP_NAME,
133    /// application name. Ex: "Totem Music Player"
134);
135key_constant!(APP_ID, PW_KEY_APP_ID,
136    /// a textual id for identifying an application logically. Ex: "org.gnome.Totem"
137);
138key_constant!(APP_VERSION, PW_KEY_APP_VERSION,
139    /// application version. Ex: "1.2.0"
140);
141key_constant!(APP_ICON, PW_KEY_APP_ICON,
142    /// aa base64 blob with PNG image data
143);
144key_constant!(APP_ICON_NAME, PW_KEY_APP_ICON_NAME,
145    /// an XDG icon name for the application. Ex: "totem"
146);
147key_constant!(APP_LANGUAGE, PW_KEY_APP_LANGUAGE,
148    /// application language if applicable, in standard POSIX format. Ex: "en_GB"
149);
150key_constant!(APP_PROCESS_ID, PW_KEY_APP_PROCESS_ID,
151    /// process id  (pid)
152);
153key_constant!(APP_PROCESS_BINARY, PW_KEY_APP_PROCESS_BINARY,
154    /// binary name
155);
156key_constant!(APP_PROCESS_USER, PW_KEY_APP_PROCESS_USER,
157    /// user name
158);
159key_constant!(APP_PROCESS_HOST, PW_KEY_APP_PROCESS_HOST,
160    /// host name
161);
162key_constant!(APP_PROCESS_MACHINE_ID, PW_KEY_APP_PROCESS_MACHINE_ID,
163    /// the D-Bus host id the application runs on
164);
165key_constant!(APP_PROCESS_SESSION_ID, PW_KEY_APP_PROCESS_SESSION_ID,
166    /// login session of the application, on Unix the value of $XDG_SESSION_ID.
167);
168key_constant!(WINDOW_X11_DISPLAY, PW_KEY_WINDOW_X11_DISPLAY,
169    /// the X11 display string. Ex. ":0.0"
170);
171key_constant!(CLIENT_ID, PW_KEY_CLIENT_ID,
172    /// a client id
173);
174key_constant!(CLIENT_NAME, PW_KEY_CLIENT_NAME,
175    /// the client name
176);
177key_constant!(CLIENT_API, PW_KEY_CLIENT_API,
178    /// the client api used to access PipeWire
179);
180key_constant!(NODE_ID, PW_KEY_NODE_ID,
181    /// node id
182);
183key_constant!(NODE_NAME, PW_KEY_NODE_NAME,
184    /// node name
185);
186key_constant!(NODE_NICK, PW_KEY_NODE_NICK,
187    /// short node name
188);
189key_constant!(NODE_DESCRIPTION, PW_KEY_NODE_DESCRIPTION,
190    /// localized human readable node one-line description. Ex. "Foobar USB Headset"
191);
192key_constant!(NODE_PLUGGED, PW_KEY_NODE_PLUGGED,
193    /// when the node was created. As a uint64 in nanoseconds.
194);
195key_constant!(NODE_SESSION, PW_KEY_NODE_SESSION,
196    /// the session id this node is part of
197);
198key_constant!(NODE_GROUP, PW_KEY_NODE_GROUP,
199    /// the group id this node is part of. Nodes in the same group are always scheduled with the same driver.
200);
201key_constant!(NODE_EXCLUSIVE, PW_KEY_NODE_EXCLUSIVE,
202    /// node wants exclusive access to resources
203);
204key_constant!(NODE_AUTOCONNECT, PW_KEY_NODE_AUTOCONNECT,
205    /// node wants to be automatically connected to a compatible node
206);
207key_constant!(NODE_LATENCY, PW_KEY_NODE_LATENCY,
208    /// the requested latency of the node as a fraction. Ex: 128/48000
209);
210key_constant!(NODE_MAX_LATENCY, PW_KEY_NODE_MAX_LATENCY,
211    /// the maximum supported latency of the node as a fraction. Ex: 1024/48000
212);
213#[cfg(feature = "v0_3_33")]
214key_constant!(NODE_LOCK_QUANTUM, PW_KEY_NODE_LOCK_QUANTUM,
215    /// don't change quantum when this node is active
216);
217#[cfg(feature = "v0_3_45")]
218key_constant!(NODE_FORCE_QUANTUM, PW_KEY_NODE_FORCE_QUANTUM,
219    /// force a quantum while the node is active
220);
221#[cfg(feature = "v0_3_33")]
222key_constant!(NODE_RATE, PW_KEY_NODE_RATE,
223    /// the requested rate of the graph as a fraction. Ex: 1/48000
224);
225#[cfg(feature = "v0_3_33")]
226key_constant!(NODE_LOCK_RATE, PW_KEY_NODE_LOCK_RATE,
227    /// don't change rate when this node is active
228);
229#[cfg(feature = "v0_3_45")]
230key_constant!(NODE_FORCE_RATE, PW_KEY_NODE_FORCE_RATE,
231    /// force a rate while the node is active
232);
233key_constant!(NODE_DONT_RECONNECT, PW_KEY_NODE_DONT_RECONNECT,
234    /// don't reconnect this node. The node is initially linked to target.object or the default node. If the target is removed, the node is destroyed
235);
236key_constant!(NODE_ALWAYS_PROCESS, PW_KEY_NODE_ALWAYS_PROCESS,
237    /// process even when unlinked
238);
239#[cfg(feature = "v0_3_33")]
240key_constant!(NODE_WANT_DRIVER, PW_KEY_NODE_WANT_DRIVER,
241    /// the node wants to be grouped with a driver node in order to schedule the graph.
242);
243key_constant!(NODE_PAUSE_ON_IDLE, PW_KEY_NODE_PAUSE_ON_IDLE,
244    /// pause the node when idle
245);
246#[cfg(feature = "v0_3_44")]
247key_constant!(NODE_SUSPEND_ON_IDLE, PW_KEY_NODE_SUSPEND_ON_IDLE,
248    /// suspend the node when idle
249);
250key_constant!(NODE_CACHE_PARAMS, PW_KEY_NODE_CACHE_PARAMS,
251    /// cache the node params
252);
253#[cfg(feature = "v0_3_44")]
254key_constant!(NODE_TRANSPORT_SYNC, PW_KEY_NODE_TRANSPORT_SYNC,
255    /// the node handles transport sync
256);
257key_constant!(NODE_DRIVER, PW_KEY_NODE_DRIVER,
258    /// node can drive the graph
259);
260key_constant!(NODE_STREAM, PW_KEY_NODE_STREAM,
261    /// node is a stream, the server side should add a converter
262);
263key_constant!(NODE_VIRTUAL, PW_KEY_NODE_VIRTUAL,
264    /// the node is some sort of virtual object
265);
266key_constant!(NODE_PASSIVE, PW_KEY_NODE_PASSIVE,
267    /// indicate that a node wants passive links on output/input/all ports when the value is "out"/"in"/"true" respectively
268);
269#[cfg(feature = "v0_3_32")]
270key_constant!(NODE_LINK_GROUP, PW_KEY_NODE_LINK_GROUP,
271    /// the node is internally linked to nodes with the same link-group
272);
273#[cfg(feature = "v0_3_39")]
274key_constant!(NODE_NETWORK, PW_KEY_NODE_NETWORK,
275    /// the node is on a network
276);
277#[cfg(feature = "v0_3_41")]
278key_constant!(NODE_TRIGGER, PW_KEY_NODE_TRIGGER,
279    /// the node is not scheduled automatically based on the dependencies in the graph but it will be triggered explicitly.
280);
281#[cfg(feature = "v0_3_64")]
282key_constant!(NODE_CHANNELNAMES, PW_KEY_NODE_CHANNELNAMES,
283    /// names of node's channels (unrelated to positions)
284);
285key_constant!(PORT_ID, PW_KEY_PORT_ID,
286    /// port id
287);
288key_constant!(PORT_NAME, PW_KEY_PORT_NAME,
289    /// port name
290);
291key_constant!(PORT_DIRECTION, PW_KEY_PORT_DIRECTION,
292    /// the port direction, one of "in" or "out" or "control" and "notify" for control ports
293);
294key_constant!(PORT_ALIAS, PW_KEY_PORT_ALIAS,
295    /// port alias
296);
297key_constant!(PORT_PHYSICAL, PW_KEY_PORT_PHYSICAL,
298    /// if this is a physical port
299);
300key_constant!(PORT_TERMINAL, PW_KEY_PORT_TERMINAL,
301    /// if this port consumes the data
302);
303key_constant!(PORT_CONTROL, PW_KEY_PORT_CONTROL,
304    /// if this port is a control port
305);
306key_constant!(PORT_MONITOR, PW_KEY_PORT_MONITOR,
307    /// if this port is a monitor port
308);
309key_constant!(PORT_CACHE_PARAMS, PW_KEY_PORT_CACHE_PARAMS,
310    /// cache the node port params
311);
312key_constant!(PORT_EXTRA, PW_KEY_PORT_EXTRA,
313    /// api specific extra port info, API name should be prefixed. "jack:flags:56"
314);
315key_constant!(LINK_ID, PW_KEY_LINK_ID,
316    /// a link id
317);
318key_constant!(LINK_INPUT_NODE, PW_KEY_LINK_INPUT_NODE,
319    /// input node id of a link
320);
321key_constant!(LINK_INPUT_PORT, PW_KEY_LINK_INPUT_PORT,
322    /// input port id of a link
323);
324key_constant!(LINK_OUTPUT_NODE, PW_KEY_LINK_OUTPUT_NODE,
325    /// output node id of a link
326);
327key_constant!(LINK_OUTPUT_PORT, PW_KEY_LINK_OUTPUT_PORT,
328    /// output port id of a link
329);
330key_constant!(LINK_PASSIVE, PW_KEY_LINK_PASSIVE,
331    /// indicate that a link is passive and does not cause the graph to be runnable.
332);
333key_constant!(LINK_FEEDBACK, PW_KEY_LINK_FEEDBACK,
334    /// indicate that a link is a feedback link and the target will receive data in the next cycle
335);
336key_constant!(DEVICE_ID, PW_KEY_DEVICE_ID,
337    /// device id
338);
339key_constant!(DEVICE_NAME, PW_KEY_DEVICE_NAME,
340    /// device name
341);
342key_constant!(DEVICE_PLUGGED, PW_KEY_DEVICE_PLUGGED,
343    /// when the device was created. As a uint64 in nanoseconds.
344);
345key_constant!(DEVICE_NICK, PW_KEY_DEVICE_NICK,
346    /// a short device nickname
347);
348key_constant!(DEVICE_STRING, PW_KEY_DEVICE_STRING,
349    /// device string in the underlying layer's format. Ex. "surround51:0"
350);
351key_constant!(DEVICE_API, PW_KEY_DEVICE_API,
352    /// API this device is accessed with. Ex. "alsa", "v4l2"
353);
354key_constant!(DEVICE_DESCRIPTION, PW_KEY_DEVICE_DESCRIPTION,
355    /// localized human readable device one-line description. Ex. "Foobar USB Headset"
356);
357key_constant!(DEVICE_BUS_PATH, PW_KEY_DEVICE_BUS_PATH,
358    /// bus path to the device in the OS' format. Ex. "pci-0000:00:14.0-usb-0:3.2:1.0"
359);
360key_constant!(DEVICE_SERIAL, PW_KEY_DEVICE_SERIAL,
361    /// Serial number if applicable
362);
363key_constant!(DEVICE_VENDOR_ID, PW_KEY_DEVICE_VENDOR_ID,
364    /// vendor ID if applicable
365);
366key_constant!(DEVICE_VENDOR_NAME, PW_KEY_DEVICE_VENDOR_NAME,
367    /// vendor name if applicable
368);
369key_constant!(DEVICE_PRODUCT_ID, PW_KEY_DEVICE_PRODUCT_ID,
370    /// product ID if applicable
371);
372key_constant!(DEVICE_PRODUCT_NAME, PW_KEY_DEVICE_PRODUCT_NAME,
373    /// product name if applicable
374);
375key_constant!(DEVICE_CLASS, PW_KEY_DEVICE_CLASS,
376    /// device class
377);
378key_constant!(DEVICE_FORM_FACTOR, PW_KEY_DEVICE_FORM_FACTOR,
379    /// form factor if applicable. One of "internal", "speaker", "handset", "tv", "webcam", "microphone", "headset", "headphone", "hands-free", "car", "hifi", "computer", "portable"
380);
381key_constant!(DEVICE_BUS, PW_KEY_DEVICE_BUS,
382    /// bus of the device if applicable. One of "isa", "pci", "usb", "firewire", "bluetooth"
383);
384key_constant!(DEVICE_SUBSYSTEM, PW_KEY_DEVICE_SUBSYSTEM,
385    /// device subsystem
386);
387#[cfg(feature = "v0_3_53")]
388key_constant!(DEVICE_SYSFS_PATH, PW_KEY_DEVICE_SYSFS_PATH,
389    /// device sysfs path
390);
391key_constant!(DEVICE_ICON, PW_KEY_DEVICE_ICON,
392    /// icon for the device. A base64 blob containing PNG image data
393);
394key_constant!(DEVICE_ICON_NAME, PW_KEY_DEVICE_ICON_NAME,
395    /// an XDG icon name for the device. Ex. "sound-card-speakers-usb"
396);
397key_constant!(DEVICE_INTENDED_ROLES, PW_KEY_DEVICE_INTENDED_ROLES,
398    /// 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.
399);
400key_constant!(DEVICE_CACHE_PARAMS, PW_KEY_DEVICE_CACHE_PARAMS,
401    /// cache the device spa params
402);
403key_constant!(MODULE_ID, PW_KEY_MODULE_ID,
404    /// the module id
405);
406key_constant!(MODULE_NAME, PW_KEY_MODULE_NAME,
407    /// the name of the module
408);
409key_constant!(MODULE_AUTHOR, PW_KEY_MODULE_AUTHOR,
410    /// the author's name
411);
412key_constant!(MODULE_DESCRIPTION, PW_KEY_MODULE_DESCRIPTION,
413    /// a human readable one-line description of the module's purpose.
414);
415key_constant!(MODULE_USAGE, PW_KEY_MODULE_USAGE,
416    /// a human readable usage description of the module's arguments.
417);
418key_constant!(MODULE_VERSION, PW_KEY_MODULE_VERSION,
419    /// a version string for the module.
420);
421key_constant!(FACTORY_ID, PW_KEY_FACTORY_ID,
422    /// the factory id
423);
424key_constant!(FACTORY_NAME, PW_KEY_FACTORY_NAME,
425    /// the name of the factory
426);
427key_constant!(FACTORY_USAGE, PW_KEY_FACTORY_USAGE,
428    /// the usage of the factory
429);
430key_constant!(FACTORY_TYPE_NAME, PW_KEY_FACTORY_TYPE_NAME,
431    /// the name of the type created by a factory
432);
433key_constant!(FACTORY_TYPE_VERSION, PW_KEY_FACTORY_TYPE_VERSION,
434    /// the version of the type created by a factory
435);
436key_constant!(STREAM_IS_LIVE, PW_KEY_STREAM_IS_LIVE,
437    /// Indicates that the stream is live.
438);
439key_constant!(STREAM_LATENCY_MIN, PW_KEY_STREAM_LATENCY_MIN,
440    /// The minimum latency of the stream.
441);
442key_constant!(STREAM_LATENCY_MAX, PW_KEY_STREAM_LATENCY_MAX,
443    /// The maximum latency of the stream
444);
445key_constant!(STREAM_MONITOR, PW_KEY_STREAM_MONITOR,
446    /// Indicates that the stream is monitoring and might select a less accurate but faster conversion algorithm.
447);
448key_constant!(STREAM_DONT_REMIX, PW_KEY_STREAM_DONT_REMIX,
449    /// don't remix channels
450);
451key_constant!(STREAM_CAPTURE_SINK, PW_KEY_STREAM_CAPTURE_SINK,
452    /// Try to capture the sink output instead of source output
453);
454key_constant!(MEDIA_TYPE, PW_KEY_MEDIA_TYPE,
455    /// Media type, one of Audio, Video, Midi
456);
457key_constant!(MEDIA_CATEGORY, PW_KEY_MEDIA_CATEGORY,
458    /// Media Category: Playback, Capture, Duplex, Monitor, Manager
459);
460key_constant!(MEDIA_ROLE, PW_KEY_MEDIA_ROLE,
461    /// Role: Movie, Music, Camera, Screen, Communication, Game, Notification, DSP, Production, Accessibility, Test
462);
463key_constant!(MEDIA_CLASS, PW_KEY_MEDIA_CLASS,
464    /// class Ex: "Video/Source"
465);
466key_constant!(MEDIA_NAME, PW_KEY_MEDIA_NAME,
467    /// media name. Ex: "Pink Floyd: Time"
468);
469key_constant!(MEDIA_TITLE, PW_KEY_MEDIA_TITLE,
470    /// title. Ex: "Time"
471);
472key_constant!(MEDIA_ARTIST, PW_KEY_MEDIA_ARTIST,
473    /// artist. Ex: "Pink Floyd"
474);
475key_constant!(MEDIA_COPYRIGHT, PW_KEY_MEDIA_COPYRIGHT,
476    /// copyright string
477);
478key_constant!(MEDIA_SOFTWARE, PW_KEY_MEDIA_SOFTWARE,
479    /// generator software
480);
481key_constant!(MEDIA_LANGUAGE, PW_KEY_MEDIA_LANGUAGE,
482    /// language in POSIX format. Ex: en_GB
483);
484key_constant!(MEDIA_FILENAME, PW_KEY_MEDIA_FILENAME,
485    /// filename
486);
487key_constant!(MEDIA_ICON, PW_KEY_MEDIA_ICON,
488    /// icon for the media, a base64 blob with PNG image data
489);
490key_constant!(MEDIA_ICON_NAME, PW_KEY_MEDIA_ICON_NAME,
491    /// an XDG icon name for the media. Ex: "audio-x-mp3"
492);
493key_constant!(MEDIA_COMMENT, PW_KEY_MEDIA_COMMENT,
494    /// extra comment
495);
496key_constant!(MEDIA_DATE, PW_KEY_MEDIA_DATE,
497    /// date of the media
498);
499key_constant!(MEDIA_FORMAT, PW_KEY_MEDIA_FORMAT,
500    /// format of the media
501);
502key_constant!(FORMAT_DSP, PW_KEY_FORMAT_DSP,
503    /// a dsp format. Ex: "32 bit float mono audio"
504);
505key_constant!(AUDIO_CHANNEL, PW_KEY_AUDIO_CHANNEL,
506    /// an audio channel. Ex: "FL"
507);
508#[cfg(feature = "v0_3_32")]
509key_constant!(AUDIO_RATE, PW_KEY_AUDIO_RATE,
510    /// an audio samplerate
511);
512key_constant!(AUDIO_CHANNELS, PW_KEY_AUDIO_CHANNELS,
513    /// number of audio channels
514);
515key_constant!(AUDIO_FORMAT, PW_KEY_AUDIO_FORMAT,
516    /// an audio format. Ex: "S16LE"
517);
518#[cfg(feature = "v0_3_43")]
519key_constant!(AUDIO_ALLOWED_RATES, PW_KEY_AUDIO_ALLOWED_RATES,
520    /// a list of allowed samplerates ex. "[ 44100 48000 ]"
521);
522key_constant!(VIDEO_RATE, PW_KEY_VIDEO_RATE,
523    /// a video framerate
524);
525key_constant!(VIDEO_FORMAT, PW_KEY_VIDEO_FORMAT,
526    /// a video format
527);
528key_constant!(VIDEO_SIZE, PW_KEY_VIDEO_SIZE,
529    /// a video size as "\<width\>x\<height\>"
530);
531#[cfg(feature = "v0_3_44")]
532key_constant!(TARGET_OBJECT, PW_KEY_TARGET_OBJECT,
533    /// a target object to link to. This can be and object name or object.serial PIPEWIRE_KEYS_H
534);
535
536#[cfg(test)]
537mod tests {
538    use super::*;
539
540    #[test]
541    fn keys() {
542        assert_eq!(*REMOTE_NAME, "remote.name");
543    }
544}