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