1 | #ifndef foocontexthfoo |
2 | #define foocontexthfoo |
3 | |
4 | /*** |
5 | This file is part of PulseAudio. |
6 | |
7 | Copyright 2004-2006 Lennart Poettering |
8 | Copyright 2006 Pierre Ossman <ossman@cendio.se> for Cendio AB |
9 | |
10 | PulseAudio is free software; you can redistribute it and/or modify |
11 | it under the terms of the GNU Lesser General Public License as published |
12 | by the Free Software Foundation; either version 2.1 of the License, |
13 | or (at your option) any later version. |
14 | |
15 | PulseAudio is distributed in the hope that it will be useful, but |
16 | WITHOUT ANY WARRANTY; without even the implied warranty of |
17 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
18 | General Public License for more details. |
19 | |
20 | You should have received a copy of the GNU Lesser General Public License |
21 | along with PulseAudio; if not, see <http://www.gnu.org/licenses/>. |
22 | ***/ |
23 | |
24 | #include <pulse/sample.h> |
25 | #include <pulse/def.h> |
26 | #include <pulse/mainloop-api.h> |
27 | #include <pulse/cdecl.h> |
28 | #include <pulse/operation.h> |
29 | #include <pulse/proplist.h> |
30 | #include <pulse/version.h> |
31 | |
32 | /** \page async Asynchronous API |
33 | * |
34 | * \section overv_sec Overview |
35 | * |
36 | * The asynchronous API is the native interface to the PulseAudio library. |
37 | * It allows full access to all available functionality. This however means that |
38 | * it is rather complex and can take some time to fully master. |
39 | * |
40 | * \section mainloop_sec Main Loop Abstraction |
41 | * |
42 | * The API is based around an asynchronous event loop, or main loop, |
43 | * abstraction. This abstraction contains three basic elements: |
44 | * |
45 | * \li Deferred events - Events that will trigger as soon as possible. Note |
46 | * that some implementations may block all other events |
47 | * when a deferred event is active. |
48 | * \li I/O events - Events that trigger on file descriptor activities. |
49 | * \li Timer events - Events that trigger after a fixed amount of time. |
50 | * |
51 | * The abstraction is represented as a number of function pointers in the |
52 | * pa_mainloop_api structure. |
53 | * |
54 | * To actually be able to use these functions, an implementation needs to |
55 | * be coupled to the abstraction. There are three of these shipped with |
56 | * PulseAudio, but any other can be used with a minimal amount of work, |
57 | * provided it supports the three basic events listed above. |
58 | * |
59 | * The implementations shipped with PulseAudio are: |
60 | * |
61 | * \li \subpage mainloop - A minimal but fast implementation based on poll(). |
62 | * \li \subpage threaded_mainloop - A special version of the previous |
63 | * implementation where all of PulseAudio's |
64 | * internal handling runs in a separate |
65 | * thread. |
66 | * \li \subpage glib-mainloop - A wrapper around GLib's main loop. |
67 | * |
68 | * UNIX signals may be hooked to a main loop using the functions from |
69 | * \ref mainloop-signal.h. These rely only on the main loop abstraction |
70 | * and can therefore be used with any of the implementations. |
71 | * |
72 | * \section refcnt_sec Reference Counting |
73 | * |
74 | * Almost all objects in PulseAudio are reference counted. What that means |
75 | * is that you rarely malloc() or free() any objects. Instead you increase |
76 | * and decrease their reference counts. Whenever an object's reference |
77 | * count reaches zero, that object gets destroy and any resources it uses |
78 | * get freed. |
79 | * |
80 | * The benefit of this design is that an application need not worry about |
81 | * whether or not it needs to keep an object around in case the library is |
82 | * using it internally. If it is, then it has made sure it has its own |
83 | * reference to it. |
84 | * |
85 | * Whenever the library creates an object, it will have an initial |
86 | * reference count of one. Most of the time, this single reference will be |
87 | * sufficient for the application, so all required reference count |
88 | * interaction will be a single call to the object's unref function. |
89 | * |
90 | * \section context_sec Context |
91 | * |
92 | * A context is the basic object for a connection to a PulseAudio server. |
93 | * It multiplexes commands, data streams and events through a single |
94 | * channel. |
95 | * |
96 | * There is no need for more than one context per application, unless |
97 | * connections to multiple servers are needed. |
98 | * |
99 | * \subsection ops_subsec Operations |
100 | * |
101 | * All operations on the context are performed asynchronously. I.e. the |
102 | * client will not wait for the server to complete the request. To keep |
103 | * track of all these in-flight operations, the application is given a |
104 | * pa_operation object for each asynchronous operation. |
105 | * |
106 | * There are only two actions (besides reference counting) that can be |
107 | * performed on a pa_operation: querying its state with |
108 | * pa_operation_get_state() and aborting it with pa_operation_cancel(). |
109 | * |
110 | * A pa_operation object is reference counted, so an application must |
111 | * make sure to unreference it, even if it has no intention of using it. |
112 | * |
113 | * \subsection conn_subsec Connecting |
114 | * |
115 | * A context must be connected to a server before any operation can be |
116 | * issued. Calling pa_context_connect() will initiate the connection |
117 | * procedure. Unlike most asynchronous operations, connecting does not |
118 | * result in a pa_operation object. Instead, the application should |
119 | * register a callback using pa_context_set_state_callback(). |
120 | * |
121 | * \subsection disc_subsec Disconnecting |
122 | * |
123 | * When the sound support is no longer needed, the connection needs to be |
124 | * closed using pa_context_disconnect(). This is an immediate function that |
125 | * works synchronously. |
126 | * |
127 | * Since the context object has references to other objects it must be |
128 | * disconnected after use or there is a high risk of memory leaks. If the |
129 | * connection has terminated by itself, then there is no need to explicitly |
130 | * disconnect the context using pa_context_disconnect(). |
131 | * |
132 | * \section Functions |
133 | * |
134 | * The sound server's functionality can be divided into a number of |
135 | * subsections: |
136 | * |
137 | * \li \subpage streams |
138 | * \li \subpage scache |
139 | * \li \subpage introspect |
140 | * \li \subpage subscribe |
141 | */ |
142 | |
143 | /** \file |
144 | * Connection contexts for asynchronous communication with a |
145 | * server. A pa_context object wraps a connection to a PulseAudio |
146 | * server using its native protocol. |
147 | * |
148 | * See also \subpage async |
149 | */ |
150 | |
151 | PA_C_DECL_BEGIN |
152 | |
153 | /** An opaque connection context to a daemon */ |
154 | typedef struct pa_context pa_context; |
155 | |
156 | /** Generic notification callback prototype */ |
157 | typedef void (*pa_context_notify_cb_t)(pa_context *c, void *userdata); |
158 | |
159 | /** A generic callback for operation completion */ |
160 | typedef void (*pa_context_success_cb_t) (pa_context *c, int success, void *userdata); |
161 | |
162 | /** A callback for asynchronous meta/policy event messages. The set |
163 | * of defined events can be extended at any time. Also, server modules |
164 | * may introduce additional message types so make sure that your |
165 | * callback function ignores messages it doesn't know. \since |
166 | * 0.9.15 */ |
167 | typedef void (*pa_context_event_cb_t)(pa_context *c, const char *name, pa_proplist *p, void *userdata); |
168 | |
169 | /** Instantiate a new connection context with an abstract mainloop API |
170 | * and an application name. It is recommended to use pa_context_new_with_proplist() |
171 | * instead and specify some initial properties.*/ |
172 | pa_context *pa_context_new(pa_mainloop_api *mainloop, const char *name); |
173 | |
174 | /** Instantiate a new connection context with an abstract mainloop API |
175 | * and an application name, and specify the initial client property |
176 | * list. \since 0.9.11 */ |
177 | pa_context *pa_context_new_with_proplist(pa_mainloop_api *mainloop, const char *name, const pa_proplist *proplist); |
178 | |
179 | /** Decrease the reference counter of the context by one */ |
180 | void pa_context_unref(pa_context *c); |
181 | |
182 | /** Increase the reference counter of the context by one */ |
183 | pa_context* pa_context_ref(pa_context *c); |
184 | |
185 | /** Set a callback function that is called whenever the context status changes */ |
186 | void pa_context_set_state_callback(pa_context *c, pa_context_notify_cb_t cb, void *userdata); |
187 | |
188 | /** Set a callback function that is called whenever a meta/policy |
189 | * control event is received. \since 0.9.15 */ |
190 | void pa_context_set_event_callback(pa_context *p, pa_context_event_cb_t cb, void *userdata); |
191 | |
192 | /** Return the error number of the last failed operation */ |
193 | int pa_context_errno(const pa_context *c); |
194 | |
195 | /** Return non-zero if some data is pending to be written to the connection */ |
196 | int pa_context_is_pending(const pa_context *c); |
197 | |
198 | /** Return the current context status */ |
199 | pa_context_state_t pa_context_get_state(const pa_context *c); |
200 | |
201 | /** Connect the context to the specified server. If server is NULL, |
202 | * connect to the default server. This routine may but will not always |
203 | * return synchronously on error. Use pa_context_set_state_callback() to |
204 | * be notified when the connection is established. If flags doesn't have |
205 | * PA_CONTEXT_NOAUTOSPAWN set and no specific server is specified or |
206 | * accessible a new daemon is spawned. If api is non-NULL, the functions |
207 | * specified in the structure are used when forking a new child |
208 | * process. Returns negative on certain errors such as invalid state |
209 | * or parameters. */ |
210 | int pa_context_connect(pa_context *c, const char *server, pa_context_flags_t flags, const pa_spawn_api *api); |
211 | |
212 | /** Terminate the context connection immediately */ |
213 | void pa_context_disconnect(pa_context *c); |
214 | |
215 | /** Drain the context. If there is nothing to drain, the function returns NULL */ |
216 | pa_operation* pa_context_drain(pa_context *c, pa_context_notify_cb_t cb, void *userdata); |
217 | |
218 | /** Tell the daemon to exit. The returned operation is unlikely to |
219 | * complete successfully, since the daemon probably died before |
220 | * returning a success notification */ |
221 | pa_operation* pa_context_exit_daemon(pa_context *c, pa_context_success_cb_t cb, void *userdata); |
222 | |
223 | /** Set the name of the default sink. */ |
224 | pa_operation* pa_context_set_default_sink(pa_context *c, const char *name, pa_context_success_cb_t cb, void *userdata); |
225 | |
226 | /** Set the name of the default source. */ |
227 | pa_operation* pa_context_set_default_source(pa_context *c, const char *name, pa_context_success_cb_t cb, void *userdata); |
228 | |
229 | /** Returns 1 when the connection is to a local daemon. Returns negative when no connection has been made yet. */ |
230 | int pa_context_is_local(const pa_context *c); |
231 | |
232 | /** Set a different application name for context on the server. */ |
233 | pa_operation* pa_context_set_name(pa_context *c, const char *name, pa_context_success_cb_t cb, void *userdata); |
234 | |
235 | /** Return the server name this context is connected to. */ |
236 | const char* pa_context_get_server(const pa_context *c); |
237 | |
238 | /** Return the protocol version of the library. */ |
239 | uint32_t pa_context_get_protocol_version(const pa_context *c); |
240 | |
241 | /** Return the protocol version of the connected server. |
242 | * Returns PA_INVALID_INDEX on error. */ |
243 | uint32_t pa_context_get_server_protocol_version(const pa_context *c); |
244 | |
245 | /** Update the property list of the client, adding new entries. Please |
246 | * note that it is highly recommended to set as many properties |
247 | * initially via pa_context_new_with_proplist() as possible instead a |
248 | * posteriori with this function, since that information may then be |
249 | * used to route streams of the client to the right device. \since 0.9.11 */ |
250 | pa_operation *pa_context_proplist_update(pa_context *c, pa_update_mode_t mode, const pa_proplist *p, pa_context_success_cb_t cb, void *userdata); |
251 | |
252 | /** Update the property list of the client, remove entries. \since 0.9.11 */ |
253 | pa_operation *pa_context_proplist_remove(pa_context *c, const char *const keys[], pa_context_success_cb_t cb, void *userdata); |
254 | |
255 | /** Return the client index this context is |
256 | * identified in the server with. This is useful for usage with the |
257 | * introspection functions, such as pa_context_get_client_info(). |
258 | * Returns PA_INVALID_INDEX on error. \since 0.9.11 */ |
259 | uint32_t pa_context_get_index(const pa_context *s); |
260 | |
261 | /** Create a new timer event source for the specified time (wrapper |
262 | * for mainloop->time_new). \since 0.9.16 */ |
263 | pa_time_event* pa_context_rttime_new(const pa_context *c, pa_usec_t usec, pa_time_event_cb_t cb, void *userdata); |
264 | |
265 | /** Restart a running or expired timer event source (wrapper for |
266 | * mainloop->time_restart). \since 0.9.16 */ |
267 | void pa_context_rttime_restart(const pa_context *c, pa_time_event *e, pa_usec_t usec); |
268 | |
269 | /** Return the optimal block size for passing around audio buffers. It |
270 | * is recommended to allocate buffers of the size returned here when |
271 | * writing audio data to playback streams, if the latency constraints |
272 | * permit this. It is not recommended writing larger blocks than this |
273 | * because usually they will then be split up internally into chunks |
274 | * of this size. It is not recommended writing smaller blocks than |
275 | * this (unless required due to latency demands) because this |
276 | * increases CPU usage. If ss is NULL you will be returned the |
277 | * byte-exact tile size. if ss is invalid, (size_t) -1 will be |
278 | * returned. If you pass a valid ss, then the tile size |
279 | * will be rounded down to multiple of the frame size. This is |
280 | * supposed to be used in a construct such as |
281 | * pa_context_get_tile_size(pa_stream_get_context(s), |
282 | * pa_stream_get_sample_spec(ss)); \since 0.9.20 */ |
283 | size_t pa_context_get_tile_size(const pa_context *c, const pa_sample_spec *ss); |
284 | |
285 | /** Load the authentication cookie from a file. This function is primarily |
286 | * meant for PulseAudio's own tunnel modules, which need to load the cookie |
287 | * from a custom location. Applications don't usually need to care about the |
288 | * cookie at all, but if it happens that you know what the authentication |
289 | * cookie is and your application needs to load it from a non-standard |
290 | * location, feel free to use this function. \since 5.0 */ |
291 | int pa_context_load_cookie_from_file(pa_context *c, const char *cookie_file_path); |
292 | |
293 | PA_C_DECL_END |
294 | |
295 | #endif |
296 | |