1 /* PipeWire 2 * 3 * Copyright © 2018 Wim Taymans 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the "Software"), 7 * to deal in the Software without restriction, including without limitation 8 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9 * and/or sell copies of the Software, and to permit persons to whom the 10 * Software is furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice (including the next 13 * paragraph) shall be included in all copies or substantial portions of the 14 * Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22 * DEALINGS IN THE SOFTWARE. 23 */ 24 25 #ifndef PIPEWIRE_DEVICE_H 26 #define PIPEWIRE_DEVICE_H 27 28 #ifdef __cplusplus 29 extern "C" { 30 #endif 31 32 #include <spa/utils/defs.h> 33 #include <spa/utils/hook.h> 34 35 #include <pipewire/proxy.h> 36 37 /** \defgroup pw_device Device 38 * Device interface 39 */ 40 41 /** 42 * \addtogroup pw_device 43 * \{ 44 */ 45 46 #define PW_TYPE_INTERFACE_Device PW_TYPE_INFO_INTERFACE_BASE "Device" 47 48 #define PW_VERSION_DEVICE 3 49 struct pw_device; 50 51 /** The device information. Extra information can be added in later versions */ 52 struct pw_device_info { 53 uint32_t id; /**< id of the global */ 54 #define PW_DEVICE_CHANGE_MASK_PROPS (1 << 0) 55 #define PW_DEVICE_CHANGE_MASK_PARAMS (1 << 1) 56 #define PW_DEVICE_CHANGE_MASK_ALL ((1 << 2)-1) 57 uint64_t change_mask; /**< bitfield of changed fields since last call */ 58 struct spa_dict *props; /**< extra properties */ 59 struct spa_param_info *params; /**< parameters */ 60 uint32_t n_params; /**< number of items in \a params */ 61 }; 62 63 /** Update and existing \ref pw_device_info with \a update and reset */ 64 struct pw_device_info * 65 pw_device_info_update(struct pw_device_info *info, 66 const struct pw_device_info *update); 67 /** Merge and existing \ref pw_device_info with \a update */ 68 struct pw_device_info * 69 pw_device_info_merge(struct pw_device_info *info, 70 const struct pw_device_info *update, bool reset); 71 /** Free a \ref pw_device_info */ 72 void pw_device_info_free(struct pw_device_info *info); 73 74 #define PW_DEVICE_EVENT_INFO 0 75 #define PW_DEVICE_EVENT_PARAM 1 76 #define PW_DEVICE_EVENT_NUM 2 77 78 /** Device events */ 79 struct pw_device_events { 80 #define PW_VERSION_DEVICE_EVENTS 0 81 uint32_t version; 82 /** 83 * Notify device info 84 * 85 * \param info info about the device 86 */ 87 void (*info) (void *object, const struct pw_device_info *info); 88 /** 89 * Notify a device param 90 * 91 * Event emitted as a result of the enum_params method. 92 * 93 * \param seq the sequence number of the request 94 * \param id the param id 95 * \param index the param index 96 * \param next the param index of the next param 97 * \param param the parameter 98 */ 99 void (*param) (void *object, int seq, 100 uint32_t id, uint32_t index, uint32_t next, 101 const struct spa_pod *param); 102 }; 103 104 105 #define PW_DEVICE_METHOD_ADD_LISTENER 0 106 #define PW_DEVICE_METHOD_SUBSCRIBE_PARAMS 1 107 #define PW_DEVICE_METHOD_ENUM_PARAMS 2 108 #define PW_DEVICE_METHOD_SET_PARAM 3 109 #define PW_DEVICE_METHOD_NUM 4 110 111 /** Device methods */ 112 struct pw_device_methods { 113 #define PW_VERSION_DEVICE_METHODS 0 114 uint32_t version; 115 116 int (*add_listener) (void *object, 117 struct spa_hook *listener, 118 const struct pw_device_events *events, 119 void *data); 120 /** 121 * Subscribe to parameter changes 122 * 123 * Automatically emit param events for the given ids when 124 * they are changed. 125 * 126 * \param ids an array of param ids 127 * \param n_ids the number of ids in \a ids 128 */ 129 int (*subscribe_params) (void *object, uint32_t *ids, uint32_t n_ids); 130 131 /** 132 * Enumerate device parameters 133 * 134 * Start enumeration of device parameters. For each param, a 135 * param event will be emitted. 136 * 137 * \param seq a sequence number to place in the reply 138 * \param id the parameter id to enum or PW_ID_ANY for all 139 * \param start the start index or 0 for the first param 140 * \param num the maximum number of params to retrieve 141 * \param filter a param filter or NULL 142 */ 143 int (*enum_params) (void *object, int seq, uint32_t id, uint32_t start, uint32_t num, 144 const struct spa_pod *filter); 145 /** 146 * Set a parameter on the device 147 * 148 * \param id the parameter id to set 149 * \param flags extra parameter flags 150 * \param param the parameter to set 151 */ 152 int (*set_param) (void *object, uint32_t id, uint32_t flags, 153 const struct spa_pod *param); 154 }; 155 156 #define pw_device_method(o,method,version,...) \ 157 ({ \ 158 int _res = -ENOTSUP; \ 159 spa_interface_call_res((struct spa_interface*)o, \ 160 struct pw_device_methods, _res, \ 161 method, version, ##__VA_ARGS__); \ 162 _res; \ 163 }) 164 165 #define pw_device_add_listener(c,...) pw_device_method(c,add_listener,0,__VA_ARGS__) 166 #define pw_device_subscribe_params(c,...) pw_device_method(c,subscribe_params,0,__VA_ARGS__) 167 #define pw_device_enum_params(c,...) pw_device_method(c,enum_params,0,__VA_ARGS__) 168 #define pw_device_set_param(c,...) pw_device_method(c,set_param,0,__VA_ARGS__) 169 170 /** 171 * \} 172 */ 173 174 #ifdef __cplusplus 175 } /* extern "C" */ 176 #endif 177 178 #endif /* PIPEWIRE_DEVICE_H */ 179