]> code.delx.au - pulseaudio/blob - src/pulse/internal.h
dbusiface-stream: Implement about a half of the Stream D-Bus interface.
[pulseaudio] / src / pulse / internal.h
1 #ifndef foointernalhfoo
2 #define foointernalhfoo
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, write to the Free Software
22 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
23 USA.
24 ***/
25
26 #include <pulse/mainloop-api.h>
27 #include <pulse/context.h>
28 #include <pulse/stream.h>
29 #include <pulse/operation.h>
30 #include <pulse/subscribe.h>
31 #include <pulse/ext-stream-restore.h>
32
33 #include <pulsecore/socket-client.h>
34 #include <pulsecore/pstream.h>
35 #include <pulsecore/pdispatch.h>
36 #include <pulsecore/dynarray.h>
37 #include <pulsecore/llist.h>
38 #include <pulsecore/native-common.h>
39 #include <pulsecore/strlist.h>
40 #include <pulsecore/mcalign.h>
41 #include <pulsecore/memblockq.h>
42 #include <pulsecore/hashmap.h>
43 #include <pulsecore/refcnt.h>
44 #include <pulsecore/time-smoother.h>
45 #ifdef HAVE_DBUS
46 #include <pulsecore/dbus-util.h>
47 #endif
48
49 #include "client-conf.h"
50
51 #define DEFAULT_TIMEOUT (30)
52
53 struct pa_context {
54 PA_REFCNT_DECLARE;
55
56 #ifdef HAVE_DBUS
57 pa_dbus_wrap_connection *system_bus;
58 pa_dbus_wrap_connection *session_bus;
59 #endif
60
61 pa_proplist *proplist;
62 pa_mainloop_api* mainloop;
63
64 pa_socket_client *client;
65 pa_pstream *pstream;
66 pa_pdispatch *pdispatch;
67
68 pa_dynarray *record_streams, *playback_streams;
69 PA_LLIST_HEAD(pa_stream, streams);
70 PA_LLIST_HEAD(pa_operation, operations);
71
72 uint32_t version;
73 uint32_t ctag;
74 uint32_t csyncid;
75 int error;
76 pa_context_state_t state;
77
78 pa_context_notify_cb_t state_callback;
79 void *state_userdata;
80 pa_context_subscribe_cb_t subscribe_callback;
81 void *subscribe_userdata;
82 pa_context_event_cb_t event_callback;
83 void *event_userdata;
84
85 pa_mempool *mempool;
86
87 pa_bool_t is_local:1;
88 pa_bool_t do_shm:1;
89 pa_bool_t server_specified:1;
90 pa_bool_t no_fail:1;
91 pa_bool_t do_autospawn:1;
92 pa_bool_t use_rtclock:1;
93 pa_spawn_api spawn_api;
94
95 pa_strlist *server_list;
96
97 char *server;
98
99 pa_client_conf *conf;
100
101 uint32_t client_index;
102
103 /* Extension specific data */
104 struct {
105 pa_ext_stream_restore_subscribe_cb_t callback;
106 void *userdata;
107 } ext_stream_restore;
108 };
109
110 #define PA_MAX_WRITE_INDEX_CORRECTIONS 32
111
112 typedef struct pa_index_correction {
113 uint32_t tag;
114 int64_t value;
115 pa_bool_t valid:1;
116 pa_bool_t absolute:1;
117 pa_bool_t corrupt:1;
118 } pa_index_correction;
119
120 struct pa_stream {
121 PA_REFCNT_DECLARE;
122 PA_LLIST_FIELDS(pa_stream);
123
124 pa_context *context;
125 pa_mainloop_api *mainloop;
126
127 uint32_t direct_on_input;
128
129 pa_stream_direction_t direction;
130 pa_stream_state_t state;
131 pa_stream_flags_t flags;
132
133 pa_sample_spec sample_spec;
134 pa_channel_map channel_map;
135
136 pa_proplist *proplist;
137
138 pa_bool_t channel_valid:1;
139 pa_bool_t suspended:1;
140 pa_bool_t corked:1;
141 pa_bool_t timing_info_valid:1;
142 pa_bool_t auto_timing_update_requested:1;
143
144 uint32_t channel;
145 uint32_t syncid;
146 uint32_t stream_index;
147
148 int64_t requested_bytes;
149 pa_buffer_attr buffer_attr;
150
151 uint32_t device_index;
152 char *device_name;
153
154 pa_memchunk peek_memchunk;
155 void *peek_data;
156 pa_memblockq *record_memblockq;
157
158 /* Store latest latency info */
159 pa_timing_info timing_info;
160
161 /* Use to make sure that time advances monotonically */
162 pa_usec_t previous_time;
163
164 /* time updates with tags older than these are invalid */
165 uint32_t write_index_not_before;
166 uint32_t read_index_not_before;
167
168 /* Data about individual timing update corrections */
169 pa_index_correction write_index_corrections[PA_MAX_WRITE_INDEX_CORRECTIONS];
170 int current_write_index_correction;
171
172 /* Latency interpolation stuff */
173 pa_time_event *auto_timing_update_event;
174 pa_usec_t auto_timing_interval_usec;
175
176 pa_smoother *smoother;
177
178 /* Callbacks */
179 pa_stream_notify_cb_t state_callback;
180 void *state_userdata;
181 pa_stream_request_cb_t read_callback;
182 void *read_userdata;
183 pa_stream_request_cb_t write_callback;
184 void *write_userdata;
185 pa_stream_notify_cb_t overflow_callback;
186 void *overflow_userdata;
187 pa_stream_notify_cb_t underflow_callback;
188 void *underflow_userdata;
189 pa_stream_notify_cb_t latency_update_callback;
190 void *latency_update_userdata;
191 pa_stream_notify_cb_t moved_callback;
192 void *moved_userdata;
193 pa_stream_notify_cb_t suspended_callback;
194 void *suspended_userdata;
195 pa_stream_notify_cb_t started_callback;
196 void *started_userdata;
197 pa_stream_event_cb_t event_callback;
198 void *event_userdata;
199 pa_stream_notify_cb_t buffer_attr_callback;
200 void *buffer_attr_userdata;
201 };
202
203 typedef void (*pa_operation_cb_t)(void);
204
205 struct pa_operation {
206 PA_REFCNT_DECLARE;
207
208 pa_context *context;
209 pa_stream *stream;
210
211 PA_LLIST_FIELDS(pa_operation);
212
213 pa_operation_state_t state;
214 void *userdata;
215 pa_operation_cb_t callback;
216
217 void *private; /* some operations might need this */
218 };
219
220 void pa_command_request(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
221 void pa_command_stream_killed(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
222 void pa_command_subscribe_event(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
223 void pa_command_overflow_or_underflow(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
224 void pa_command_stream_suspended(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
225 void pa_command_stream_moved(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
226 void pa_command_stream_started(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
227 void pa_command_stream_event(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
228 void pa_command_client_event(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
229 void pa_command_stream_buffer_attr(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
230
231 pa_operation *pa_operation_new(pa_context *c, pa_stream *s, pa_operation_cb_t callback, void *userdata);
232 void pa_operation_done(pa_operation *o);
233
234 void pa_create_stream_callback(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
235 void pa_stream_disconnect_callback(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
236 void pa_context_simple_ack_callback(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
237 void pa_stream_simple_ack_callback(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
238
239 void pa_context_fail(pa_context *c, int error);
240 int pa_context_set_error(pa_context *c, int error);
241 void pa_context_set_state(pa_context *c, pa_context_state_t st);
242 int pa_context_handle_error(pa_context *c, uint32_t command, pa_tagstruct *t, pa_bool_t fail);
243 pa_operation* pa_context_send_simple_command(pa_context *c, uint32_t command, void (*internal_callback)(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata), void (*cb)(void), void *userdata);
244
245 void pa_stream_set_state(pa_stream *s, pa_stream_state_t st);
246
247 pa_tagstruct *pa_tagstruct_command(pa_context *c, uint32_t command, uint32_t *tag);
248
249 #define PA_CHECK_VALIDITY(context, expression, error) \
250 do { \
251 if (!(expression)) \
252 return -pa_context_set_error((context), (error)); \
253 } while(FALSE)
254
255
256 #define PA_CHECK_VALIDITY_RETURN_ANY(context, expression, error, value) \
257 do { \
258 if (!(expression)) { \
259 pa_context_set_error((context), (error)); \
260 return value; \
261 } \
262 } while(FALSE)
263
264 #define PA_CHECK_VALIDITY_RETURN_NULL(context, expression, error) \
265 PA_CHECK_VALIDITY_RETURN_ANY(context, expression, error, NULL)
266
267 #define PA_FAIL(context, error) \
268 do { \
269 return -pa_context_set_error((context), (error)); \
270 } while(FALSE)
271
272 #define PA_FAIL_RETURN_ANY(context, error, value) \
273 do { \
274 pa_context_set_error((context), (error)); \
275 return value; \
276 } while(FALSE)
277
278 #define PA_FAIL_RETURN_NULL(context, error) \
279 PA_FAIL_RETURN_ANY(context, error, NULL)
280
281 void pa_ext_stream_restore_command(pa_context *c, uint32_t tag, pa_tagstruct *t);
282
283 pa_bool_t pa_mainloop_is_our_api(pa_mainloop_api*m);
284
285 #endif